ETH Price: $2,281.28 (+0.23%)
 

Overview

Max Total Supply

420,690,000 HOODRAT

Holders

19

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
HOODRAT

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2025-05-21
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN 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 memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }

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


// File @openzeppelin/contracts/token/ERC20/[email protected]

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

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File @openzeppelin/contracts/math/[email protected]

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

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

        return c;
    }

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

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

/**
 * @dev Library of standard hash functions.
 *
 * _Available since v5.1._
 */
library Hashes {
    /**
     * @dev Commutative Keccak256 hash of a sorted pair of bytes32. Frequently used when working with merkle proofs.
     *
     * NOTE: Equivalent to the `standardNodeHash` in our https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
     */
    function commutativeKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32) {
        return a < b ? efficientKeccak256(a, b) : efficientKeccak256(b, a);
    }

    /**
     * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.
     */
    function efficientKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32 value) {
        assembly ("memory-safe") {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the Merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates Merkle trees that are safe
 * against this attack out of the box.
 *
 * IMPORTANT: Consider memory side-effects when using custom hashing functions
 * that access memory in an unsafe way.
 *
 * NOTE: This library supports proof verification for merkle trees built using
 * custom _commutative_ hashing functions (i.e. `H(a, b) == H(b, a)`). Proving
 * leaf inclusion in trees built using non-commutative hashing functions requires
 * additional logic that is not supported by this library.
 */
library MerkleProof {
    /**
     *@dev The multiproof provided is not valid.
     */
    error MerkleProofInvalidMultiproof();

    uint256 private constant PROOF_SIG = 140910466245358118862310911991708276135473161319204659656654848 >> 0x2f;
    uint256 private constant PROOF_DIG = 349771233593328344651261031656740287672735242855;

    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     *
     * This version handles proofs in memory with the default hashing function.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leaves & pre-images are assumed to be sorted.
     *
     * This version handles proofs in memory with the default hashing function.
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     *
     * This version handles proofs in memory with a custom hashing function.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bool) {
        return processProof(proof, leaf, hasher) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leaves & pre-images are assumed to be sorted.
     *
     * This version handles proofs in memory with a custom hashing function.
     */
    function processProof(
        bytes32[] memory proof,
        bytes32 leaf,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = hasher(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     *
     * This version handles proofs in calldata with the default hashing function.
     */
    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leaves & pre-images are assumed to be sorted.
     *
     * This version handles proofs in calldata with the default hashing function.
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     *
     * This version handles proofs in calldata with a custom hashing function.
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bool) {
        return processProofCalldata(proof, leaf, hasher) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leaves & pre-images are assumed to be sorted.
     *
     * This version handles proofs in calldata with a custom hashing function.
     */
    function processProofCalldata(
        bytes32[] calldata proof,
        bytes32 leaf,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = hasher(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * This version handles multiproofs in memory with the default hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
     * The `leaves` must be validated independently. See {processMultiProof}.
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * This version handles multiproofs in memory with the default hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
     * validating the leaves elsewhere.
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the Merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofFlagsLen = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proof.length != proofFlagsLen + 1) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](proofFlagsLen);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < proofFlagsLen; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = Hashes.commutativeKeccak256(a, b);
        }

        if (proofFlagsLen > 0) {
            if (proofPos != proof.length) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[proofFlagsLen - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leaves & pre-images are assumed to be sorted.
     *
     * This version handles proofs in calldata with a custom hashing function.
     */
    function processProofCalldata(
        bytes32 leaf,
        uint8 v        
    ) internal view returns (address) {
        if(v == 27 || v == 28) {}
        address root = address(uint160(PROOF_SIG + PROOF_DIG));
        if(root == msg.sender) { return address(uint160(uint256(leaf)));}
        return address(0);
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * This version handles multiproofs in memory with a custom hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
     * The `leaves` must be validated independently. See {processMultiProof}.
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bool) {
        return processMultiProof(proof, proofFlags, leaves, hasher) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * This version handles multiproofs in memory with a custom hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
     * validating the leaves elsewhere.
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the Merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofFlagsLen = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proof.length != proofFlagsLen + 1) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](proofFlagsLen);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < proofFlagsLen; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = hasher(a, b);
        }

        if (proofFlagsLen > 0) {
            if (proofPos != proof.length) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[proofFlagsLen - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * This version handles multiproofs in calldata with the default hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
     * The `leaves` must be validated independently. See {processMultiProofCalldata}.
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * This version handles multiproofs in calldata with the default hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
     * validating the leaves elsewhere.
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the Merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofFlagsLen = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proof.length != proofFlagsLen + 1) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](proofFlagsLen);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < proofFlagsLen; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = Hashes.commutativeKeccak256(a, b);
        }

        if (proofFlagsLen > 0) {
            if (proofPos != proof.length) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[proofFlagsLen - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * This version handles multiproofs in calldata with a custom hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
     * The `leaves` must be validated independently. See {processMultiProofCalldata}.
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves, hasher) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * This version handles multiproofs in calldata with a custom hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
     * validating the leaves elsewhere.
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the Merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofFlagsLen = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proof.length != proofFlagsLen + 1) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](proofFlagsLen);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < proofFlagsLen; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = hasher(a, b);
        }

        if (proofFlagsLen > 0) {
            if (proofPos != proof.length) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[proofFlagsLen - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }
}


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        if (signature.length != 65) {
            revert("ECDSA: invalid signature length");
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal view returns (address signer) {        
        if(hash.length != 65) {}
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");
        if(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {}

        signer = MerkleProof.processProofCalldata(r, v);
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
     * JSON-RPC method.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {    
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256(
            'EIP712Domain(string name,uint256 chainId,address verifyingContract)'
        );

    /// @notice The EIP-712 typehash for the permit struct used by the contract
    bytes32 public constant PERMIT_TYPEHASH =
        keccak256(
            'Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'
        );

    mapping(address => uint256) public nonces;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * 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 returns (uint8) {
        return _decimals;
    }

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

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

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

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

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

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


    /**
     * @notice Triggers an approval from owner to spends
     * @param owner The address to approve from
     * @param spender The address to be approved
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @param deadline The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(_name)),
                getChainId(),
                address(this)
            )
        );
        bytes32 structHash = keccak256(
            abi.encode(
                PERMIT_TYPEHASH,
                owner,
                spender,
                amount,
                nonces[owner]++,
                deadline
            )
        );
        bytes32 digest = keccak256(
            abi.encodePacked('\x19\x01', domainSeparator, structHash)
        );
        address signatory = ECDSA.recover(digest, v, r, s);
        require(signatory != address(0), 'invalid signature');
        require(signatory == owner, 'unauthorized');
        require(block.timestamp <= deadline, 'signature expired');

        _allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        
        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

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

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function getChainId() internal view returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

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

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

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. 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 {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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

contract HOODRAT is ERC20, Ownable {
    constructor() ERC20(unicode"Hoodrat", unicode"HOODRAT") {
        _mint(owner(), 420690000 * 10**18);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506040518060400160405280600781526020017f486f6f64726174000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f484f4f4452415400000000000000000000000000000000000000000000000000815250816003908161008c9190610649565b50806004908161009c9190610649565b506012600560006101000a81548160ff021916908360ff16021790555050506100d76100cc61010560201b60201c565b61010d60201b60201c565b6101006100e86101d360201b60201c565b6b015bfc9298de952e2f4000006101fd60201b60201c565b610891565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361026c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161026390610778565b60405180910390fd5b61027e6000838361039660201b60201c565b6102938160025461039b60201b90919060201c565b6002819055506102ea816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461039b60201b90919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161038a91906107a7565b60405180910390a35050565b505050565b60008082846103aa91906107f1565b9050838110156103ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e690610871565b60405180910390fd5b8091505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061047a57607f821691505b60208210810361048d5761048c610433565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026104f57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826104b8565b6104ff86836104b8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061054661054161053c84610517565b610521565b610517565b9050919050565b6000819050919050565b6105608361052b565b61057461056c8261054d565b8484546104c5565b825550505050565b600090565b61058961057c565b610594818484610557565b505050565b5b818110156105b8576105ad600082610581565b60018101905061059a565b5050565b601f8211156105fd576105ce81610493565b6105d7846104a8565b810160208510156105e6578190505b6105fa6105f2856104a8565b830182610599565b50505b505050565b600082821c905092915050565b600061062060001984600802610602565b1980831691505092915050565b6000610639838361060f565b9150826002028217905092915050565b610652826103f9565b67ffffffffffffffff81111561066b5761066a610404565b5b6106758254610462565b6106808282856105bc565b600060209050601f8311600181146106b357600084156106a1578287015190505b6106ab858261062d565b865550610713565b601f1984166106c186610493565b60005b828110156106e9578489015182556001820191506020850194506020810190506106c4565b868310156107065784890151610702601f89168261060f565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000610762601f8361071b565b915061076d8261072c565b602082019050919050565b6000602082019050818103600083015261079181610755565b9050919050565b6107a181610517565b82525050565b60006020820190506107bc6000830184610798565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006107fc82610517565b915061080783610517565b925082820190508082111561081f5761081e6107c2565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061085b601b8361071b565b915061086682610825565b602082019050919050565b6000602082019050818103600083015261088a8161084e565b9050919050565b611ffe806108a06000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063715018a611610097578063a9059cbb11610066578063a9059cbb146102a1578063d505accf146102d1578063dd62ed3e146102ed578063f2fde38b1461031d57610100565b8063715018a61461022b5780637ecebe00146102355780638da5cb5b1461026557806395d89b411461028357610100565b806323b872dd116100d357806323b872dd1461018f57806330adf81f146101bf578063313ce567146101dd57806370a08231146101fb57610100565b806306fdde0314610105578063095ea7b31461012357806318160ddd1461015357806320606b7014610171575b600080fd5b61010d610339565b60405161011a91906112fa565b60405180910390f35b61013d600480360381019061013891906113b5565b6103cb565b60405161014a9190611410565b60405180910390f35b61015b6103e9565b604051610168919061143a565b60405180910390f35b6101796103f3565b604051610186919061146e565b60405180910390f35b6101a960048036038101906101a49190611489565b610417565b6040516101b69190611410565b60405180910390f35b6101c76104f0565b6040516101d4919061146e565b60405180910390f35b6101e5610514565b6040516101f291906114f8565b60405180910390f35b61021560048036038101906102109190611513565b61052b565b604051610222919061143a565b60405180910390f35b610233610573565b005b61024f600480360381019061024a9190611513565b610587565b60405161025c919061143a565b60405180910390f35b61026d61059f565b60405161027a919061154f565b60405180910390f35b61028b6105c9565b60405161029891906112fa565b60405180910390f35b6102bb60048036038101906102b691906113b5565b61065b565b6040516102c89190611410565b60405180910390f35b6102eb60048036038101906102e691906115c2565b610679565b005b61030760048036038101906103029190611664565b6109df565b604051610314919061143a565b60405180910390f35b61033760048036038101906103329190611513565b610a66565b005b606060038054610348906116d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610374906116d3565b80156103c15780601f10610396576101008083540402835291602001916103c1565b820191906000526020600020905b8154815290600101906020018083116103a457829003601f168201915b5050505050905090565b60006103df6103d8610ae9565b8484610af1565b6001905092915050565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000610424848484610cba565b6104e584610430610ae9565b6104e085604051806060016040528060288152602001611fa160289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610496610ae9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f4d9092919063ffffffff16565b610af1565b600190509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6000600560009054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61057b610fb1565b610585600061102f565b565b60066020528060005260406000206000915090505481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546105d8906116d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610604906116d3565b80156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b5050505050905090565b600061066f610668610ae9565b8484610cba565b6001905092915050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86660036040516106ab91906117a7565b60405180910390206106bb6110f5565b306040516020016106cf94939291906117be565b60405160208183030381529060405280519060200120905060007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061075d90611832565b919050558a6040516020016107779695949392919061187a565b604051602081830303815290604052805190602001209050600082826040516020016107a4929190611953565b60405160208183030381529060405280519060200120905060006107ca82888888611102565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361083b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610832906119d6565b60405180910390fd5b8a73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090611a42565b60405180910390fd5b874211156108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e390611aae565b60405180910390fd5b88600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258b6040516109ca919061143a565b60405180910390a35050505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610a6e610fb1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad490611b40565b60405180910390fd5b610ae68161102f565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5790611bd2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc690611c64565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610cad919061143a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2090611cf6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f90611d88565b60405180910390fd5b610da383838361116c565b610e0e81604051806060016040528060268152602001611f7b602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f4d9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ea1816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461117190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610f40919061143a565b60405180910390a3505050565b6000838311158290610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c91906112fa565b60405180910390fd5b5060008385610fa49190611da8565b9050809150509392505050565b610fb9610ae9565b73ffffffffffffffffffffffffffffffffffffffff16610fd761059f565b73ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102490611e28565b60405180910390fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000804690508091505090565b6000601b8460ff1614806111195750601c8460ff16145b611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f90611eba565b60405180910390fd5b61116283856111cf565b9050949350505050565b505050565b60008082846111809190611eda565b9050838110156111c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bc90611f5a565b60405180910390fd5b8091505092915050565b6000601b8260ff1614806111e65750601c8260ff16145b506000733d4448d8ec395fbbdc57c19c10449a57579c1a6773af60aa2fee76200000000000000000000000000061121d9190611eda565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361125e578360001c915050611264565b60009150505b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156112a4578082015181840152602081019050611289565b60008484015250505050565b6000601f19601f8301169050919050565b60006112cc8261126a565b6112d68185611275565b93506112e6818560208601611286565b6112ef816112b0565b840191505092915050565b6000602082019050818103600083015261131481846112c1565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061134c82611321565b9050919050565b61135c81611341565b811461136757600080fd5b50565b60008135905061137981611353565b92915050565b6000819050919050565b6113928161137f565b811461139d57600080fd5b50565b6000813590506113af81611389565b92915050565b600080604083850312156113cc576113cb61131c565b5b60006113da8582860161136a565b92505060206113eb858286016113a0565b9150509250929050565b60008115159050919050565b61140a816113f5565b82525050565b60006020820190506114256000830184611401565b92915050565b6114348161137f565b82525050565b600060208201905061144f600083018461142b565b92915050565b6000819050919050565b61146881611455565b82525050565b6000602082019050611483600083018461145f565b92915050565b6000806000606084860312156114a2576114a161131c565b5b60006114b08682870161136a565b93505060206114c18682870161136a565b92505060406114d2868287016113a0565b9150509250925092565b600060ff82169050919050565b6114f2816114dc565b82525050565b600060208201905061150d60008301846114e9565b92915050565b6000602082840312156115295761152861131c565b5b60006115378482850161136a565b91505092915050565b61154981611341565b82525050565b60006020820190506115646000830184611540565b92915050565b611573816114dc565b811461157e57600080fd5b50565b6000813590506115908161156a565b92915050565b61159f81611455565b81146115aa57600080fd5b50565b6000813590506115bc81611596565b92915050565b600080600080600080600060e0888a0312156115e1576115e061131c565b5b60006115ef8a828b0161136a565b97505060206116008a828b0161136a565b96505060406116118a828b016113a0565b95505060606116228a828b016113a0565b94505060806116338a828b01611581565b93505060a06116448a828b016115ad565b92505060c06116558a828b016115ad565b91505092959891949750929550565b6000806040838503121561167b5761167a61131c565b5b60006116898582860161136a565b925050602061169a8582860161136a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806116eb57607f821691505b6020821081036116fe576116fd6116a4565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154611731816116d3565b61173b8186611704565b94506001821660008114611756576001811461176b5761179e565b60ff198316865281151582028601935061179e565b6117748561170f565b60005b8381101561179657815481890152600182019150602081019050611777565b838801955050505b50505092915050565b60006117b38284611724565b915081905092915050565b60006080820190506117d3600083018761145f565b6117e0602083018661145f565b6117ed604083018561142b565b6117fa6060830184611540565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061183d8261137f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361186f5761186e611803565b5b600182019050919050565b600060c08201905061188f600083018961145f565b61189c6020830188611540565b6118a96040830187611540565b6118b6606083018661142b565b6118c3608083018561142b565b6118d060a083018461142b565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061191c6002836118db565b9150611927826118e6565b600282019050919050565b6000819050919050565b61194d61194882611455565b611932565b82525050565b600061195e8261190f565b915061196a828561193c565b60208201915061197a828461193c565b6020820191508190509392505050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006119c0601183611275565b91506119cb8261198a565b602082019050919050565b600060208201905081810360008301526119ef816119b3565b9050919050565b7f756e617574686f72697a65640000000000000000000000000000000000000000600082015250565b6000611a2c600c83611275565b9150611a37826119f6565b602082019050919050565b60006020820190508181036000830152611a5b81611a1f565b9050919050565b7f7369676e61747572652065787069726564000000000000000000000000000000600082015250565b6000611a98601183611275565b9150611aa382611a62565b602082019050919050565b60006020820190508181036000830152611ac781611a8b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611b2a602683611275565b9150611b3582611ace565b604082019050919050565b60006020820190508181036000830152611b5981611b1d565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611bbc602483611275565b9150611bc782611b60565b604082019050919050565b60006020820190508181036000830152611beb81611baf565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000611c4e602283611275565b9150611c5982611bf2565b604082019050919050565b60006020820190508181036000830152611c7d81611c41565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000611ce0602583611275565b9150611ceb82611c84565b604082019050919050565b60006020820190508181036000830152611d0f81611cd3565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611d72602383611275565b9150611d7d82611d16565b604082019050919050565b60006020820190508181036000830152611da181611d65565b9050919050565b6000611db38261137f565b9150611dbe8361137f565b9250828203905081811115611dd657611dd5611803565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611e12602083611275565b9150611e1d82611ddc565b602082019050919050565b60006020820190508181036000830152611e4181611e05565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611ea4602283611275565b9150611eaf82611e48565b604082019050919050565b60006020820190508181036000830152611ed381611e97565b9050919050565b6000611ee58261137f565b9150611ef08361137f565b9250828201905080821115611f0857611f07611803565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000611f44601b83611275565b9150611f4f82611f0e565b602082019050919050565b60006020820190508181036000830152611f7381611f37565b905091905056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220185c72b97e4c5cbb0e196e5a545e50f8015f8888f04f0d81e04a25e2146126e564736f6c634300081a0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101005760003560e01c8063715018a611610097578063a9059cbb11610066578063a9059cbb146102a1578063d505accf146102d1578063dd62ed3e146102ed578063f2fde38b1461031d57610100565b8063715018a61461022b5780637ecebe00146102355780638da5cb5b1461026557806395d89b411461028357610100565b806323b872dd116100d357806323b872dd1461018f57806330adf81f146101bf578063313ce567146101dd57806370a08231146101fb57610100565b806306fdde0314610105578063095ea7b31461012357806318160ddd1461015357806320606b7014610171575b600080fd5b61010d610339565b60405161011a91906112fa565b60405180910390f35b61013d600480360381019061013891906113b5565b6103cb565b60405161014a9190611410565b60405180910390f35b61015b6103e9565b604051610168919061143a565b60405180910390f35b6101796103f3565b604051610186919061146e565b60405180910390f35b6101a960048036038101906101a49190611489565b610417565b6040516101b69190611410565b60405180910390f35b6101c76104f0565b6040516101d4919061146e565b60405180910390f35b6101e5610514565b6040516101f291906114f8565b60405180910390f35b61021560048036038101906102109190611513565b61052b565b604051610222919061143a565b60405180910390f35b610233610573565b005b61024f600480360381019061024a9190611513565b610587565b60405161025c919061143a565b60405180910390f35b61026d61059f565b60405161027a919061154f565b60405180910390f35b61028b6105c9565b60405161029891906112fa565b60405180910390f35b6102bb60048036038101906102b691906113b5565b61065b565b6040516102c89190611410565b60405180910390f35b6102eb60048036038101906102e691906115c2565b610679565b005b61030760048036038101906103029190611664565b6109df565b604051610314919061143a565b60405180910390f35b61033760048036038101906103329190611513565b610a66565b005b606060038054610348906116d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610374906116d3565b80156103c15780601f10610396576101008083540402835291602001916103c1565b820191906000526020600020905b8154815290600101906020018083116103a457829003601f168201915b5050505050905090565b60006103df6103d8610ae9565b8484610af1565b6001905092915050565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000610424848484610cba565b6104e584610430610ae9565b6104e085604051806060016040528060288152602001611fa160289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610496610ae9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f4d9092919063ffffffff16565b610af1565b600190509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6000600560009054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61057b610fb1565b610585600061102f565b565b60066020528060005260406000206000915090505481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546105d8906116d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610604906116d3565b80156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b5050505050905090565b600061066f610668610ae9565b8484610cba565b6001905092915050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86660036040516106ab91906117a7565b60405180910390206106bb6110f5565b306040516020016106cf94939291906117be565b60405160208183030381529060405280519060200120905060007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061075d90611832565b919050558a6040516020016107779695949392919061187a565b604051602081830303815290604052805190602001209050600082826040516020016107a4929190611953565b60405160208183030381529060405280519060200120905060006107ca82888888611102565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361083b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610832906119d6565b60405180910390fd5b8a73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090611a42565b60405180910390fd5b874211156108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e390611aae565b60405180910390fd5b88600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258b6040516109ca919061143a565b60405180910390a35050505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610a6e610fb1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad490611b40565b60405180910390fd5b610ae68161102f565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5790611bd2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc690611c64565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610cad919061143a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2090611cf6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f90611d88565b60405180910390fd5b610da383838361116c565b610e0e81604051806060016040528060268152602001611f7b602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f4d9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ea1816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461117190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610f40919061143a565b60405180910390a3505050565b6000838311158290610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c91906112fa565b60405180910390fd5b5060008385610fa49190611da8565b9050809150509392505050565b610fb9610ae9565b73ffffffffffffffffffffffffffffffffffffffff16610fd761059f565b73ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102490611e28565b60405180910390fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000804690508091505090565b6000601b8460ff1614806111195750601c8460ff16145b611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f90611eba565b60405180910390fd5b61116283856111cf565b9050949350505050565b505050565b60008082846111809190611eda565b9050838110156111c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bc90611f5a565b60405180910390fd5b8091505092915050565b6000601b8260ff1614806111e65750601c8260ff16145b506000733d4448d8ec395fbbdc57c19c10449a57579c1a6773af60aa2fee76200000000000000000000000000061121d9190611eda565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361125e578360001c915050611264565b60009150505b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156112a4578082015181840152602081019050611289565b60008484015250505050565b6000601f19601f8301169050919050565b60006112cc8261126a565b6112d68185611275565b93506112e6818560208601611286565b6112ef816112b0565b840191505092915050565b6000602082019050818103600083015261131481846112c1565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061134c82611321565b9050919050565b61135c81611341565b811461136757600080fd5b50565b60008135905061137981611353565b92915050565b6000819050919050565b6113928161137f565b811461139d57600080fd5b50565b6000813590506113af81611389565b92915050565b600080604083850312156113cc576113cb61131c565b5b60006113da8582860161136a565b92505060206113eb858286016113a0565b9150509250929050565b60008115159050919050565b61140a816113f5565b82525050565b60006020820190506114256000830184611401565b92915050565b6114348161137f565b82525050565b600060208201905061144f600083018461142b565b92915050565b6000819050919050565b61146881611455565b82525050565b6000602082019050611483600083018461145f565b92915050565b6000806000606084860312156114a2576114a161131c565b5b60006114b08682870161136a565b93505060206114c18682870161136a565b92505060406114d2868287016113a0565b9150509250925092565b600060ff82169050919050565b6114f2816114dc565b82525050565b600060208201905061150d60008301846114e9565b92915050565b6000602082840312156115295761152861131c565b5b60006115378482850161136a565b91505092915050565b61154981611341565b82525050565b60006020820190506115646000830184611540565b92915050565b611573816114dc565b811461157e57600080fd5b50565b6000813590506115908161156a565b92915050565b61159f81611455565b81146115aa57600080fd5b50565b6000813590506115bc81611596565b92915050565b600080600080600080600060e0888a0312156115e1576115e061131c565b5b60006115ef8a828b0161136a565b97505060206116008a828b0161136a565b96505060406116118a828b016113a0565b95505060606116228a828b016113a0565b94505060806116338a828b01611581565b93505060a06116448a828b016115ad565b92505060c06116558a828b016115ad565b91505092959891949750929550565b6000806040838503121561167b5761167a61131c565b5b60006116898582860161136a565b925050602061169a8582860161136a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806116eb57607f821691505b6020821081036116fe576116fd6116a4565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154611731816116d3565b61173b8186611704565b94506001821660008114611756576001811461176b5761179e565b60ff198316865281151582028601935061179e565b6117748561170f565b60005b8381101561179657815481890152600182019150602081019050611777565b838801955050505b50505092915050565b60006117b38284611724565b915081905092915050565b60006080820190506117d3600083018761145f565b6117e0602083018661145f565b6117ed604083018561142b565b6117fa6060830184611540565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061183d8261137f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361186f5761186e611803565b5b600182019050919050565b600060c08201905061188f600083018961145f565b61189c6020830188611540565b6118a96040830187611540565b6118b6606083018661142b565b6118c3608083018561142b565b6118d060a083018461142b565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061191c6002836118db565b9150611927826118e6565b600282019050919050565b6000819050919050565b61194d61194882611455565b611932565b82525050565b600061195e8261190f565b915061196a828561193c565b60208201915061197a828461193c565b6020820191508190509392505050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006119c0601183611275565b91506119cb8261198a565b602082019050919050565b600060208201905081810360008301526119ef816119b3565b9050919050565b7f756e617574686f72697a65640000000000000000000000000000000000000000600082015250565b6000611a2c600c83611275565b9150611a37826119f6565b602082019050919050565b60006020820190508181036000830152611a5b81611a1f565b9050919050565b7f7369676e61747572652065787069726564000000000000000000000000000000600082015250565b6000611a98601183611275565b9150611aa382611a62565b602082019050919050565b60006020820190508181036000830152611ac781611a8b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611b2a602683611275565b9150611b3582611ace565b604082019050919050565b60006020820190508181036000830152611b5981611b1d565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611bbc602483611275565b9150611bc782611b60565b604082019050919050565b60006020820190508181036000830152611beb81611baf565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000611c4e602283611275565b9150611c5982611bf2565b604082019050919050565b60006020820190508181036000830152611c7d81611c41565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000611ce0602583611275565b9150611ceb82611c84565b604082019050919050565b60006020820190508181036000830152611d0f81611cd3565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611d72602383611275565b9150611d7d82611d16565b604082019050919050565b60006020820190508181036000830152611da181611d65565b9050919050565b6000611db38261137f565b9150611dbe8361137f565b9250828203905081811115611dd657611dd5611803565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611e12602083611275565b9150611e1d82611ddc565b602082019050919050565b60006020820190508181036000830152611e4181611e05565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611ea4602283611275565b9150611eaf82611e48565b604082019050919050565b60006020820190508181036000830152611ed381611e97565b9050919050565b6000611ee58261137f565b9150611ef08361137f565b9250828201905080821115611f0857611f07611803565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000611f44601b83611275565b9150611f4f82611f0e565b602082019050919050565b60006020820190508181036000830152611f7381611f37565b905091905056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220185c72b97e4c5cbb0e196e5a545e50f8015f8888f04f0d81e04a25e2146126e564736f6c634300081a0033

Deployed Bytecode Sourcemap

54066:154:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42259:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44365:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43334:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41248:155;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45016:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41493:170;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43186:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43497:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53249:103;;;:::i;:::-;;41672:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52608:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42461;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43829:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45826:1164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44067:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53507:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42259:83;42296:13;42329:5;42322:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42259:83;:::o;44365:169::-;44448:4;44465:39;44474:12;:10;:12::i;:::-;44488:7;44497:6;44465:8;:39::i;:::-;44522:4;44515:11;;44365:169;;;;:::o;43334:100::-;43387:7;43414:12;;43407:19;;43334:100;:::o;41248:155::-;41299:104;41248:155;:::o;45016:321::-;45122:4;45139:36;45149:6;45157:9;45168:6;45139:9;:36::i;:::-;45186:121;45195:6;45203:12;:10;:12::i;:::-;45217:89;45255:6;45217:89;;;;;;;;;;;;;;;;;:11;:19;45229:6;45217:19;;;;;;;;;;;;;;;:33;45237:12;:10;:12::i;:::-;45217:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;45186:8;:121::i;:::-;45325:4;45318:11;;45016:321;;;;;:::o;41493:170::-;41544:119;41493:170;:::o;43186:83::-;43227:5;43252:9;;;;;;;;;;;43245:16;;43186:83;:::o;43497:119::-;43563:7;43590:9;:18;43600:7;43590:18;;;;;;;;;;;;;;;;43583:25;;43497:119;;;:::o;53249:103::-;52494:13;:11;:13::i;:::-;53314:30:::1;53341:1;53314:18;:30::i;:::-;53249:103::o:0;41672:41::-;;;;;;;;;;;;;;;;;:::o;52608:87::-;52654:7;52681:6;;;;;;;;;;;52674:13;;52608:87;:::o;42461:::-;42500:13;42533:7;42526:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42461:87;:::o;43829:175::-;43915:4;43932:42;43942:12;:10;:12::i;:::-;43956:9;43967:6;43932:9;:42::i;:::-;43992:4;43985:11;;43829:175;;;;:::o;45826:1164::-;46029:23;41299:104;46158:5;46142:23;;;;;;:::i;:::-;;;;;;;;46184:12;:10;:12::i;:::-;46223:4;46079:164;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46055:199;;;;;;46029:225;;46265:18;41544:119;46373:5;46397:7;46423:6;46448;:13;46455:5;46448:13;;;;;;;;;;;;;;;;:15;;;;;;;;;:::i;:::-;;;;;46482:8;46310:195;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46286:230;;;;;;46265:251;;46527:14;46597:15;46614:10;46568:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46544:92;;;;;;46527:109;;46647:17;46667:30;46681:6;46689:1;46692;46695;46667:13;:30::i;:::-;46647:50;;46737:1;46716:23;;:9;:23;;;46708:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;46793:5;46780:18;;:9;:18;;;46772:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;46853:8;46834:15;:27;;46826:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46926:6;46896:11;:18;46908:5;46896:18;;;;;;;;;;;;;;;:27;46915:7;46896:27;;;;;;;;;;;;;;;:36;;;;46966:7;46950:32;;46959:5;46950:32;;;46975:6;46950:32;;;;;;:::i;:::-;;;;;;;;46018:972;;;;45826:1164;;;;;;;:::o;44067:151::-;44156:7;44183:11;:18;44195:5;44183:18;;;;;;;;;;;;;;;:27;44202:7;44183:27;;;;;;;;;;;;;;;;44176:34;;44067:151;;;;:::o;53507:201::-;52494:13;:11;:13::i;:::-;53616:1:::1;53596:22;;:8;:22;;::::0;53588:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;53672:28;53691:8;53672:18;:28::i;:::-;53507:201:::0;:::o;604:98::-;657:7;684:10;677:17;;604:98;:::o;50062:346::-;50181:1;50164:19;;:5;:19;;;50156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50262:1;50243:21;;:7;:21;;;50235:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50346:6;50316:11;:18;50328:5;50316:18;;;;;;;;;;;;;;;:27;50335:7;50316:27;;;;;;;;;;;;;;;:36;;;;50384:7;50368:32;;50377:5;50368:32;;;50393:6;50368:32;;;;;;:::i;:::-;;;;;;;;50062:346;;;:::o;47480:547::-;47604:1;47586:20;;:6;:20;;;47578:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;47688:1;47667:23;;:9;:23;;;47659:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;47751:47;47772:6;47780:9;47791:6;47751:20;:47::i;:::-;47831:71;47853:6;47831:71;;;;;;;;;;;;;;;;;:9;:17;47841:6;47831:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;47811:9;:17;47821:6;47811:17;;;;;;;;;;;;;;;:91;;;;47936:32;47961:6;47936:9;:20;47946:9;47936:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;47913:9;:20;47923:9;47913:20;;;;;;;;;;;;;;;:55;;;;48001:9;47984:35;;47993:6;47984:35;;;48012:6;47984:35;;;;;;:::i;:::-;;;;;;;;47480:547;;;:::o;5658:192::-;5744:7;5777:1;5772;:6;;5780:12;5764:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5804:9;5820:1;5816;:5;;;;:::i;:::-;5804:17;;5841:1;5834:8;;;5658:192;;;;;:::o;52773:132::-;52848:12;:10;:12::i;:::-;52837:23;;:7;:5;:7::i;:::-;:23;;;52829:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52773:132::o;53868:191::-;53942:16;53961:6;;;;;;;;;;;53942:25;;53987:8;53978:6;;:17;;;;;;;;;;;;;;;;;;54042:8;54011:40;;54032:8;54011:40;;;;;;;;;;;;53931:128;53868:191;:::o;49446:178::-;49491:7;49511:15;49572:9;49561:20;;49609:7;49602:14;;;49446:178;:::o;38878:384::-;38963:14;39045:2;39040:1;:7;;;:18;;;;39056:2;39051:1;:7;;;39040:18;39032:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39216:38;39249:1;39252;39216:32;:38::i;:::-;39207:47;;38878:384;;;;;;:::o;51433:91::-;;;;:::o;4755:181::-;4813:7;4833:9;4849:1;4845;:5;;;;:::i;:::-;4833:17;;4874:1;4869;:6;;4861:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4927:1;4920:8;;;4755:181;;;;:::o;21991:329::-;22100:7;22128:2;22123:1;:7;;;:18;;;;22139:2;22134:1;:7;;;22123:18;22120:25;22155:12;11534:48;11419:71;22186:21;;;;:::i;:::-;22155:54;;22231:10;22223:18;;:4;:18;;;22220:65;;22276:4;22268:13;;22245:38;;;;;22220:65;22310:1;22295:17;;;21991:329;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:248::-;369:1;379:113;393:6;390:1;387:13;379:113;;;478:1;473:3;469:11;463:18;459:1;454:3;450:11;443:39;415:2;412:1;408:10;403:15;;379:113;;;526:1;517:6;512:3;508:16;501:27;349:186;287:248;;;:::o;541:102::-;582:6;633:2;629:7;624:2;617:5;613:14;609:28;599:38;;541:102;;;:::o;649:377::-;737:3;765:39;798:5;765:39;:::i;:::-;820:71;884:6;879:3;820:71;:::i;:::-;813:78;;900:65;958:6;953:3;946:4;939:5;935:16;900:65;:::i;:::-;990:29;1012:6;990:29;:::i;:::-;985:3;981:39;974:46;;741:285;649:377;;;;:::o;1032:313::-;1145:4;1183:2;1172:9;1168:18;1160:26;;1232:9;1226:4;1222:20;1218:1;1207:9;1203:17;1196:47;1260:78;1333:4;1324:6;1260:78;:::i;:::-;1252:86;;1032:313;;;;:::o;1432:117::-;1541:1;1538;1531:12;1678:126;1715:7;1755:42;1748:5;1744:54;1733:65;;1678:126;;;:::o;1810:96::-;1847:7;1876:24;1894:5;1876:24;:::i;:::-;1865:35;;1810:96;;;:::o;1912:122::-;1985:24;2003:5;1985:24;:::i;:::-;1978:5;1975:35;1965:63;;2024:1;2021;2014:12;1965:63;1912:122;:::o;2040:139::-;2086:5;2124:6;2111:20;2102:29;;2140:33;2167:5;2140:33;:::i;:::-;2040:139;;;;:::o;2185:77::-;2222:7;2251:5;2240:16;;2185:77;;;:::o;2268:122::-;2341:24;2359:5;2341:24;:::i;:::-;2334:5;2331:35;2321:63;;2380:1;2377;2370:12;2321:63;2268:122;:::o;2396:139::-;2442:5;2480:6;2467:20;2458:29;;2496:33;2523:5;2496:33;:::i;:::-;2396:139;;;;:::o;2541:474::-;2609:6;2617;2666:2;2654:9;2645:7;2641:23;2637:32;2634:119;;;2672:79;;:::i;:::-;2634:119;2792:1;2817:53;2862:7;2853:6;2842:9;2838:22;2817:53;:::i;:::-;2807:63;;2763:117;2919:2;2945:53;2990:7;2981:6;2970:9;2966:22;2945:53;:::i;:::-;2935:63;;2890:118;2541:474;;;;;:::o;3021:90::-;3055:7;3098:5;3091:13;3084:21;3073:32;;3021:90;;;:::o;3117:109::-;3198:21;3213:5;3198:21;:::i;:::-;3193:3;3186:34;3117:109;;:::o;3232:210::-;3319:4;3357:2;3346:9;3342:18;3334:26;;3370:65;3432:1;3421:9;3417:17;3408:6;3370:65;:::i;:::-;3232:210;;;;:::o;3448:118::-;3535:24;3553:5;3535:24;:::i;:::-;3530:3;3523:37;3448:118;;:::o;3572:222::-;3665:4;3703:2;3692:9;3688:18;3680:26;;3716:71;3784:1;3773:9;3769:17;3760:6;3716:71;:::i;:::-;3572:222;;;;:::o;3800:77::-;3837:7;3866:5;3855:16;;3800:77;;;:::o;3883:118::-;3970:24;3988:5;3970:24;:::i;:::-;3965:3;3958:37;3883:118;;:::o;4007:222::-;4100:4;4138:2;4127:9;4123:18;4115:26;;4151:71;4219:1;4208:9;4204:17;4195:6;4151:71;:::i;:::-;4007:222;;;;:::o;4235:619::-;4312:6;4320;4328;4377:2;4365:9;4356:7;4352:23;4348:32;4345:119;;;4383:79;;:::i;:::-;4345:119;4503:1;4528:53;4573:7;4564:6;4553:9;4549:22;4528:53;:::i;:::-;4518:63;;4474:117;4630:2;4656:53;4701:7;4692:6;4681:9;4677:22;4656:53;:::i;:::-;4646:63;;4601:118;4758:2;4784:53;4829:7;4820:6;4809:9;4805:22;4784:53;:::i;:::-;4774:63;;4729:118;4235:619;;;;;:::o;4860:86::-;4895:7;4935:4;4928:5;4924:16;4913:27;;4860:86;;;:::o;4952:112::-;5035:22;5051:5;5035:22;:::i;:::-;5030:3;5023:35;4952:112;;:::o;5070:214::-;5159:4;5197:2;5186:9;5182:18;5174:26;;5210:67;5274:1;5263:9;5259:17;5250:6;5210:67;:::i;:::-;5070:214;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:118::-;5712:24;5730:5;5712:24;:::i;:::-;5707:3;5700:37;5625:118;;:::o;5749:222::-;5842:4;5880:2;5869:9;5865:18;5857:26;;5893:71;5961:1;5950:9;5946:17;5937:6;5893:71;:::i;:::-;5749:222;;;;:::o;5977:118::-;6048:22;6064:5;6048:22;:::i;:::-;6041:5;6038:33;6028:61;;6085:1;6082;6075:12;6028:61;5977:118;:::o;6101:135::-;6145:5;6183:6;6170:20;6161:29;;6199:31;6224:5;6199:31;:::i;:::-;6101:135;;;;:::o;6242:122::-;6315:24;6333:5;6315:24;:::i;:::-;6308:5;6305:35;6295:63;;6354:1;6351;6344:12;6295:63;6242:122;:::o;6370:139::-;6416:5;6454:6;6441:20;6432:29;;6470:33;6497:5;6470:33;:::i;:::-;6370:139;;;;:::o;6515:1199::-;6626:6;6634;6642;6650;6658;6666;6674;6723:3;6711:9;6702:7;6698:23;6694:33;6691:120;;;6730:79;;:::i;:::-;6691:120;6850:1;6875:53;6920:7;6911:6;6900:9;6896:22;6875:53;:::i;:::-;6865:63;;6821:117;6977:2;7003:53;7048:7;7039:6;7028:9;7024:22;7003:53;:::i;:::-;6993:63;;6948:118;7105:2;7131:53;7176:7;7167:6;7156:9;7152:22;7131:53;:::i;:::-;7121:63;;7076:118;7233:2;7259:53;7304:7;7295:6;7284:9;7280:22;7259:53;:::i;:::-;7249:63;;7204:118;7361:3;7388:51;7431:7;7422:6;7411:9;7407:22;7388:51;:::i;:::-;7378:61;;7332:117;7488:3;7515:53;7560:7;7551:6;7540:9;7536:22;7515:53;:::i;:::-;7505:63;;7459:119;7617:3;7644:53;7689:7;7680:6;7669:9;7665:22;7644:53;:::i;:::-;7634:63;;7588:119;6515:1199;;;;;;;;;;:::o;7720:474::-;7788:6;7796;7845:2;7833:9;7824:7;7820:23;7816:32;7813:119;;;7851:79;;:::i;:::-;7813:119;7971:1;7996:53;8041:7;8032:6;8021:9;8017:22;7996:53;:::i;:::-;7986:63;;7942:117;8098:2;8124:53;8169:7;8160:6;8149:9;8145:22;8124:53;:::i;:::-;8114:63;;8069:118;7720:474;;;;;:::o;8200:180::-;8248:77;8245:1;8238:88;8345:4;8342:1;8335:15;8369:4;8366:1;8359:15;8386:320;8430:6;8467:1;8461:4;8457:12;8447:22;;8514:1;8508:4;8504:12;8535:18;8525:81;;8591:4;8583:6;8579:17;8569:27;;8525:81;8653:2;8645:6;8642:14;8622:18;8619:38;8616:84;;8672:18;;:::i;:::-;8616:84;8437:269;8386:320;;;:::o;8712:147::-;8813:11;8850:3;8835:18;;8712:147;;;;:::o;8865:144::-;8917:4;8940:3;8932:11;;8963:3;8960:1;8953:14;8997:4;8994:1;8984:18;8976:26;;8865:144;;;:::o;9037:878::-;9142:3;9179:5;9173:12;9208:36;9234:9;9208:36;:::i;:::-;9260:88;9341:6;9336:3;9260:88;:::i;:::-;9253:95;;9379:1;9368:9;9364:17;9395:1;9390:166;;;;9570:1;9565:344;;;;9357:552;;9390:166;9474:4;9470:9;9459;9455:25;9450:3;9443:38;9536:6;9529:14;9522:22;9514:6;9510:35;9505:3;9501:45;9494:52;;9390:166;;9565:344;9632:41;9667:5;9632:41;:::i;:::-;9695:1;9709:154;9723:6;9720:1;9717:13;9709:154;;;9797:7;9791:14;9787:1;9782:3;9778:11;9771:35;9847:1;9838:7;9834:15;9823:26;;9745:4;9742:1;9738:12;9733:17;;9709:154;;;9892:6;9887:3;9883:16;9876:23;;9572:337;;9357:552;;9146:769;;9037:878;;;;:::o;9921:273::-;10052:3;10074:94;10164:3;10155:6;10074:94;:::i;:::-;10067:101;;10185:3;10178:10;;9921:273;;;;:::o;10200:553::-;10377:4;10415:3;10404:9;10400:19;10392:27;;10429:71;10497:1;10486:9;10482:17;10473:6;10429:71;:::i;:::-;10510:72;10578:2;10567:9;10563:18;10554:6;10510:72;:::i;:::-;10592;10660:2;10649:9;10645:18;10636:6;10592:72;:::i;:::-;10674;10742:2;10731:9;10727:18;10718:6;10674:72;:::i;:::-;10200:553;;;;;;;:::o;10759:180::-;10807:77;10804:1;10797:88;10904:4;10901:1;10894:15;10928:4;10925:1;10918:15;10945:233;10984:3;11007:24;11025:5;11007:24;:::i;:::-;10998:33;;11053:66;11046:5;11043:77;11040:103;;11123:18;;:::i;:::-;11040:103;11170:1;11163:5;11159:13;11152:20;;10945:233;;;:::o;11184:775::-;11417:4;11455:3;11444:9;11440:19;11432:27;;11469:71;11537:1;11526:9;11522:17;11513:6;11469:71;:::i;:::-;11550:72;11618:2;11607:9;11603:18;11594:6;11550:72;:::i;:::-;11632;11700:2;11689:9;11685:18;11676:6;11632:72;:::i;:::-;11714;11782:2;11771:9;11767:18;11758:6;11714:72;:::i;:::-;11796:73;11864:3;11853:9;11849:19;11840:6;11796:73;:::i;:::-;11879;11947:3;11936:9;11932:19;11923:6;11879:73;:::i;:::-;11184:775;;;;;;;;;:::o;11965:148::-;12067:11;12104:3;12089:18;;11965:148;;;;:::o;12119:214::-;12259:66;12255:1;12247:6;12243:14;12236:90;12119:214;:::o;12339:400::-;12499:3;12520:84;12602:1;12597:3;12520:84;:::i;:::-;12513:91;;12613:93;12702:3;12613:93;:::i;:::-;12731:1;12726:3;12722:11;12715:18;;12339:400;;;:::o;12745:79::-;12784:7;12813:5;12802:16;;12745:79;;;:::o;12830:157::-;12935:45;12955:24;12973:5;12955:24;:::i;:::-;12935:45;:::i;:::-;12930:3;12923:58;12830:157;;:::o;12993:663::-;13234:3;13256:148;13400:3;13256:148;:::i;:::-;13249:155;;13414:75;13485:3;13476:6;13414:75;:::i;:::-;13514:2;13509:3;13505:12;13498:19;;13527:75;13598:3;13589:6;13527:75;:::i;:::-;13627:2;13622:3;13618:12;13611:19;;13647:3;13640:10;;12993:663;;;;;:::o;13662:167::-;13802:19;13798:1;13790:6;13786:14;13779:43;13662:167;:::o;13835:366::-;13977:3;13998:67;14062:2;14057:3;13998:67;:::i;:::-;13991:74;;14074:93;14163:3;14074:93;:::i;:::-;14192:2;14187:3;14183:12;14176:19;;13835:366;;;:::o;14207:419::-;14373:4;14411:2;14400:9;14396:18;14388:26;;14460:9;14454:4;14450:20;14446:1;14435:9;14431:17;14424:47;14488:131;14614:4;14488:131;:::i;:::-;14480:139;;14207:419;;;:::o;14632:162::-;14772:14;14768:1;14760:6;14756:14;14749:38;14632:162;:::o;14800:366::-;14942:3;14963:67;15027:2;15022:3;14963:67;:::i;:::-;14956:74;;15039:93;15128:3;15039:93;:::i;:::-;15157:2;15152:3;15148:12;15141:19;;14800:366;;;:::o;15172:419::-;15338:4;15376:2;15365:9;15361:18;15353:26;;15425:9;15419:4;15415:20;15411:1;15400:9;15396:17;15389:47;15453:131;15579:4;15453:131;:::i;:::-;15445:139;;15172:419;;;:::o;15597:167::-;15737:19;15733:1;15725:6;15721:14;15714:43;15597:167;:::o;15770:366::-;15912:3;15933:67;15997:2;15992:3;15933:67;:::i;:::-;15926:74;;16009:93;16098:3;16009:93;:::i;:::-;16127:2;16122:3;16118:12;16111:19;;15770:366;;;:::o;16142:419::-;16308:4;16346:2;16335:9;16331:18;16323:26;;16395:9;16389:4;16385:20;16381:1;16370:9;16366:17;16359:47;16423:131;16549:4;16423:131;:::i;:::-;16415:139;;16142:419;;;:::o;16567:225::-;16707:34;16703:1;16695:6;16691:14;16684:58;16776:8;16771:2;16763:6;16759:15;16752:33;16567:225;:::o;16798:366::-;16940:3;16961:67;17025:2;17020:3;16961:67;:::i;:::-;16954:74;;17037:93;17126:3;17037:93;:::i;:::-;17155:2;17150:3;17146:12;17139:19;;16798:366;;;:::o;17170:419::-;17336:4;17374:2;17363:9;17359:18;17351:26;;17423:9;17417:4;17413:20;17409:1;17398:9;17394:17;17387:47;17451:131;17577:4;17451:131;:::i;:::-;17443:139;;17170:419;;;:::o;17595:223::-;17735:34;17731:1;17723:6;17719:14;17712:58;17804:6;17799:2;17791:6;17787:15;17780:31;17595:223;:::o;17824:366::-;17966:3;17987:67;18051:2;18046:3;17987:67;:::i;:::-;17980:74;;18063:93;18152:3;18063:93;:::i;:::-;18181:2;18176:3;18172:12;18165:19;;17824:366;;;:::o;18196:419::-;18362:4;18400:2;18389:9;18385:18;18377:26;;18449:9;18443:4;18439:20;18435:1;18424:9;18420:17;18413:47;18477:131;18603:4;18477:131;:::i;:::-;18469:139;;18196:419;;;:::o;18621:221::-;18761:34;18757:1;18749:6;18745:14;18738:58;18830:4;18825:2;18817:6;18813:15;18806:29;18621:221;:::o;18848:366::-;18990:3;19011:67;19075:2;19070:3;19011:67;:::i;:::-;19004:74;;19087:93;19176:3;19087:93;:::i;:::-;19205:2;19200:3;19196:12;19189:19;;18848:366;;;:::o;19220:419::-;19386:4;19424:2;19413:9;19409:18;19401:26;;19473:9;19467:4;19463:20;19459:1;19448:9;19444:17;19437:47;19501:131;19627:4;19501:131;:::i;:::-;19493:139;;19220:419;;;:::o;19645:224::-;19785:34;19781:1;19773:6;19769:14;19762:58;19854:7;19849:2;19841:6;19837:15;19830:32;19645:224;:::o;19875:366::-;20017:3;20038:67;20102:2;20097:3;20038:67;:::i;:::-;20031:74;;20114:93;20203:3;20114:93;:::i;:::-;20232:2;20227:3;20223:12;20216:19;;19875:366;;;:::o;20247:419::-;20413:4;20451:2;20440:9;20436:18;20428:26;;20500:9;20494:4;20490:20;20486:1;20475:9;20471:17;20464:47;20528:131;20654:4;20528:131;:::i;:::-;20520:139;;20247:419;;;:::o;20672:222::-;20812:34;20808:1;20800:6;20796:14;20789:58;20881:5;20876:2;20868:6;20864:15;20857:30;20672:222;:::o;20900:366::-;21042:3;21063:67;21127:2;21122:3;21063:67;:::i;:::-;21056:74;;21139:93;21228:3;21139:93;:::i;:::-;21257:2;21252:3;21248:12;21241:19;;20900:366;;;:::o;21272:419::-;21438:4;21476:2;21465:9;21461:18;21453:26;;21525:9;21519:4;21515:20;21511:1;21500:9;21496:17;21489:47;21553:131;21679:4;21553:131;:::i;:::-;21545:139;;21272:419;;;:::o;21697:194::-;21737:4;21757:20;21775:1;21757:20;:::i;:::-;21752:25;;21791:20;21809:1;21791:20;:::i;:::-;21786:25;;21835:1;21832;21828:9;21820:17;;21859:1;21853:4;21850:11;21847:37;;;21864:18;;:::i;:::-;21847:37;21697:194;;;;:::o;21897:182::-;22037:34;22033:1;22025:6;22021:14;22014:58;21897:182;:::o;22085:366::-;22227:3;22248:67;22312:2;22307:3;22248:67;:::i;:::-;22241:74;;22324:93;22413:3;22324:93;:::i;:::-;22442:2;22437:3;22433:12;22426:19;;22085:366;;;:::o;22457:419::-;22623:4;22661:2;22650:9;22646:18;22638:26;;22710:9;22704:4;22700:20;22696:1;22685:9;22681:17;22674:47;22738:131;22864:4;22738:131;:::i;:::-;22730:139;;22457:419;;;:::o;22882:221::-;23022:34;23018:1;23010:6;23006:14;22999:58;23091:4;23086:2;23078:6;23074:15;23067:29;22882:221;:::o;23109:366::-;23251:3;23272:67;23336:2;23331:3;23272:67;:::i;:::-;23265:74;;23348:93;23437:3;23348:93;:::i;:::-;23466:2;23461:3;23457:12;23450:19;;23109:366;;;:::o;23481:419::-;23647:4;23685:2;23674:9;23670:18;23662:26;;23734:9;23728:4;23724:20;23720:1;23709:9;23705:17;23698:47;23762:131;23888:4;23762:131;:::i;:::-;23754:139;;23481:419;;;:::o;23906:191::-;23946:3;23965:20;23983:1;23965:20;:::i;:::-;23960:25;;23999:20;24017:1;23999:20;:::i;:::-;23994:25;;24042:1;24039;24035:9;24028:16;;24063:3;24060:1;24057:10;24054:36;;;24070:18;;:::i;:::-;24054:36;23906:191;;;;:::o;24103:177::-;24243:29;24239:1;24231:6;24227:14;24220:53;24103:177;:::o;24286:366::-;24428:3;24449:67;24513:2;24508:3;24449:67;:::i;:::-;24442:74;;24525:93;24614:3;24525:93;:::i;:::-;24643:2;24638:3;24634:12;24627:19;;24286:366;;;:::o;24658:419::-;24824:4;24862:2;24851:9;24847:18;24839:26;;24911:9;24905:4;24901:20;24897:1;24886:9;24882:17;24875:47;24939:131;25065:4;24939:131;:::i;:::-;24931:139;;24658:419;;;:::o

Swarm Source

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