ETH Price: $3,454.17 (-1.91%)
Gas: 4 Gwei

Token

Army (ARMY)
 

Overview

Max Total Supply

1,000,000 ARMY

Holders

85

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000000313456 ARMY

Value
$0.00
0xaf8d5409a0fb7bd353f75354d025eceac930024f
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:
Army

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

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

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

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

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);
    function balanceOf(address owner) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);
    function transfer(address to, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);
    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 (uint256);
    function price1CumulativeLast() external view returns (uint256);
    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);
    function burn(address to) external returns (uint256 amount0, uint256 amount1);
    function swap(uint256 amount0Out, uint256 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, uint256);

    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(uint256) external view returns (address pair);
    function allPairsLength() external view returns (uint256);

    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,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);
    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

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

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

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

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

// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

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

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

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

// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

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

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

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

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * 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 returns (string memory) {
        return _name;
    }

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

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

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

    /**
     * @dev Internal totalSupply helper (to save gas fees in update function override)
     */
    function _totalSupplyHelper() internal view virtual returns (uint256) {
        return _totalSupply;
    }

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

    /**
     * @dev Internal pool balanceOf helper (to save gas fees in update function override)
     */
    function _poolBalanceHelper() internal view virtual returns (uint256) {
        return _balances[address(this)];
    }

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

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

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

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

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

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

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

        emit Transfer(from, to, value);
    }

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

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

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

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

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

// EVENTS

event BuyFeesEnabled();
event BuyFeesDisabled();
event SellFeesEnabled();
event AutoSwapEnabled();
event SellFeesDisabled();
event AutoSwapDisabled();
event TradingFeesEnabled();
event TradingFeesDisabled();
event PairSet(address pair);
event AutoSwap(uint256 balance);
event IncludedInFee(address wallet);
event ExcludedFromFee(address wallet);
event MinSwapFeesSet(uint256 thousandth);
event BuyFeePercentageSet(uint256 percentage);
event SellFeePercentageSet(uint256 percentage);
event Withdraw(address owner, uint256 balance);

// ERRORS

error ExceedsFeesPercentageLimit();

/*
      ______   _______   __       __  __      __ 
     /      \ |       \ |  \     /  \|  \    /  \
    |  $$$$$$\| $$$$$$$\| $$\   /  $$ \$$\  /  $$
    | $$__| $$| $$__| $$| $$$\ /  $$$  \$$\/  $$ 
    | $$    $$| $$    $$| $$$$\  $$$$   \$$  $$  
    | $$$$$$$$| $$$$$$$\| $$\$$ $$ $$    \$$$$   
    | $$  | $$| $$  | $$| $$ \$$$| $$    | $$    
    | $$  | $$| $$  | $$| $$  \$ | $$    | $$    
     \$$   \$$ \$$   \$$ \$$      \$$     \$$    
                                                           
*/

/// @title Army
/// @author mazzaca$h (https://www.linkedin.com/in/mazzacash/) 
/// @notice ERC20 Token with fees mechanism and autoswap on sell operations when traded on DEXs V2 pools. 
contract Army is ERC20, Ownable {
    /* INITIALIZATION */

    constructor() ERC20("Army", "ARMY") Ownable(msg.sender) { 

        // Exclude owner and contract from fees mechanism
        _excludedFromFee[msg.sender] = true;
        _excludedFromFee[address(this)] = true;      

        // Mint all the supply to the owner
        _mint(msg.sender, 1_000_000 ether);

        // Set Uniswap V2 Router and create the ARMY/ETH pair
        UNISWAP_V2_ROUTER = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        UNISWAP_V2_PAIR = IUniswapV2Factory(UNISWAP_V2_ROUTER.factory()).createPair(address(this), UNISWAP_V2_ROUTER.WETH());
               
        // Emitting events
        emit PairSet(UNISWAP_V2_PAIR);  
        emit ExcludedFromFee(msg.sender);        
        emit ExcludedFromFee(address(this));        
    }

    /* VARIABLES */

    uint256 private _buyFeePercentage = 30;
    uint256 private _sellFeePercentage = 10;
    uint256 private _minSwapFeesThousandth = 1;

    uint256 private _buyFeesEnabled = TRUE;
    uint256 private _sellFeesEnabled = TRUE;
    uint256 private _autoSwapEnabled = FALSE;
    uint256 private _tradingFeesEnabled = TRUE;         

    uint256 private constant TRUE = 1;
    uint256 private constant FALSE = 0;
    uint256 private constant PERCENTAGE_UNIT = 100;
    uint256 private constant THOUSANDTH_UNIT = 1000;
    uint256 private constant BUY_FEE_PERCENTAGE_LIMIT = 40;
    uint256 private constant SELL_FEE_PERCENTAGE_LIMIT = 40;

    address private immutable UNISWAP_V2_PAIR;  
    IUniswapV2Router02 private immutable UNISWAP_V2_ROUTER;     

    /* MAPPINGS */
 
    mapping(address => bool) private _excludedFromFee;

    /* GETTERS */

    function isBuyFeesEnabled() public view returns (bool) {
        return _buyFeesEnabled == FALSE ? false : true;
    }

    function isSellFeesEnabled() public view returns (bool) {
        return _sellFeesEnabled == FALSE ? false : true;
    }

    function isAutoSwapEnabled() public view returns (bool) {
        return _autoSwapEnabled == FALSE ? false : true;
    }

    function isTradingFeesEnabled() public view returns (bool) {
        return _tradingFeesEnabled == FALSE ? false : true;
    }

    function getBuyFeePercentage() public view returns (uint256) {
        return _buyFeePercentage;
    }

    function getSellFeePercentage() public view returns (uint256) {
        return _sellFeePercentage;
    }    

    function getMinSwapFeesThousandth() public view returns (uint256) {
        return _minSwapFeesThousandth;
    }

    function isExcludedFromFee(address wallet) public view returns (bool) {
        return _excludedFromFee[wallet];
    }    

    /* SETTERS */

    /**
     * @dev Autoswap native tokens in the pool.
     *
     * Emits a {AutoSwap} event.
     */
    function swapFees() external onlyOwner {
        _swapFees();
    }

    /**
     * @dev Withdraw native tokens from the pool.
     *
     * Emits a {Withdraw} event.
     */
    function withdraw() external onlyOwner {
        uint balance = balanceOf(address(this));
        super._update(address(this), msg.sender, balance);
        emit Withdraw(msg.sender, balance);
    }

    /**
     * @dev Enable buy fees mechanism.
     *
     * Emits a {TradingFeesEnabled} event.
     */
    function enableTrading() external onlyOwner {
        _tradingFeesEnabled = TRUE;
        emit TradingFeesEnabled();
    }

    /**
     * @dev Disable buy fees mechanism.
     *
     * Emits a {TradingFeesDisabled} event.
     */
    function disableTrading() external onlyOwner {
        _tradingFeesEnabled = FALSE;
        emit TradingFeesDisabled();
    }

    /**
     * @dev Enable buy fees mechanism.
     *
     * Emits a {AutoSwapEnabled} event.
     */
    function enableAutoSwap() external onlyOwner {
        _autoSwapEnabled = TRUE;
        emit AutoSwapEnabled();
    }

    /**
     * @dev Disable buy fees mechanism.
     *
     * Emits a {AutoSwapDisabled} event.
     */
    function disableAutoSwap() external onlyOwner {
        _autoSwapEnabled = FALSE;
        emit AutoSwapDisabled();
    }

    /**
     * @dev Enable buy fees mechanism.
     *
     * Emits a {BuyFeesEnabled} event.
     */
    function enableBuyFees() external onlyOwner {
        _buyFeesEnabled = TRUE;
        emit BuyFeesEnabled();
    }

    /**
     * @dev Disable buy fees mechanism.
     *
     * Emits a {BuyFeesDisabled} event.
     */
    function disableBuyFees() external onlyOwner {
        _buyFeesEnabled = FALSE;
        emit BuyFeesDisabled();
    }

    /**
     * @dev Enable buy fees mechanism.
     *
     * Emits a {SellFeesEnabled} event.
     */
    function enableSellFees() external onlyOwner {
        _sellFeesEnabled = TRUE;
        emit SellFeesEnabled();
    }

    /**
     * @dev Disable buy fees mechanism.
     *
     * Emits a {SellFeesDisabled} event.
     */
    function disableSellFees() external onlyOwner {
        _sellFeesEnabled = FALSE;
        emit SellFeesDisabled();
    }

    /**
     * @dev Include wallet in fees mechanism.
     *
     * Emits a {IncludedInFee} event.
     */
    function includeInFee(address wallet) external onlyOwner {
        _excludedFromFee[wallet] = false;
        emit IncludedInFee(wallet);
    }

    /**
     * @dev Exclude wallet from fees mechanism.
     *
     * Emits a {ExcludedFromFee} event.
     */
    function excludeFromFee(address wallet) external onlyOwner {
        _excludedFromFee[wallet] = true;
        emit ExcludedFromFee(wallet);
    }

    /**
     * @dev Set buy fee percentage for the fees mechanism.
     *
     * Emits a {BuyFeePercentageSet} event.
     */
    function setBuyFeePercentage(uint256 percentage) external onlyOwner {
        if (percentage > BUY_FEE_PERCENTAGE_LIMIT) {
            revert ExceedsFeesPercentageLimit();
        }
        _buyFeePercentage = percentage;
        emit BuyFeePercentageSet(percentage);
    }

    /**
     * @dev Set sell fee percentage for the fees mechanism.
     *
     * Emits a {SellFeePercentageSet} event.
     */
    function setSellFeePercentage(uint256 percentage) external onlyOwner {
        if (percentage > SELL_FEE_PERCENTAGE_LIMIT) {
            revert ExceedsFeesPercentageLimit();
        }
        _sellFeePercentage = percentage;
        emit SellFeePercentageSet(percentage);
    }

    /**
     * @dev Set min swap fees thousandt for autoswap condition on DEX sell operations.
     *
     * Emits a {MinSwapFeesSet} event.
     */
    function setMinSwapFeesThousandt(uint256 thousandth) external onlyOwner {
        _minSwapFeesThousandth = thousandth;
        emit MinSwapFeesSet(thousandth);
    }

    /* OVERRIDES */

    function _update(address from, address to, uint256 value)
        internal
        override(ERC20)
    {
        if(_tradingFeesEnabled == TRUE){
            uint _leaveFee;       
            if (_excludedFromFee[from] || _excludedFromFee[to]) {
                _leaveFee = TRUE;
            } 
            if(_leaveFee == FALSE) {
                if (from == UNISWAP_V2_PAIR) {
                    if(_buyFeesEnabled == TRUE) {
                        uint256 buyFees = value * _buyFeePercentage / PERCENTAGE_UNIT;
                        value -= buyFees;                
                        super._update(from, address(this), buyFees);  
                    }
                } else if (to == UNISWAP_V2_PAIR) {
                    if(_sellFeesEnabled == TRUE) {
                        uint256 sellFees = value * _sellFeePercentage / PERCENTAGE_UNIT;
                        value -= sellFees;                
                        super._update(from, address(this), sellFees);
                        // autoswap if the minimum base on total supply is less than the pool balance 
                        if (_autoSwapEnabled == TRUE && _totalSupplyHelper() * _minSwapFeesThousandth / THOUSANDTH_UNIT < _poolBalanceHelper()) _swapFees();
                    }
                }              
            }
        }
        super._update(from, to, value);
    }

    /* HELPERS */

    /**
     * @dev Autoswap private helper.
     */
    function _swapFees() private {
        uint256 balance = _poolBalanceHelper();
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = UNISWAP_V2_ROUTER.WETH();
        _approve(address(this), address(UNISWAP_V2_ROUTER), balance);
        // supporting fee on transfer tokens in case accidentally address(this) will be included in fee mechanism
        UNISWAP_V2_ROUTER.swapExactTokensForETHSupportingFeeOnTransferTokens(balance, 0, path, owner(), block.timestamp);
        emit AutoSwap(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"ExceedsFeesPercentageLimit","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"AutoSwap","type":"event"},{"anonymous":false,"inputs":[],"name":"AutoSwapDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"AutoSwapEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"BuyFeePercentageSet","type":"event"},{"anonymous":false,"inputs":[],"name":"BuyFeesDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"BuyFeesEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"ExcludedFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"IncludedInFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"thousandth","type":"uint256"}],"name":"MinSwapFeesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"}],"name":"PairSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"SellFeePercentageSet","type":"event"},{"anonymous":false,"inputs":[],"name":"SellFeesDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"SellFeesEnabled","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingFeesDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingFeesEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableAutoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAutoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBuyFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinSwapFeesThousandth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isAutoSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBuyFeesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSellFeesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingFeesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"setBuyFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"thousandth","type":"uint256"}],"name":"setMinSwapFeesThousandt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"setSellFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052601e600655600a600755600160085560016009556001600a555f600b556001600c5534801562000032575f80fd5b50336040518060400160405280600481526020016341726d7960e01b8152506040518060400160405280600481526020016341524d5960e01b81525081600390816200007f9190620009ba565b5060046200008e8282620009ba565b5050506001600160a01b038116620000c057604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b620000cb816200031d565b50335f818152600d60205260408082208054600160ff1991821681179092553084529190922080549091169091179055620001119069d3c21bcecceda10000006200036e565b737a250d5630b4cf539739df2c5dacb4c659f2488d60a08190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000165573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200018b919062000a86565b6001600160a01b031663c9c653963060a0516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001ff919062000a86565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156200024a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000270919062000a86565b6001600160a01b031660808190526040519081527fc4a4ea6abc08bd7f8df3db8a1c998f19b3e0c348176f93732cd54db1a4b501369060200160405180910390a16040513381527ff1d6512ec7550bf605a5a38910e48fb6a57938ed74a5afa01753fa023001005c9060200160405180910390a16040513081527ff1d6512ec7550bf605a5a38910e48fb6a57938ed74a5afa01753fa023001005c9060200160405180910390a162000bbc565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216620003995760405163ec442f0560e01b81525f6004820152602401620000b7565b620003a65f8383620003aa565b5050565b6001600c54036200052d576001600160a01b0383165f908152600d602052604081205460ff1680620003f357506001600160a01b0383165f908152600d602052604090205460ff165b15620003fd575060015b806200052b576080516001600160a01b0316846001600160a01b0316036200046e5760016009540362000468575f6064600654846200043d919062000ac9565b62000449919062000ae9565b905062000457818462000b09565b9250620004668530836200053f565b505b6200052b565b6080516001600160a01b0316836001600160a01b0316036200052b576001600a54036200052b575f606460075484620004a8919062000ac9565b620004b4919062000ae9565b9050620004c2818462000b09565b9250620004d18530836200053f565b6001600b54148015620005195750305f908152602081905260409020546008546103e890620004ff60025490565b6200050b919062000ac9565b62000517919062000ae9565b105b156200052957620005296200066e565b505b505b6200053a8383836200053f565b505050565b6001600160a01b0383166200056d578060025f82825462000561919062000b1f565b90915550620005df9050565b6001600160a01b0383165f9081526020819052604090205481811015620005c15760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000b7565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216620005fd576002805482900390556200061b565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200066191815260200190565b60405180910390a3505050565b305f9081526020818152604080832054815160028082526060820184529194939092908301908036833701905050905030815f81518110620006b457620006b462000b35565b60200260200101906001600160a01b031690816001600160a01b03168152505060a0516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000713573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000739919062000a86565b816001815181106200074f576200074f62000b35565b60200260200101906001600160a01b031690816001600160a01b031681525050620007843060a051846200083b60201b60201c565b60a0516001600160a01b031663791ac947835f84620007ab6005546001600160a01b031690565b426040518663ffffffff1660e01b8152600401620007ce95949392919062000b49565b5f604051808303815f87803b158015620007e6575f80fd5b505af1158015620007f9573d5f803e3d5ffd5b505050507f0b9272a6fa5f7af042cfa822c6858dfa12cfc1bbd15d2bfa1865a48afd2bd2eb826040516200082f91815260200190565b60405180910390a15050565b6200053a83838360016001600160a01b0384166200086f5760405163e602df0560e01b81525f6004820152602401620000b7565b6001600160a01b0383166200089a57604051634a1406b160e11b81525f6004820152602401620000b7565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156200091757826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516200090e91815260200190565b60405180910390a35b50505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200094657607f821691505b6020821081036200096557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200053a57805f5260205f20601f840160051c81016020851015620009925750805b601f840160051c820191505b81811015620009b3575f81556001016200099e565b5050505050565b81516001600160401b03811115620009d657620009d66200091d565b620009ee81620009e7845462000931565b846200096b565b602080601f83116001811462000a24575f841562000a0c5750858301515b5f19600386901b1c1916600185901b17855562000a7e565b5f85815260208120601f198616915b8281101562000a545788860151825594840194600190910190840162000a33565b508582101562000a7257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121562000a97575f80fd5b81516001600160a01b038116811462000aae575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141762000ae35762000ae362000ab5565b92915050565b5f8262000b0457634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111562000ae35762000ae362000ab5565b8082018082111562000ae35762000ae362000ab5565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b8181101562000b9b5784516001600160a01b03168352938301939183019160010162000b74565b50506001600160a01b03969096166060850152505050608001529392505050565b60805160a05161136b62000bf35f395f8181610c9101528181610d480152610d6f01525f8181610f650152610fe3015261136b5ff3fe608060405234801561000f575f80fd5b5060043610610208575f3560e01c8063720efed21161011f578063bcc178fd116100a9578063ec0e57b311610079578063ec0e57b314610408578063ec2d2cfb14610410578063f0647ad914610418578063f2fde38b14610420578063f63f98a614610433575f80fd5b8063bcc178fd146103a2578063c1fc3d81146103aa578063dd62ed3e146103bd578063ea2f0b37146103f5575f80fd5b80638da5cb5b116100ef5780638da5cb5b1461035c57806395d89b41146103775780639bc7e7e51461037f578063a9059cbb14610387578063b9ccf21d1461039a575f80fd5b8063720efed21461033c5780637e38de8c146103445780637fcbcb2b1461034c5780638a8c523c14610354575f80fd5b8063313ce567116101a05780634b7d9db4116101705780634b7d9db4146102c657806351c9bf21146102ce5780635342acb4146102e157806370a082311461030c578063715018a614610334575f80fd5b8063313ce567146102945780633ccfd60b146102a35780633cda6664146102ab578063437823ec146102b3575f80fd5b806323b872dd116101db57806323b872dd146102695780632aa0d2841461027c5780632bf2b11b146102845780632ed5eb481461028c575f80fd5b806306fdde031461020c578063095ea7b31461022a57806317700f011461024d57806318160ddd14610257575b5f80fd5b610214610446565b60405161022191906110b5565b60405180910390f35b61023d610238366004611115565b6104d6565b6040519015158152602001610221565b6102556104ef565b005b6002545b604051908152602001610221565b61023d61027736600461113f565b610526565b610255610549565b610255610580565b60065461025b565b60405160128152602001610221565b6102556105b7565b610255610617565b6102556102c136600461117d565b61064e565b61023d6106a9565b6102556102dc36600461119f565b6106be565b61023d6102ef36600461117d565b6001600160a01b03165f908152600d602052604090205460ff1690565b61025b61031a36600461117d565b6001600160a01b03165f9081526020819052604090205490565b6102556106fb565b61025561070e565b61023d610745565b60085461025b565b610255610755565b6005546040516001600160a01b039091168152602001610221565b61021461078c565b61023d61079b565b61023d610395366004611115565b6107ab565b6102556107b8565b6102556107c8565b6102556103b836600461119f565b6107ff565b61025b6103cb3660046111b6565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61025561040336600461117d565b61085e565b6102556108b6565b61023d6108ed565b60075461025b565b61025561042e36600461117d565b6108fd565b61025561044136600461119f565b61093f565b606060038054610455906111ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610481906111ed565b80156104cc5780601f106104a3576101008083540402835291602001916104cc565b820191905f5260205f20905b8154815290600101906020018083116104af57829003601f168201915b5050505050905090565b5f336104e381858561099e565b60019150505b92915050565b6104f76109b0565b5f600c8190556040517f434f0aa4653c997131635fa5929804897a06a3317bfcd7d7a2e20877cf6402df9190a1565b5f336105338582856109dd565b61053e858585610a58565b506001949350505050565b6105516109b0565b6001600b556040517f975959080a598cbf303a0ae4d1a8e354a831047705eb5e2d7095358cee8ae86a905f90a1565b6105886109b0565b60016009556040517fe23bf018125fe2a90c8a418fce100cc4b743cad824a8050a6690c21fec33749b905f90a1565b6105bf6109b0565b305f81815260208190526040902054906105da903383610ab5565b60408051338152602081018390527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436491015b60405180910390a150565b61061f6109b0565b5f60098190556040517f6f021b72ca35c5eb49fd9ef0f6ebb61cdc6966feb899becc38fbd2112bfef59a9190a1565b6106566109b0565b6001600160a01b0381165f818152600d6020908152604091829020805460ff1916600117905590519182527ff1d6512ec7550bf605a5a38910e48fb6a57938ed74a5afa01753fa023001005c910161060c565b5f80600b54146106b95750600190565b505f90565b6106c66109b0565b60088190556040518181527fa3d5cabc8bb89279221a26f7b5a96b34a3ff044c9d1f4a6979a5baea9649226b9060200161060c565b6107036109b0565b61070c5f610bdb565b565b6107166109b0565b5f600a8190556040517f49a1299d149bc1f96ce10cdb73bb4c0c97d93cff7c006006c88e72e338c2e67b9190a1565b5f80600c54146106b95750600190565b61075d6109b0565b6001600c556040517fb0fdeecd460356047c18a543d4e55ca92d44d215b3833f68e018c819c0e79362905f90a1565b606060048054610455906111ed565b5f80600954146106b95750600190565b5f336104e3818585610a58565b6107c06109b0565b61070c610c2c565b6107d06109b0565b6001600a556040517ff3c6010bde2769047195ad37e23d6422bcc0b9e1998f77ac67cbccc02f351a68905f90a1565b6108076109b0565b602881111561082957604051632fe9d03b60e01b815260040160405180910390fd5b60068190556040518181527fc9dde118606c79c4f4b2e1f8784eba7732e839bae809066fcb41904f3493b04c9060200161060c565b6108666109b0565b6001600160a01b0381165f818152600d6020908152604091829020805460ff1916905590519182527f78ce087db51d01d3e32355f2d83455d5a39f99194c8d3d1c2614893695cee442910161060c565b6108be6109b0565b5f600b8190556040517f78a578bf1760fa628f1f8b0e438937f23c63896ef1c7a4e313ad790fd5193add9190a1565b5f80600a54146106b95750600190565b6109056109b0565b6001600160a01b03811661093357604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61093c81610bdb565b50565b6109476109b0565b602881111561096957604051632fe9d03b60e01b815260040160405180910390fd5b60078190556040518181527f81fe2a33a4138cb005e3d7850d19b4342ff47447fb3179ecccf9b350da0b70239060200161060c565b6109ab8383836001610e3c565b505050565b6005546001600160a01b0316331461070c5760405163118cdaa760e01b815233600482015260240161092a565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610a525781811015610a4457604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161092a565b610a5284848484035f610e3c565b50505050565b6001600160a01b038316610a8157604051634b637e8f60e11b81525f600482015260240161092a565b6001600160a01b038216610aaa5760405163ec442f0560e01b81525f600482015260240161092a565b6109ab838383610f0e565b6001600160a01b038316610adf578060025f828254610ad49190611239565b90915550610b4f9050565b6001600160a01b0383165f9081526020819052604090205481811015610b315760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161092a565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610b6b57600280548290039055610b89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610bce91815260200190565b60405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b305f9081526020818152604080832054815160028082526060820184529194939092908301908036833701905050905030815f81518110610c6f57610c6f61124c565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ceb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0f9190611260565b81600181518110610d2257610d2261124c565b60200260200101906001600160a01b031690816001600160a01b031681525050610d6d307f00000000000000000000000000000000000000000000000000000000000000008461099e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663791ac947835f84610db16005546001600160a01b031690565b426040518663ffffffff1660e01b8152600401610dd295949392919061127b565b5f604051808303815f87803b158015610de9575f80fd5b505af1158015610dfb573d5f803e3d5ffd5b505050507f0b9272a6fa5f7af042cfa822c6858dfa12cfc1bbd15d2bfa1865a48afd2bd2eb82604051610e3091815260200190565b60405180910390a15050565b6001600160a01b038416610e655760405163e602df0560e01b81525f600482015260240161092a565b6001600160a01b038316610e8e57604051634a1406b160e11b81525f600482015260240161092a565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610a5257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610f0091815260200190565b60405180910390a350505050565b6001600c54036110aa576001600160a01b0383165f908152600d602052604081205460ff1680610f5557506001600160a01b0383165f908152600d602052604090205460ff165b15610f5e575060015b806110a8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603610fe157600160095403610fdc575f606460065484610fb791906112ec565b610fc19190611303565b9050610fcd8184611322565b9250610fda853083610ab5565b505b6110a8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036110a8576001600a54036110a8575f60646007548461103591906112ec565b61103f9190611303565b905061104b8184611322565b9250611058853083610ab5565b6001600b541480156110995750305f908152602081905260409020546103e860085461108360025490565b61108d91906112ec565b6110979190611303565b105b156110a6576110a6610c2c565b505b505b6109ab838383610ab5565b5f602080835283518060208501525f5b818110156110e1578581018301518582016040015282016110c5565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461093c575f80fd5b5f8060408385031215611126575f80fd5b823561113181611101565b946020939093013593505050565b5f805f60608486031215611151575f80fd5b833561115c81611101565b9250602084013561116c81611101565b929592945050506040919091013590565b5f6020828403121561118d575f80fd5b813561119881611101565b9392505050565b5f602082840312156111af575f80fd5b5035919050565b5f80604083850312156111c7575f80fd5b82356111d281611101565b915060208301356111e281611101565b809150509250929050565b600181811c9082168061120157607f821691505b60208210810361121f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156104e9576104e9611225565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611270575f80fd5b815161119881611101565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156112cb5784516001600160a01b0316835293830193918301916001016112a6565b50506001600160a01b03969096166060850152505050608001529392505050565b80820281158282048414176104e9576104e9611225565b5f8261131d57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156104e9576104e961122556fea26469706673582212202cfe4637207990425e2e22aaadaeef75bf0c746341217cab5aed5c72f23aee5b64736f6c63430008180033

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610208575f3560e01c8063720efed21161011f578063bcc178fd116100a9578063ec0e57b311610079578063ec0e57b314610408578063ec2d2cfb14610410578063f0647ad914610418578063f2fde38b14610420578063f63f98a614610433575f80fd5b8063bcc178fd146103a2578063c1fc3d81146103aa578063dd62ed3e146103bd578063ea2f0b37146103f5575f80fd5b80638da5cb5b116100ef5780638da5cb5b1461035c57806395d89b41146103775780639bc7e7e51461037f578063a9059cbb14610387578063b9ccf21d1461039a575f80fd5b8063720efed21461033c5780637e38de8c146103445780637fcbcb2b1461034c5780638a8c523c14610354575f80fd5b8063313ce567116101a05780634b7d9db4116101705780634b7d9db4146102c657806351c9bf21146102ce5780635342acb4146102e157806370a082311461030c578063715018a614610334575f80fd5b8063313ce567146102945780633ccfd60b146102a35780633cda6664146102ab578063437823ec146102b3575f80fd5b806323b872dd116101db57806323b872dd146102695780632aa0d2841461027c5780632bf2b11b146102845780632ed5eb481461028c575f80fd5b806306fdde031461020c578063095ea7b31461022a57806317700f011461024d57806318160ddd14610257575b5f80fd5b610214610446565b60405161022191906110b5565b60405180910390f35b61023d610238366004611115565b6104d6565b6040519015158152602001610221565b6102556104ef565b005b6002545b604051908152602001610221565b61023d61027736600461113f565b610526565b610255610549565b610255610580565b60065461025b565b60405160128152602001610221565b6102556105b7565b610255610617565b6102556102c136600461117d565b61064e565b61023d6106a9565b6102556102dc36600461119f565b6106be565b61023d6102ef36600461117d565b6001600160a01b03165f908152600d602052604090205460ff1690565b61025b61031a36600461117d565b6001600160a01b03165f9081526020819052604090205490565b6102556106fb565b61025561070e565b61023d610745565b60085461025b565b610255610755565b6005546040516001600160a01b039091168152602001610221565b61021461078c565b61023d61079b565b61023d610395366004611115565b6107ab565b6102556107b8565b6102556107c8565b6102556103b836600461119f565b6107ff565b61025b6103cb3660046111b6565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61025561040336600461117d565b61085e565b6102556108b6565b61023d6108ed565b60075461025b565b61025561042e36600461117d565b6108fd565b61025561044136600461119f565b61093f565b606060038054610455906111ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610481906111ed565b80156104cc5780601f106104a3576101008083540402835291602001916104cc565b820191905f5260205f20905b8154815290600101906020018083116104af57829003601f168201915b5050505050905090565b5f336104e381858561099e565b60019150505b92915050565b6104f76109b0565b5f600c8190556040517f434f0aa4653c997131635fa5929804897a06a3317bfcd7d7a2e20877cf6402df9190a1565b5f336105338582856109dd565b61053e858585610a58565b506001949350505050565b6105516109b0565b6001600b556040517f975959080a598cbf303a0ae4d1a8e354a831047705eb5e2d7095358cee8ae86a905f90a1565b6105886109b0565b60016009556040517fe23bf018125fe2a90c8a418fce100cc4b743cad824a8050a6690c21fec33749b905f90a1565b6105bf6109b0565b305f81815260208190526040902054906105da903383610ab5565b60408051338152602081018390527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436491015b60405180910390a150565b61061f6109b0565b5f60098190556040517f6f021b72ca35c5eb49fd9ef0f6ebb61cdc6966feb899becc38fbd2112bfef59a9190a1565b6106566109b0565b6001600160a01b0381165f818152600d6020908152604091829020805460ff1916600117905590519182527ff1d6512ec7550bf605a5a38910e48fb6a57938ed74a5afa01753fa023001005c910161060c565b5f80600b54146106b95750600190565b505f90565b6106c66109b0565b60088190556040518181527fa3d5cabc8bb89279221a26f7b5a96b34a3ff044c9d1f4a6979a5baea9649226b9060200161060c565b6107036109b0565b61070c5f610bdb565b565b6107166109b0565b5f600a8190556040517f49a1299d149bc1f96ce10cdb73bb4c0c97d93cff7c006006c88e72e338c2e67b9190a1565b5f80600c54146106b95750600190565b61075d6109b0565b6001600c556040517fb0fdeecd460356047c18a543d4e55ca92d44d215b3833f68e018c819c0e79362905f90a1565b606060048054610455906111ed565b5f80600954146106b95750600190565b5f336104e3818585610a58565b6107c06109b0565b61070c610c2c565b6107d06109b0565b6001600a556040517ff3c6010bde2769047195ad37e23d6422bcc0b9e1998f77ac67cbccc02f351a68905f90a1565b6108076109b0565b602881111561082957604051632fe9d03b60e01b815260040160405180910390fd5b60068190556040518181527fc9dde118606c79c4f4b2e1f8784eba7732e839bae809066fcb41904f3493b04c9060200161060c565b6108666109b0565b6001600160a01b0381165f818152600d6020908152604091829020805460ff1916905590519182527f78ce087db51d01d3e32355f2d83455d5a39f99194c8d3d1c2614893695cee442910161060c565b6108be6109b0565b5f600b8190556040517f78a578bf1760fa628f1f8b0e438937f23c63896ef1c7a4e313ad790fd5193add9190a1565b5f80600a54146106b95750600190565b6109056109b0565b6001600160a01b03811661093357604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61093c81610bdb565b50565b6109476109b0565b602881111561096957604051632fe9d03b60e01b815260040160405180910390fd5b60078190556040518181527f81fe2a33a4138cb005e3d7850d19b4342ff47447fb3179ecccf9b350da0b70239060200161060c565b6109ab8383836001610e3c565b505050565b6005546001600160a01b0316331461070c5760405163118cdaa760e01b815233600482015260240161092a565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610a525781811015610a4457604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161092a565b610a5284848484035f610e3c565b50505050565b6001600160a01b038316610a8157604051634b637e8f60e11b81525f600482015260240161092a565b6001600160a01b038216610aaa5760405163ec442f0560e01b81525f600482015260240161092a565b6109ab838383610f0e565b6001600160a01b038316610adf578060025f828254610ad49190611239565b90915550610b4f9050565b6001600160a01b0383165f9081526020819052604090205481811015610b315760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161092a565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610b6b57600280548290039055610b89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610bce91815260200190565b60405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b305f9081526020818152604080832054815160028082526060820184529194939092908301908036833701905050905030815f81518110610c6f57610c6f61124c565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ceb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0f9190611260565b81600181518110610d2257610d2261124c565b60200260200101906001600160a01b031690816001600160a01b031681525050610d6d307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461099e565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663791ac947835f84610db16005546001600160a01b031690565b426040518663ffffffff1660e01b8152600401610dd295949392919061127b565b5f604051808303815f87803b158015610de9575f80fd5b505af1158015610dfb573d5f803e3d5ffd5b505050507f0b9272a6fa5f7af042cfa822c6858dfa12cfc1bbd15d2bfa1865a48afd2bd2eb82604051610e3091815260200190565b60405180910390a15050565b6001600160a01b038416610e655760405163e602df0560e01b81525f600482015260240161092a565b6001600160a01b038316610e8e57604051634a1406b160e11b81525f600482015260240161092a565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610a5257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610f0091815260200190565b60405180910390a350505050565b6001600c54036110aa576001600160a01b0383165f908152600d602052604081205460ff1680610f5557506001600160a01b0383165f908152600d602052604090205460ff165b15610f5e575060015b806110a8577f000000000000000000000000dea56d18ae37d64d75bb36a5469bb3753fe886d06001600160a01b0316846001600160a01b031603610fe157600160095403610fdc575f606460065484610fb791906112ec565b610fc19190611303565b9050610fcd8184611322565b9250610fda853083610ab5565b505b6110a8565b7f000000000000000000000000dea56d18ae37d64d75bb36a5469bb3753fe886d06001600160a01b0316836001600160a01b0316036110a8576001600a54036110a8575f60646007548461103591906112ec565b61103f9190611303565b905061104b8184611322565b9250611058853083610ab5565b6001600b541480156110995750305f908152602081905260409020546103e860085461108360025490565b61108d91906112ec565b6110979190611303565b105b156110a6576110a6610c2c565b505b505b6109ab838383610ab5565b5f602080835283518060208501525f5b818110156110e1578581018301518582016040015282016110c5565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461093c575f80fd5b5f8060408385031215611126575f80fd5b823561113181611101565b946020939093013593505050565b5f805f60608486031215611151575f80fd5b833561115c81611101565b9250602084013561116c81611101565b929592945050506040919091013590565b5f6020828403121561118d575f80fd5b813561119881611101565b9392505050565b5f602082840312156111af575f80fd5b5035919050565b5f80604083850312156111c7575f80fd5b82356111d281611101565b915060208301356111e281611101565b809150509250929050565b600181811c9082168061120157607f821691505b60208210810361121f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156104e9576104e9611225565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611270575f80fd5b815161119881611101565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156112cb5784516001600160a01b0316835293830193918301916001016112a6565b50506001600160a01b03969096166060850152505050608001529392505050565b80820281158282048414176104e9576104e9611225565b5f8261131d57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156104e9576104e961122556fea26469706673582212202cfe4637207990425e2e22aaadaeef75bf0c746341217cab5aed5c72f23aee5b64736f6c63430008180033

Deployed Bytecode Sourcemap

35629:8989:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24506:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27258:190;;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;27258:190:0;1023:187:1;39287:128:0;;;:::i;:::-;;25608:99;25687:12;;25608:99;;;1361:25:1;;;1349:2;1334:18;25608:99:0;1215:177:1;28026:249:0;;;;;;:::i;:::-;;:::i;39530:120::-;;;:::i;40004:117::-;;;:::i;37920:104::-;37999:17;;37920:104;;25459:84;;;25533:2;2000:36:1;;1988:2;1973:18;25459:84:0;1858:184:1;38722:202:0;;;:::i;40237:120::-;;;:::i;41221:148::-;;;;;;:::i;:::-;;:::i;37654:122::-;;;:::i;42373:168::-;;;;;;:::i;:::-;;:::i;38272:120::-;;;;;;:::i;:::-;-1:-1:-1;;;;;38360:24:0;38336:4;38360:24;;;:16;:24;;;;;;;;;38272:120;25992:118;;;;;;:::i;:::-;-1:-1:-1;;;;;26084:18:0;26057:7;26084:18;;;;;;;;;;;;25992:118;21822:103;;;:::i;40709:123::-;;;:::i;37784:128::-;;;:::i;38150:114::-;38234:22;;38150:114;;39042:125;;;:::i;21147:87::-;21220:6;;21147:87;;-1:-1:-1;;;;;21220:6:0;;;2630:51:1;;2618:2;2603:18;21147:87:0;2484:203:1;24716:95:0;;;:::i;37396:120::-;;;:::i;26552:182::-;;;;;;:::i;:::-;;:::i;38534:69::-;;;:::i;40472:120::-;;;:::i;41508:279::-;;;;;;:::i;:::-;;:::i;26797:142::-;;;;;;:::i;:::-;-1:-1:-1;;;;;26904:18:0;;;26877:7;26904:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;26797:142;40952:145;;;;;;:::i;:::-;;:::i;39767:123::-;;;:::i;37524:122::-;;;:::i;38032:106::-;38112:18;;38032:106;;22080:220;;;;;;:::i;:::-;;:::i;41928:283::-;;;;;;:::i;:::-;;:::i;24506:91::-;24551:13;24584:5;24577:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24506:91;:::o;27258:190::-;27331:4;19323:10;27387:31;19323:10;27403:7;27412:5;27387:8;:31::i;:::-;27436:4;27429:11;;;27258:190;;;;;:::o;39287:128::-;21033:13;:11;:13::i;:::-;36936:1:::1;39343:19;:27:::0;;;39386:21:::1;::::0;::::1;::::0;36936:1;39386:21:::1;39287:128::o:0;28026:249::-;28113:4;19323:10;28171:37;28187:4;19323:10;28202:5;28171:15;:37::i;:::-;28219:26;28229:4;28235:2;28239:5;28219:9;:26::i;:::-;-1:-1:-1;28263:4:0;;28026:249;-1:-1:-1;;;;28026:249:0:o;39530:120::-;21033:13;:11;:13::i;:::-;36895:1:::1;39586:16;:23:::0;39625:17:::1;::::0;::::1;::::0;;;::::1;39530:120::o:0;40004:117::-;21033:13;:11;:13::i;:::-;36895:1:::1;40059:15;:22:::0;40097:16:::1;::::0;::::1;::::0;;;::::1;40004:117::o:0;38722:202::-;21033:13;:11;:13::i;:::-;38805:4:::1;38772:12;26084:18:::0;;;;;;;;;;;;38822:49:::1;::::0;38851:10:::1;26084:18:::0;38822:13:::1;:49::i;:::-;38887:29;::::0;;38896:10:::1;3644:51:1::0;;3726:2;3711:18;;3704:34;;;38887:29:0::1;::::0;3617:18:1;38887:29:0::1;;;;;;;;38761:163;38722:202::o:0;40237:120::-;21033:13;:11;:13::i;:::-;36936:1:::1;40293:15;:23:::0;;;40332:17:::1;::::0;::::1;::::0;36936:1;40332:17:::1;40237:120::o:0;41221:148::-;21033:13;:11;:13::i;:::-;-1:-1:-1;;;;;41291:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;;;;;:31;;-1:-1:-1;;41291:31:0::1;41318:4;41291:31;::::0;;41338:23;;2630:51:1;;;41338:23:0::1;::::0;2603:18:1;41338:23:0::1;2484:203:1::0;37654:122:0;37704:4;36936:1;37728:16;;:25;:40;;-1:-1:-1;37764:4:0;;37654:122::o;37728:40::-;-1:-1:-1;37756:5:0;;37654:122::o;42373:168::-;21033:13;:11;:13::i;:::-;42456:22:::1;:35:::0;;;42507:26:::1;::::0;1361:25:1;;;42507:26:0::1;::::0;1349:2:1;1334:18;42507:26:0::1;1215:177:1::0;21822:103:0;21033:13;:11;:13::i;:::-;21887:30:::1;21914:1;21887:18;:30::i;:::-;21822:103::o:0;40709:123::-;21033:13;:11;:13::i;:::-;36936:1:::1;40766:16;:24:::0;;;40806:18:::1;::::0;::::1;::::0;36936:1;40806:18:::1;40709:123::o:0;37784:128::-;37837:4;36936:1;37861:19;;:28;:43;;-1:-1:-1;37900:4:0;;37654:122::o;39042:125::-;21033:13;:11;:13::i;:::-;36895:1:::1;39097:19;:26:::0;39139:20:::1;::::0;::::1;::::0;;;::::1;39042:125::o:0;24716:95::-;24763:13;24796:7;24789:14;;;;;:::i;37396:120::-;37445:4;36936:1;37469:15;;:24;:39;;-1:-1:-1;37504:4:0;;37654:122::o;26552:182::-;26621:4;19323:10;26677:27;19323:10;26694:2;26698:5;26677:9;:27::i;38534:69::-;21033:13;:11;:13::i;:::-;38584:11:::1;:9;:11::i;40472:120::-:0;21033:13;:11;:13::i;:::-;36895:1:::1;40528:16;:23:::0;40567:17:::1;::::0;::::1;::::0;;;::::1;40472:120::o:0;41508:279::-;21033:13;:11;:13::i;:::-;37103:2:::1;41591:10;:37;41587:105;;;41652:28;;-1:-1:-1::0;;;41652:28:0::1;;;;;;;;;;;41587:105;41702:17;:30:::0;;;41748:31:::1;::::0;1361:25:1;;;41748:31:0::1;::::0;1349:2:1;1334:18;41748:31:0::1;1215:177:1::0;40952:145:0;21033:13;:11;:13::i;:::-;-1:-1:-1;;;;;41020:24:0;::::1;41047:5;41020:24:::0;;;:16:::1;:24;::::0;;;;;;;;:32;;-1:-1:-1;;41020:32:0::1;::::0;;41068:21;;2630:51:1;;;41068:21:0::1;::::0;2603:18:1;41068:21:0::1;2484:203:1::0;39767:123:0;21033:13;:11;:13::i;:::-;36936:1:::1;39824:16;:24:::0;;;39864:18:::1;::::0;::::1;::::0;36936:1;39864:18:::1;39767:123::o:0;37524:122::-;37574:4;36936:1;37598:16;;:25;:40;;-1:-1:-1;37634:4:0;;37654:122::o;22080:220::-;21033:13;:11;:13::i;:::-;-1:-1:-1;;;;;22165:22:0;::::1;22161:93;;22211:31;::::0;-1:-1:-1;;;22211:31:0;;22239:1:::1;22211:31;::::0;::::1;2630:51:1::0;2603:18;;22211:31:0::1;;;;;;;;22161:93;22264:28;22283:8;22264:18;:28::i;:::-;22080:220:::0;:::o;41928:283::-;21033:13;:11;:13::i;:::-;37165:2:::1;42012:10;:38;42008:106;;;42074:28;;-1:-1:-1::0;;;42074:28:0::1;;;;;;;;;;;42008:106;42124:18;:31:::0;;;42171:32:::1;::::0;1361:25:1;;;42171:32:0::1;::::0;1349:2:1;1334:18;42171:32:0::1;1215:177:1::0;32085:130:0;32170:37;32179:5;32186:7;32195:5;32202:4;32170:8;:37::i;:::-;32085:130;;;:::o;21312:166::-;21220:6;;-1:-1:-1;;;;;21220:6:0;19323:10;21372:23;21368:103;;21419:40;;-1:-1:-1;;;21419:40:0;;19323:10;21419:40;;;2630:51:1;2603:18;;21419:40:0;2484:203:1;33801:487:0;-1:-1:-1;;;;;26904:18:0;;;33901:24;26904:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;33968:37:0;;33964:317;;34045:5;34026:16;:24;34022:132;;;34078:60;;-1:-1:-1;;;34078:60:0;;-1:-1:-1;;;;;3969:32:1;;34078:60:0;;;3951:51:1;4018:18;;;4011:34;;;4061:18;;;4054:34;;;3924:18;;34078:60:0;3749:345:1;34022:132:0;34197:57;34206:5;34213:7;34241:5;34222:16;:24;34248:5;34197:8;:57::i;:::-;33890:398;33801:487;;;:::o;28660:308::-;-1:-1:-1;;;;;28744:18:0;;28740:88;;28786:30;;-1:-1:-1;;;28786:30:0;;28813:1;28786:30;;;2630:51:1;2603:18;;28786:30:0;2484:203:1;28740:88:0;-1:-1:-1;;;;;28842:16:0;;28838:88;;28882:32;;-1:-1:-1;;;28882:32:0;;28911:1;28882:32;;;2630:51:1;2603:18;;28882:32:0;2484:203:1;28838:88:0;28936:24;28944:4;28950:2;28954:5;28936:7;:24::i;29292:1135::-;-1:-1:-1;;;;;29382:18:0;;29378:552;;29536:5;29520:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;29378:552:0;;-1:-1:-1;29378:552:0;;-1:-1:-1;;;;;29596:15:0;;29574:19;29596:15;;;;;;;;;;;29630:19;;;29626:117;;;29677:50;;-1:-1:-1;;;29677:50:0;;-1:-1:-1;;;;;3969:32:1;;29677:50:0;;;3951:51:1;4018:18;;;4011:34;;;4061:18;;;4054:34;;;3924:18;;29677:50:0;3749:345:1;29626:117:0;-1:-1:-1;;;;;29866:15:0;;:9;:15;;;;;;;;;;29884:19;;;;29866:37;;29378:552;-1:-1:-1;;;;;29946:16:0;;29942:435;;30112:12;:21;;;;;;;29942:435;;;-1:-1:-1;;;;;30328:13:0;;:9;:13;;;;;;;;;;:22;;;;;;29942:435;30409:2;-1:-1:-1;;;;;30394:25:0;30403:4;-1:-1:-1;;;;;30394:25:0;;30413:5;30394:25;;;;1361::1;;1349:2;1334:18;;1215:177;30394:25:0;;;;;;;;29292:1135;;;:::o;22460:191::-;22553:6;;;-1:-1:-1;;;;;22570:17:0;;;-1:-1:-1;;;;;;22570:17:0;;;;;;;22603:40;;22553:6;;;22570:17;22553:6;;22603:40;;22534:16;;22603:40;22523:128;22460:191;:::o;44057:558::-;26333:4;44097:15;26315:24;;;;;;;;;;;;44170:16;;44184:1;44170:16;;;;;;;;26315:24;;44097:15;44170:16;;;;;;26315:24;44170:16;;;;;-1:-1:-1;44170:16:0;44146:40;;44215:4;44197;44202:1;44197:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;44197:23:0;;;-1:-1:-1;;;;;44197:23:0;;;;;44241:17;-1:-1:-1;;;;;44241:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44231:4;44236:1;44231:7;;;;;;;;:::i;:::-;;;;;;:34;-1:-1:-1;;;;;44231:34:0;;;-1:-1:-1;;;;;44231:34:0;;;;;44276:60;44293:4;44308:17;44328:7;44276:8;:60::i;:::-;44462:17;-1:-1:-1;;;;;44462:68:0;;44531:7;44540:1;44543:4;44549:7;21220:6;;-1:-1:-1;;;;;21220:6:0;;21147:87;44549:7;44558:15;44462:112;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44590:17;44599:7;44590:17;;;;1361:25:1;;1349:2;1334:18;;1215:177;44590:17:0;;;;;;;;44086:529;;44057:558::o;33066:443::-;-1:-1:-1;;;;;33179:19:0;;33175:91;;33222:32;;-1:-1:-1;;;33222:32:0;;33251:1;33222:32;;;2630:51:1;2603:18;;33222:32:0;2484:203:1;33175:91:0;-1:-1:-1;;;;;33280:21:0;;33276:92;;33325:31;;-1:-1:-1;;;33325:31:0;;33353:1;33325:31;;;2630:51:1;2603:18;;33325:31:0;2484:203:1;33276:92:0;-1:-1:-1;;;;;33378:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;33424:78;;;;33475:7;-1:-1:-1;;;;;33459:31:0;33468:5;-1:-1:-1;;;;;33459:31:0;;33484:5;33459:31;;;;1361:25:1;;1349:2;1334:18;;1215:177;33459:31:0;;;;;;;;33066:443;;;;:::o;42572:1400::-;36895:1;42692:19;;:27;42689:1235;;-1:-1:-1;;;;;42775:22:0;;42735:14;42775:22;;;:16;:22;;;;;;;;;:46;;-1:-1:-1;;;;;;42801:20:0;;;;;;:16;:20;;;;;;;;42775:46;42771:103;;;-1:-1:-1;36895:1:0;42771:103;42892:9;42889:1024;;42943:15;-1:-1:-1;;;;;42935:23:0;:4;-1:-1:-1;;;;;42935:23:0;;42931:953;;36895:1;42986:15;;:23;42983:271;;43038:15;36987:3;43064:17;;43056:5;:25;;;;:::i;:::-;:43;;;;:::i;:::-;43038:61;-1:-1:-1;43126:16:0;43038:61;43126:16;;:::i;:::-;;;43185:43;43199:4;43213;43220:7;43185:13;:43::i;:::-;43011:243;42983:271;42931:953;;;43289:15;-1:-1:-1;;;;;43283:21:0;:2;-1:-1:-1;;;;;43283:21:0;;43279:605;;36895:1;43332:16;;:24;43329:536;;43385:16;36987:3;43412:18;;43404:5;:26;;;;:::i;:::-;:44;;;;:::i;:::-;43385:63;-1:-1:-1;43475:17:0;43385:63;43475:17;;:::i;:::-;;;43535:44;43549:4;43563;43570:8;43535:13;:44::i;:::-;36895:1;43714:16;;:24;:114;;;;-1:-1:-1;26333:4:0;26288:7;26315:24;;;;;;;;;;;37040:4;43765:22;;43742:20;25687:12;;;25608:99;43742:20;:45;;;;:::i;:::-;:63;;;;:::i;:::-;:86;43714:114;43710:131;;;43830:11;:9;:11::i;:::-;43358:507;43329:536;42720:1204;42689:1235;43934:30;43948:4;43954:2;43958:5;43934:13;:30::i;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1397:456::-;1474:6;1482;1490;1543:2;1531:9;1522:7;1518:23;1514:32;1511:52;;;1559:1;1556;1549:12;1511:52;1598:9;1585:23;1617:31;1642:5;1617:31;:::i;:::-;1667:5;-1:-1:-1;1724:2:1;1709:18;;1696:32;1737:33;1696:32;1737:33;:::i;:::-;1397:456;;1789:7;;-1:-1:-1;;;1843:2:1;1828:18;;;;1815:32;;1397:456::o;2047:247::-;2106:6;2159:2;2147:9;2138:7;2134:23;2130:32;2127:52;;;2175:1;2172;2165:12;2127:52;2214:9;2201:23;2233:31;2258:5;2233:31;:::i;:::-;2283:5;2047:247;-1:-1:-1;;;2047:247:1: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:388::-;2760:6;2768;2821:2;2809:9;2800:7;2796:23;2792:32;2789:52;;;2837:1;2834;2827:12;2789:52;2876:9;2863:23;2895:31;2920:5;2895:31;:::i;:::-;2945:5;-1:-1:-1;3002:2:1;2987:18;;2974:32;3015:33;2974:32;3015:33;:::i;:::-;3067:7;3057:17;;;2692:388;;;;;:::o;3085:380::-;3164:1;3160:12;;;;3207;;;3228:61;;3282:4;3274:6;3270:17;3260:27;;3228:61;3335:2;3327:6;3324:14;3304:18;3301:38;3298:161;;3381:10;3376:3;3372:20;3369:1;3362:31;3416:4;3413:1;3406:15;3444:4;3441:1;3434:15;3298:161;;3085:380;;;:::o;4099:127::-;4160:10;4155:3;4151:20;4148:1;4141:31;4191:4;4188:1;4181:15;4215:4;4212:1;4205:15;4231:125;4296:9;;;4317:10;;;4314:36;;;4330:18;;:::i;4493:127::-;4554:10;4549:3;4545:20;4542:1;4535:31;4585:4;4582:1;4575:15;4609:4;4606:1;4599:15;4625:251;4695:6;4748:2;4736:9;4727:7;4723:23;4719:32;4716:52;;;4764:1;4761;4754:12;4716:52;4796:9;4790:16;4815:31;4840:5;4815:31;:::i;4881:980::-;5143:4;5191:3;5180:9;5176:19;5222:6;5211:9;5204:25;5248:2;5286:6;5281:2;5270:9;5266:18;5259:34;5329:3;5324:2;5313:9;5309:18;5302:31;5353:6;5388;5382:13;5419:6;5411;5404:22;5457:3;5446:9;5442:19;5435:26;;5496:2;5488:6;5484:15;5470:29;;5517:1;5527:195;5541:6;5538:1;5535:13;5527:195;;;5606:13;;-1:-1:-1;;;;;5602:39:1;5590:52;;5697:15;;;;5662:12;;;;5638:1;5556:9;5527:195;;;-1:-1:-1;;;;;;;5778:32:1;;;;5773:2;5758:18;;5751:60;-1:-1:-1;;;5842:3:1;5827:19;5820:35;5739:3;4881:980;-1:-1:-1;;;4881:980:1:o;5866:168::-;5939:9;;;5970;;5987:15;;;5981:22;;5967:37;5957:71;;6008:18;;:::i;6039:217::-;6079:1;6105;6095:132;;6149:10;6144:3;6140:20;6137:1;6130:31;6184:4;6181:1;6174:15;6212:4;6209:1;6202:15;6095:132;-1:-1:-1;6241:9:1;;6039:217::o;6261:128::-;6328:9;;;6349:11;;;6346:37;;;6363:18;;:::i

Swarm Source

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