/

    Token

    Knuckles (PUNCH)

    Overview

    Max Total Supply

    1,000,000,000 PUNCH

    Holders

    163

    Market

    Price

    -

    Onchain Market Cap

    -

    Circulating Supply Market Cap

    -

    Other Info

    Token Contract (WITH 18 Decimals)

    Balance
    1,197,276.396089133149655093 PUNCH

    Value
    $0.00
    0xaf942f1360de619e082e09505c13114b91c1fd0c
    Loading...
    Loading
    Loading...
    Loading
    Loading...
    Loading

    Click here to update the token information / general information

    Contract Source Code Verified (Exact Match)

    Contract Name:
    Knuckles

    Compiler Version
    v0.8.26+commit.8a97fa7a

    Optimization Enabled:
    No with 200 runs

    Other Settings:
    default evmVersion
    File 1 of 21 : KNUCKLES.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // SPDX-License-Identifier: MIT
    // Compatible with OpenZeppelin Contracts ^5.0.0
    pragma solidity ^0.8.22;
    import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
    import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
    import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
    contract Knuckles is ERC20, ERC20Permit, Ownable {
    constructor() ERC20("Knuckles", "PUNCH") ERC20Permit("Knuckles") Ownable(msg.sender) {
    _mint(msg.sender, 1000000000 * 10 ** 18);
    renounceOwnership();
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 2 of 21 : Ownable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
    pragma solidity ^0.8.20;
    import {Context} from "../utils/Context.sol";
    /**
    * @dev Contract module which provides a basic access control mechanism, where
    * there is an account (an owner) that can be granted exclusive access to
    * specific functions.
    *
    * The initial owner is set to the address provided by the deployer. This can
    * later be changed with {transferOwnership}.
    *
    * This module is used through inheritance. It will make available the modifier
    * `onlyOwner`, which can be applied to your functions to restrict their use to
    * the owner.
    */
    abstract contract Ownable is Context {
    address private _owner;
    /**
    * @dev The caller account is not authorized to perform an operation.
    */
    error OwnableUnauthorizedAccount(address account);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 3 of 21 : ERC20Permit.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/ERC20Permit.sol)
    pragma solidity ^0.8.20;
    import {IERC20Permit} from "./IERC20Permit.sol";
    import {ERC20} from "../ERC20.sol";
    import {ECDSA} from "../../../utils/cryptography/ECDSA.sol";
    import {EIP712} from "../../../utils/cryptography/EIP712.sol";
    import {Nonces} from "../../../utils/Nonces.sol";
    /**
    * @dev Implementation of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in
    * https://eips.ethereum.org/EIPS/eip-2612[ERC-2612].
    *
    * Adds the {permit} method, which can be used to change an account's ERC-20 allowance (see {IERC20-allowance}) by
    * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
    * need to send a transaction, and thus is not required to hold Ether at all.
    */
    abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712, Nonces {
    bytes32 private constant PERMIT_TYPEHASH =
    keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    /**
    * @dev Permit deadline has expired.
    */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 4 of 21 : ERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/ERC20.sol)
    pragma solidity ^0.8.20;
    import {IERC20} from "./IERC20.sol";
    import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
    import {Context} from "../../utils/Context.sol";
    import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
    /**
    * @dev Implementation of the {IERC20} interface.
    *
    * This implementation is agnostic to the way tokens are created. This means
    * that a supply mechanism has to be added in a derived contract using {_mint}.
    *
    * TIP: For a detailed writeup see our guide
    * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
    * to implement supply mechanisms].
    *
    * The default value of {decimals} is 18. To change this, you should override
    * this function so it returns a different value.
    *
    * We have followed general OpenZeppelin Contracts guidelines: functions revert
    * instead returning `false` on failure. This behavior is nonetheless
    * conventional and does not conflict with the expectations of ERC-20
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 5 of 21 : Nonces.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (utils/Nonces.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Provides tracking nonces for addresses. Nonces will only increment.
    */
    abstract contract Nonces {
    /**
    * @dev The nonce used for an `account` is not the expected current nonce.
    */
    error InvalidAccountNonce(address account, uint256 currentNonce);
    mapping(address account => uint256) private _nonces;
    /**
    * @dev Returns the next unused nonce for an address.
    */
    function nonces(address owner) public view virtual returns (uint256) {
    return _nonces[owner];
    }
    /**
    * @dev Consumes a nonce.
    *
    * Returns the current value and increments nonce.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 6 of 21 : EIP712.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/EIP712.sol)
    pragma solidity ^0.8.20;
    import {MessageHashUtils} from "./MessageHashUtils.sol";
    import {ShortStrings, ShortString} from "../ShortStrings.sol";
    import {IERC5267} from "../../interfaces/IERC5267.sol";
    /**
    * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.
    *
    * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose
    * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract
    * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to
    * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.
    *
    * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
    * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
    * ({_hashTypedDataV4}).
    *
    * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
    * the chain id to protect against replay attacks on an eventual fork of the chain.
    *
    * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
    * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 7 of 21 : ECDSA.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)
    pragma solidity ^0.8.20;
    /**
    * @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 {
    enum RecoverError {
    NoError,
    InvalidSignature,
    InvalidSignatureLength,
    InvalidSignatureS
    }
    /**
    * @dev The signature derives the `address(0)`.
    */
    error ECDSAInvalidSignature();
    /**
    * @dev The signature has an invalid length.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 8 of 21 : IERC20Permit.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Permit.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Interface of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in
    * https://eips.ethereum.org/EIPS/eip-2612[ERC-2612].
    *
    * Adds the {permit} method, which can be used to change an account's ERC-20 allowance (see {IERC20-allowance}) by
    * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
    * need to send a transaction, and thus is not required to hold Ether at all.
    *
    * ==== Security Considerations
    *
    * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
    * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
    * considered as an intention to spend the allowance in any specific way. The second is that because permits have
    * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
    * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
    * generally recommended is:
    *
    * ```solidity
    * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
    * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
    * doThing(..., value);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 9 of 21 : draft-IERC6093.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Standard ERC-20 Errors
    * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
    */
    interface IERC20Errors {
    /**
    * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
    * @param sender Address whose tokens are being transferred.
    * @param balance Current balance for the interacting account.
    * @param needed Minimum amount required to perform a transfer.
    */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
    /**
    * @dev Indicates a failure with the token `sender`. Used in transfers.
    * @param sender Address whose tokens are being transferred.
    */
    error ERC20InvalidSender(address sender);
    /**
    * @dev Indicates a failure with the token `receiver`. Used in transfers.
    * @param receiver Address to which tokens are being transferred.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 10 of 21 : Context.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Provides information about the current execution context, including the
    * sender of the transaction and its data. While these are generally available
    * via msg.sender and msg.data, they should not be accessed in such a direct
    * manner, since when dealing with meta-transactions the account sending and
    * paying for execution may not be the actual sender (as far as an application
    * is concerned).
    *
    * This contract is only required for intermediate, library-like contracts.
    */
    abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
    return msg.sender;
    }
    function _msgData() internal view virtual returns (bytes calldata) {
    return msg.data;
    }
    function _contextSuffixLength() internal view virtual returns (uint256) {
    return 0;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 11 of 21 : IERC20Metadata.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)
    pragma solidity ^0.8.20;
    import {IERC20} from "../IERC20.sol";
    /**
    * @dev Interface for the optional metadata functions from the ERC-20 standard.
    */
    interface IERC20Metadata is IERC20 {
    /**
    * @dev Returns the name of the token.
    */
    function name() external view returns (string memory);
    /**
    * @dev Returns the symbol of the token.
    */
    function symbol() external view returns (string memory);
    /**
    * @dev Returns the decimals places of the token.
    */
    function decimals() external view returns (uint8);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 12 of 21 : IERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Interface of the ERC-20 standard as defined in the ERC.
    */
    interface IERC20 {
    /**
    * @dev Emitted when `value` tokens are moved from one account (`from`) to
    * another (`to`).
    *
    * Note that `value` may be zero.
    */
    event Transfer(address indexed from, address indexed to, uint256 value);
    /**
    * @dev Emitted when the allowance of a `spender` for an `owner` is set by
    * a call to {approve}. `value` is the new allowance.
    */
    event Approval(address indexed owner, address indexed spender, uint256 value);
    /**
    * @dev Returns the value of tokens in existence.
    */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 13 of 21 : IERC5267.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)
    pragma solidity ^0.8.20;
    interface IERC5267 {
    /**
    * @dev MAY be emitted to signal that the domain could have changed.
    */
    event EIP712DomainChanged();
    /**
    * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712
    * signature.
    */
    function eip712Domain()
    external
    view
    returns (
    bytes1 fields,
    string memory name,
    string memory version,
    uint256 chainId,
    address verifyingContract,
    bytes32 salt,
    uint256[] memory extensions
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 14 of 21 : ShortStrings.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/ShortStrings.sol)
    pragma solidity ^0.8.20;
    import {StorageSlot} from "./StorageSlot.sol";
    // | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
    // | length | 0x BB |
    type ShortString is bytes32;
    /**
    * @dev This library provides functions to convert short memory strings
    * into a `ShortString` type that can be used as an immutable variable.
    *
    * Strings of arbitrary length can be optimized using this library if
    * they are short enough (up to 31 bytes) by packing them with their
    * length (1 byte) in a single EVM word (32 bytes). Additionally, a
    * fallback mechanism can be used for every other case.
    *
    * Usage example:
    *
    * ```solidity
    * contract Named {
    * using ShortStrings for *;
    *
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 15 of 21 : MessageHashUtils.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/MessageHashUtils.sol)
    pragma solidity ^0.8.20;
    import {Strings} from "../Strings.sol";
    /**
    * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.
    *
    * The library provides methods for generating a hash of a message that conforms to the
    * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]
    * specifications.
    */
    library MessageHashUtils {
    /**
    * @dev Returns the keccak256 digest of an ERC-191 signed data with version
    * `0x45` (`personal_sign` messages).
    *
    * The digest is calculated by prefixing a bytes32 `messageHash` with
    * `"\x19Ethereum Signed Message:\n32"` and hashing the result. It corresponds with the
    * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.
    *
    * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with
    * keccak256, although any bytes32 value can be safely used because the final digest will
    * be re-hashed.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 16 of 21 : Strings.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/Strings.sol)
    pragma solidity ^0.8.20;
    import {Math} from "./math/Math.sol";
    import {SignedMath} from "./math/SignedMath.sol";
    /**
    * @dev String operations.
    */
    library Strings {
    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
    uint8 private constant ADDRESS_LENGTH = 20;
    /**
    * @dev The `value` string doesn't fit in the specified `length`.
    */
    error StringsInsufficientHexLength(uint256 value, uint256 length);
    /**
    * @dev Converts a `uint256` to its ASCII `string` decimal representation.
    */
    function toString(uint256 value) internal pure returns (string memory) {
    unchecked {
    uint256 length = Math.log10(value) + 1;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 17 of 21 : StorageSlot.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)
    // This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
    pragma solidity ^0.8.20;
    /**
    * @dev Library for reading and writing primitive types to specific storage slots.
    *
    * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
    * This library helps with reading and writing to such slots without the need for inline assembly.
    *
    * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
    *
    * Example usage to set ERC-1967 implementation slot:
    * ```solidity
    * contract ERC1967 {
    * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.
    * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
    *
    * function _getImplementation() internal view returns (address) {
    * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
    * }
    *
    * function _setImplementation(address newImplementation) internal {
    * require(newImplementation.code.length > 0);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 18 of 21 : SignedMath.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)
    pragma solidity ^0.8.20;
    import {SafeCast} from "./SafeCast.sol";
    /**
    * @dev Standard signed math utilities missing in the Solidity language.
    */
    library SignedMath {
    /**
    * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.
    *
    * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.
    * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute
    * one branch when needed, making this function more expensive.
    */
    function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {
    unchecked {
    // branchless ternary works because:
    // b ^ (a ^ b) == a
    // b ^ 0 == b
    return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 19 of 21 : Math.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/math/Math.sol)
    pragma solidity ^0.8.20;
    import {Panic} from "../Panic.sol";
    import {SafeCast} from "./SafeCast.sol";
    /**
    * @dev Standard math utilities missing in the Solidity language.
    */
    library Math {
    enum Rounding {
    Floor, // Toward negative infinity
    Ceil, // Toward positive infinity
    Trunc, // Toward zero
    Expand // Away from zero
    }
    /**
    * @dev Returns the addition of two unsigned integers, with an success flag (no overflow).
    */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
    unchecked {
    uint256 c = a + b;
    if (c < a) return (false, 0);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 20 of 21 : SafeCast.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)
    // This file was procedurally generated from scripts/generate/templates/SafeCast.js.
    pragma solidity ^0.8.20;
    /**
    * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow
    * checks.
    *
    * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
    * easily result in undesired exploitation or bugs, since developers usually
    * assume that overflows raise errors. `SafeCast` restores this intuition by
    * reverting the transaction when such 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 SafeCast {
    /**
    * @dev Value doesn't fit in an uint of `bits` size.
    */
    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);
    /**
    * @dev An int value doesn't fit in an uint of `bits` size.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 21 of 21 : Panic.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Helper library for emitting standardized panic codes.
    *
    * ```solidity
    * contract Example {
    * using Panic for uint256;
    *
    * // Use any of the declared internal constants
    * function foo() { Panic.GENERIC.panic(); }
    *
    * // Alternatively
    * function foo() { Panic.panic(Panic.GENERIC); }
    * }
    * ```
    *
    * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].
    *
    * _Available since v5.1._
    */
    // slither-disable-next-line unused-state
    library Panic {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Settings
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    {
    "optimizer": {
    "enabled": false,
    "runs": 200
    },
    "outputSelection": {
    "*": {
    "*": [
    "evm.bytecode",
    "evm.deployedBytecode",
    "devdoc",
    "userdoc",
    "metadata",
    "abi"
    ]
    }
    },
    "remappings": []
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Contract Security Audit

    Contract ABI

    [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC2612ExpiredSignature","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC2612InvalidSigner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"name":"InvalidAccountNonce","type":"error"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","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_SEPARATOR","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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

    610160604052348015610010575f80fd5b50336040518060400160405280600881526020017f4b6e75636b6c6573000000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f4b6e75636b6c65730000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f50554e434800000000000000000000000000000000000000000000000000000081525081600390816100fa91906109fe565b50806004908161010a91906109fe565b50505061012160058361026760201b90919060201c565b610120818152505061013d60068261026760201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a0818152505061017a6102b460201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250505050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610228575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161021f9190610b0c565b60405180910390fd5b6102378161030e60201b60201c565b50610254336b033b2e3c9fd0803ce80000006103d160201b60201c565b61026261045660201b60201c565b610d64565b5f602083511015610288576102818361047560201b60201c565b90506102ae565b82610298836104da60201b60201c565b5f0190816102a691906109fe565b5060ff5f1b90505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e0516101005146306040516020016102f3959493929190610b4c565b60405160208183030381529060405280519060200120905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610441575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016104389190610b0c565b60405180910390fd5b6104525f83836104e360201b60201c565b5050565b6104646106fc60201b60201c565b6104735f61030e60201b60201c565b565b5f80829050601f815111156104c157826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016104b89190610c03565b60405180910390fd5b8051816104cd90610c50565b5f1c175f1b915050919050565b5f819050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610533578060025f8282546105279190610ce3565b92505081905550610601565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156105bc578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016105b393929190610d16565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610648578060025f8282540392505081905550610692565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106ef9190610d4b565b60405180910390a3505050565b61070a61079560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1661072e61079c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146107935761075761079560201b60201c565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161078a9190610b0c565b60405180910390fd5b565b5f33905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061083f57607f821691505b602082108103610852576108516107fb565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026108b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610879565b6108be8683610879565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6109026108fd6108f8846108d6565b6108df565b6108d6565b9050919050565b5f819050919050565b61091b836108e8565b61092f61092782610909565b848454610885565b825550505050565b5f90565b610943610937565b61094e818484610912565b505050565b5b81811015610971576109665f8261093b565b600181019050610954565b5050565b601f8211156109b65761098781610858565b6109908461086a565b8101602085101561099f578190505b6109b36109ab8561086a565b830182610953565b50505b505050565b5f82821c905092915050565b5f6109d65f19846008026109bb565b1980831691505092915050565b5f6109ee83836109c7565b9150826002028217905092915050565b610a07826107c4565b67ffffffffffffffff811115610a2057610a1f6107ce565b5b610a2a8254610828565b610a35828285610975565b5f60209050601f831160018114610a66575f8415610a54578287015190505b610a5e85826109e3565b865550610ac5565b601f198416610a7486610858565b5f5b82811015610a9b57848901518255600182019150602085019450602081019050610a76565b86831015610ab85784890151610ab4601f8916826109c7565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610af682610acd565b9050919050565b610b0681610aec565b82525050565b5f602082019050610b1f5f830184610afd565b92915050565b5f819050919050565b610b3781610b25565b82525050565b610b46816108d6565b82525050565b5f60a082019050610b5f5f830188610b2e565b610b6c6020830187610b2e565b610b796040830186610b2e565b610b866060830185610b3d565b610b936080830184610afd565b9695505050505050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610bd5826107c4565b610bdf8185610b9d565b9350610bef818560208601610bad565b610bf881610bbb565b840191505092915050565b5f6020820190508181035f830152610c1b8184610bcb565b905092915050565b5f81519050919050565b5f819050602082019050919050565b5f610c478251610b25565b80915050919050565b5f610c5a82610c23565b82610c6484610c2d565b9050610c6f81610c3c565b92506020821015610caf57610caa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802610879565b831692505b5050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610ced826108d6565b9150610cf8836108d6565b9250828201905080821115610d1057610d0f610cb6565b5b92915050565b5f606082019050610d295f830186610afd565b610d366020830185610b3d565b610d436040830184610b3d565b949350505050565b5f602082019050610d5e5f830184610b3d565b92915050565b60805160a05160c05160e051610100516101205161014051611dd2610db55f395f610c9301525f610c5801525f61118c01525f61116b01525f610a0c01525f610a6201525f610a8b0152611dd25ff3fe608060405234801561000f575f80fd5b50600436106100fe575f3560e01c80637ecebe0011610095578063a9059cbb11610064578063a9059cbb146102a4578063d505accf146102d4578063dd62ed3e146102f0578063f2fde38b14610320576100fe565b80637ecebe001461021457806384b0196e146102445780638da5cb5b1461026857806395d89b4114610286576100fe565b8063313ce567116100d1578063313ce5671461019e5780633644e515146101bc57806370a08231146101da578063715018a61461020a576100fe565b806306fdde0314610102578063095ea7b31461012057806318160ddd1461015057806323b872dd1461016e575b5f80fd5b61010a61033c565b6040516101179190611642565b60405180910390f35b61013a600480360381019061013591906116f3565b6103cc565b604051610147919061174b565b60405180910390f35b6101586103ee565b6040516101659190611773565b60405180910390f35b6101886004803603810190610183919061178c565b6103f7565b604051610195919061174b565b60405180910390f35b6101a6610425565b6040516101b391906117f7565b60405180910390f35b6101c461042d565b6040516101d19190611828565b60405180910390f35b6101f460048036038101906101ef9190611841565b61043b565b6040516102019190611773565b60405180910390f35b610212610480565b005b61022e60048036038101906102299190611841565b610493565b60405161023b9190611773565b60405180910390f35b61024c6104a4565b60405161025f979695949392919061196c565b60405180910390f35b610270610549565b60405161027d91906119ee565b60405180910390f35b61028e610571565b60405161029b9190611642565b60405180910390f35b6102be60048036038101906102b991906116f3565b610601565b6040516102cb919061174b565b60405180910390f35b6102ee60048036038101906102e99190611a5b565b610623565b005b61030a60048036038101906103059190611af8565b610768565b6040516103179190611773565b60405180910390f35b61033a60048036038101906103359190611841565b6107ea565b005b60606003805461034b90611b63565b80601f016020809104026020016040519081016040528092919081815260200182805461037790611b63565b80156103c25780601f10610399576101008083540402835291602001916103c2565b820191905f5260205f20905b8154815290600101906020018083116103a557829003601f168201915b5050505050905090565b5f806103d661086e565b90506103e3818585610875565b600191505092915050565b5f600254905090565b5f8061040161086e565b905061040e858285610887565b610419858585610919565b60019150509392505050565b5f6012905090565b5f610436610a09565b905090565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610488610abf565b6104915f610b46565b565b5f61049d82610c09565b9050919050565b5f6060805f805f60606104b5610c4f565b6104bd610c8a565b46305f801b5f67ffffffffffffffff8111156104dc576104db611b93565b5b60405190808252806020026020018201604052801561050a5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461058090611b63565b80601f01602080910402602001604051908101604052809291908181526020018280546105ac90611b63565b80156105f75780601f106105ce576101008083540402835291602001916105f7565b820191905f5260205f20905b8154815290600101906020018083116105da57829003601f168201915b5050505050905090565b5f8061060b61086e565b9050610618818585610919565b600191505092915050565b8342111561066857836040517f6279130200000000000000000000000000000000000000000000000000000000815260040161065f9190611773565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886106968c610cc5565b896040516020016106ac96959493929190611bc0565b6040516020818303038152906040528051906020012090505f6106ce82610d18565b90505f6106dd82878787610d31565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461075157808a6040517f4b800e46000000000000000000000000000000000000000000000000000000008152600401610748929190611c1f565b60405180910390fd5b61075c8a8a8a610875565b50505050505050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6107f2610abf565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610862575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161085991906119ee565b60405180910390fd5b61086b81610b46565b50565b5f33905090565b6108828383836001610d5f565b505050565b5f6108928484610768565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109135781811015610904578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016108fb93929190611c46565b60405180910390fd5b61091284848484035f610d5f565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610989575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161098091906119ee565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109f9575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016109f091906119ee565b60405180910390fd5b610a04838383610f2e565b505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610a8457507f000000000000000000000000000000000000000000000000000000000000000046145b15610ab1577f00000000000000000000000000000000000000000000000000000000000000009050610abc565b610ab9611147565b90505b90565b610ac761086e565b73ffffffffffffffffffffffffffffffffffffffff16610ae5610549565b73ffffffffffffffffffffffffffffffffffffffff1614610b4457610b0861086e565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610b3b91906119ee565b60405180910390fd5b565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6060610c8560057f00000000000000000000000000000000000000000000000000000000000000006111dc90919063ffffffff16565b905090565b6060610cc060067f00000000000000000000000000000000000000000000000000000000000000006111dc90919063ffffffff16565b905090565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b5f610d2a610d24610a09565b83611289565b9050919050565b5f805f80610d41888888886112c9565b925092509250610d5182826113b0565b829350505050949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610dcf575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610dc691906119ee565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e3f575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610e3691906119ee565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610f28578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610f1f9190611773565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f7e578060025f828254610f729190611ca8565b9250508190555061104c565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611007578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610ffe93929190611c46565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611093578060025f82825403925050819055506110dd565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161113a9190611773565b60405180910390a3505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000046306040516020016111c1959493929190611cdb565b60405160208183030381529060405280519060200120905090565b606060ff5f1b83146111f8576111f183611512565b9050611283565b81805461120490611b63565b80601f016020809104026020016040519081016040528092919081815260200182805461123090611b63565b801561127b5780601f106112525761010080835404028352916020019161127b565b820191905f5260205f20905b81548152906001019060200180831161125e57829003601f168201915b505050505090505b92915050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115611305575f6003859250925092506113a6565b5f6001888888886040515f81526020016040526040516113289493929190611d2c565b6020604051602081039080840390855afa158015611348573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611399575f60015f801b935093509350506113a6565b805f805f1b935093509350505b9450945094915050565b5f60038111156113c3576113c2611d6f565b5b8260038111156113d6576113d5611d6f565b5b031561150e57600160038111156113f0576113ef611d6f565b5b82600381111561140357611402611d6f565b5b0361143a576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600381111561144e5761144d611d6f565b5b82600381111561146157611460611d6f565b5b036114a557805f1c6040517ffce698f700000000000000000000000000000000000000000000000000000000815260040161149c9190611773565b60405180910390fd5b6003808111156114b8576114b7611d6f565b5b8260038111156114cb576114ca611d6f565b5b0361150d57806040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004016115049190611828565b60405180910390fd5b5b5050565b60605f61151e83611584565b90505f602067ffffffffffffffff81111561153c5761153b611b93565b5b6040519080825280601f01601f19166020018201604052801561156e5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f8060ff835f1c169050601f8111156115c9576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611614826115d2565b61161e81856115dc565b935061162e8185602086016115ec565b611637816115fa565b840191505092915050565b5f6020820190508181035f83015261165a818461160a565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61168f82611666565b9050919050565b61169f81611685565b81146116a9575f80fd5b50565b5f813590506116ba81611696565b92915050565b5f819050919050565b6116d2816116c0565b81146116dc575f80fd5b50565b5f813590506116ed816116c9565b92915050565b5f806040838503121561170957611708611662565b5b5f611716858286016116ac565b9250506020611727858286016116df565b9150509250929050565b5f8115159050919050565b61174581611731565b82525050565b5f60208201905061175e5f83018461173c565b92915050565b61176d816116c0565b82525050565b5f6020820190506117865f830184611764565b92915050565b5f805f606084860312156117a3576117a2611662565b5b5f6117b0868287016116ac565b93505060206117c1868287016116ac565b92505060406117d2868287016116df565b9150509250925092565b5f60ff82169050919050565b6117f1816117dc565b82525050565b5f60208201905061180a5f8301846117e8565b92915050565b5f819050919050565b61182281611810565b82525050565b5f60208201905061183b5f830184611819565b92915050565b5f6020828403121561185657611855611662565b5b5f611863848285016116ac565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6118a08161186c565b82525050565b6118af81611685565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6118e7816116c0565b82525050565b5f6118f883836118de565b60208301905092915050565b5f602082019050919050565b5f61191a826118b5565b61192481856118bf565b935061192f836118cf565b805f5b8381101561195f57815161194688826118ed565b975061195183611904565b925050600181019050611932565b5085935050505092915050565b5f60e08201905061197f5f83018a611897565b8181036020830152611991818961160a565b905081810360408301526119a5818861160a565b90506119b46060830187611764565b6119c160808301866118a6565b6119ce60a0830185611819565b81810360c08301526119e08184611910565b905098975050505050505050565b5f602082019050611a015f8301846118a6565b92915050565b611a10816117dc565b8114611a1a575f80fd5b50565b5f81359050611a2b81611a07565b92915050565b611a3a81611810565b8114611a44575f80fd5b50565b5f81359050611a5581611a31565b92915050565b5f805f805f805f60e0888a031215611a7657611a75611662565b5b5f611a838a828b016116ac565b9750506020611a948a828b016116ac565b9650506040611aa58a828b016116df565b9550506060611ab68a828b016116df565b9450506080611ac78a828b01611a1d565b93505060a0611ad88a828b01611a47565b92505060c0611ae98a828b01611a47565b91505092959891949750929550565b5f8060408385031215611b0e57611b0d611662565b5b5f611b1b858286016116ac565b9250506020611b2c858286016116ac565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611b7a57607f821691505b602082108103611b8d57611b8c611b36565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60c082019050611bd35f830189611819565b611be060208301886118a6565b611bed60408301876118a6565b611bfa6060830186611764565b611c076080830185611764565b611c1460a0830184611764565b979650505050505050565b5f604082019050611c325f8301856118a6565b611c3f60208301846118a6565b9392505050565b5f606082019050611c595f8301866118a6565b611c666020830185611764565b611c736040830184611764565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611cb2826116c0565b9150611cbd836116c0565b9250828201905080821115611cd557611cd4611c7b565b5b92915050565b5f60a082019050611cee5f830188611819565b611cfb6020830187611819565b611d086040830186611819565b611d156060830185611764565b611d2260808301846118a6565b9695505050505050565b5f608082019050611d3f5f830187611819565b611d4c60208301866117e8565b611d596040830185611819565b611d666060830184611819565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea2646970667358221220f2abf413366692e0f4725ec58fccab2d863586f17bea31e17311f5cda1a9e8b864736f6c634300081a0033

    Deployed Bytecode

    0x608060405234801561000f575f80fd5b50600436106100fe575f3560e01c80637ecebe0011610095578063a9059cbb11610064578063a9059cbb146102a4578063d505accf146102d4578063dd62ed3e146102f0578063f2fde38b14610320576100fe565b80637ecebe001461021457806384b0196e146102445780638da5cb5b1461026857806395d89b4114610286576100fe565b8063313ce567116100d1578063313ce5671461019e5780633644e515146101bc57806370a08231146101da578063715018a61461020a576100fe565b806306fdde0314610102578063095ea7b31461012057806318160ddd1461015057806323b872dd1461016e575b5f80fd5b61010a61033c565b6040516101179190611642565b60405180910390f35b61013a600480360381019061013591906116f3565b6103cc565b604051610147919061174b565b60405180910390f35b6101586103ee565b6040516101659190611773565b60405180910390f35b6101886004803603810190610183919061178c565b6103f7565b604051610195919061174b565b60405180910390f35b6101a6610425565b6040516101b391906117f7565b60405180910390f35b6101c461042d565b6040516101d19190611828565b60405180910390f35b6101f460048036038101906101ef9190611841565b61043b565b6040516102019190611773565b60405180910390f35b610212610480565b005b61022e60048036038101906102299190611841565b610493565b60405161023b9190611773565b60405180910390f35b61024c6104a4565b60405161025f979695949392919061196c565b60405180910390f35b610270610549565b60405161027d91906119ee565b60405180910390f35b61028e610571565b60405161029b9190611642565b60405180910390f35b6102be60048036038101906102b991906116f3565b610601565b6040516102cb919061174b565b60405180910390f35b6102ee60048036038101906102e99190611a5b565b610623565b005b61030a60048036038101906103059190611af8565b610768565b6040516103179190611773565b60405180910390f35b61033a60048036038101906103359190611841565b6107ea565b005b60606003805461034b90611b63565b80601f016020809104026020016040519081016040528092919081815260200182805461037790611b63565b80156103c25780601f10610399576101008083540402835291602001916103c2565b820191905f5260205f20905b8154815290600101906020018083116103a557829003601f168201915b5050505050905090565b5f806103d661086e565b90506103e3818585610875565b600191505092915050565b5f600254905090565b5f8061040161086e565b905061040e858285610887565b610419858585610919565b60019150509392505050565b5f6012905090565b5f610436610a09565b905090565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610488610abf565b6104915f610b46565b565b5f61049d82610c09565b9050919050565b5f6060805f805f60606104b5610c4f565b6104bd610c8a565b46305f801b5f67ffffffffffffffff8111156104dc576104db611b93565b5b60405190808252806020026020018201604052801561050a5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461058090611b63565b80601f01602080910402602001604051908101604052809291908181526020018280546105ac90611b63565b80156105f75780601f106105ce576101008083540402835291602001916105f7565b820191905f5260205f20905b8154815290600101906020018083116105da57829003601f168201915b5050505050905090565b5f8061060b61086e565b9050610618818585610919565b600191505092915050565b8342111561066857836040517f6279130200000000000000000000000000000000000000000000000000000000815260040161065f9190611773565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886106968c610cc5565b896040516020016106ac96959493929190611bc0565b6040516020818303038152906040528051906020012090505f6106ce82610d18565b90505f6106dd82878787610d31565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461075157808a6040517f4b800e46000000000000000000000000000000000000000000000000000000008152600401610748929190611c1f565b60405180910390fd5b61075c8a8a8a610875565b50505050505050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6107f2610abf565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610862575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161085991906119ee565b60405180910390fd5b61086b81610b46565b50565b5f33905090565b6108828383836001610d5f565b505050565b5f6108928484610768565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109135781811015610904578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016108fb93929190611c46565b60405180910390fd5b61091284848484035f610d5f565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610989575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161098091906119ee565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109f9575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016109f091906119ee565b60405180910390fd5b610a04838383610f2e565b505050565b5f7f000000000000000000000000c0ec0089e359ec8c72741f08322995bb75a0a42373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610a8457507f000000000000000000000000000000000000000000000000000000000000009246145b15610ab1577f3d17b937f0255038a4819940592a6c3e1182ae5e9c19d2c1dfa3854582ecab9e9050610abc565b610ab9611147565b90505b90565b610ac761086e565b73ffffffffffffffffffffffffffffffffffffffff16610ae5610549565b73ffffffffffffffffffffffffffffffffffffffff1614610b4457610b0861086e565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610b3b91906119ee565b60405180910390fd5b565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6060610c8560057f4b6e75636b6c65730000000000000000000000000000000000000000000000086111dc90919063ffffffff16565b905090565b6060610cc060067f31000000000000000000000000000000000000000000000000000000000000016111dc90919063ffffffff16565b905090565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b5f610d2a610d24610a09565b83611289565b9050919050565b5f805f80610d41888888886112c9565b925092509250610d5182826113b0565b829350505050949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610dcf575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610dc691906119ee565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e3f575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610e3691906119ee565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610f28578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610f1f9190611773565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f7e578060025f828254610f729190611ca8565b9250508190555061104c565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611007578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610ffe93929190611c46565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611093578060025f82825403925050819055506110dd565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161113a9190611773565b60405180910390a3505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f0cbddbc52800f41548691792c3044b8bb3458f4ee2eee781e9642861c11354927fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016111c1959493929190611cdb565b60405160208183030381529060405280519060200120905090565b606060ff5f1b83146111f8576111f183611512565b9050611283565b81805461120490611b63565b80601f016020809104026020016040519081016040528092919081815260200182805461123090611b63565b801561127b5780601f106112525761010080835404028352916020019161127b565b820191905f5260205f20905b81548152906001019060200180831161125e57829003601f168201915b505050505090505b92915050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115611305575f6003859250925092506113a6565b5f6001888888886040515f81526020016040526040516113289493929190611d2c565b6020604051602081039080840390855afa158015611348573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611399575f60015f801b935093509350506113a6565b805f805f1b935093509350505b9450945094915050565b5f60038111156113c3576113c2611d6f565b5b8260038111156113d6576113d5611d6f565b5b031561150e57600160038111156113f0576113ef611d6f565b5b82600381111561140357611402611d6f565b5b0361143a576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600381111561144e5761144d611d6f565b5b82600381111561146157611460611d6f565b5b036114a557805f1c6040517ffce698f700000000000000000000000000000000000000000000000000000000815260040161149c9190611773565b60405180910390fd5b6003808111156114b8576114b7611d6f565b5b8260038111156114cb576114ca611d6f565b5b0361150d57806040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004016115049190611828565b60405180910390fd5b5b5050565b60605f61151e83611584565b90505f602067ffffffffffffffff81111561153c5761153b611b93565b5b6040519080825280601f01601f19166020018201604052801561156e5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f8060ff835f1c169050601f8111156115c9576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611614826115d2565b61161e81856115dc565b935061162e8185602086016115ec565b611637816115fa565b840191505092915050565b5f6020820190508181035f83015261165a818461160a565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61168f82611666565b9050919050565b61169f81611685565b81146116a9575f80fd5b50565b5f813590506116ba81611696565b92915050565b5f819050919050565b6116d2816116c0565b81146116dc575f80fd5b50565b5f813590506116ed816116c9565b92915050565b5f806040838503121561170957611708611662565b5b5f611716858286016116ac565b9250506020611727858286016116df565b9150509250929050565b5f8115159050919050565b61174581611731565b82525050565b5f60208201905061175e5f83018461173c565b92915050565b61176d816116c0565b82525050565b5f6020820190506117865f830184611764565b92915050565b5f805f606084860312156117a3576117a2611662565b5b5f6117b0868287016116ac565b93505060206117c1868287016116ac565b92505060406117d2868287016116df565b9150509250925092565b5f60ff82169050919050565b6117f1816117dc565b82525050565b5f60208201905061180a5f8301846117e8565b92915050565b5f819050919050565b61182281611810565b82525050565b5f60208201905061183b5f830184611819565b92915050565b5f6020828403121561185657611855611662565b5b5f611863848285016116ac565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6118a08161186c565b82525050565b6118af81611685565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6118e7816116c0565b82525050565b5f6118f883836118de565b60208301905092915050565b5f602082019050919050565b5f61191a826118b5565b61192481856118bf565b935061192f836118cf565b805f5b8381101561195f57815161194688826118ed565b975061195183611904565b925050600181019050611932565b5085935050505092915050565b5f60e08201905061197f5f83018a611897565b8181036020830152611991818961160a565b905081810360408301526119a5818861160a565b90506119b46060830187611764565b6119c160808301866118a6565b6119ce60a0830185611819565b81810360c08301526119e08184611910565b905098975050505050505050565b5f602082019050611a015f8301846118a6565b92915050565b611a10816117dc565b8114611a1a575f80fd5b50565b5f81359050611a2b81611a07565b92915050565b611a3a81611810565b8114611a44575f80fd5b50565b5f81359050611a5581611a31565b92915050565b5f805f805f805f60e0888a031215611a7657611a75611662565b5b5f611a838a828b016116ac565b9750506020611a948a828b016116ac565b9650506040611aa58a828b016116df565b9550506060611ab68a828b016116df565b9450506080611ac78a828b01611a1d565b93505060a0611ad88a828b01611a47565b92505060c0611ae98a828b01611a47565b91505092959891949750929550565b5f8060408385031215611b0e57611b0d611662565b5b5f611b1b858286016116ac565b9250506020611b2c858286016116ac565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611b7a57607f821691505b602082108103611b8d57611b8c611b36565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60c082019050611bd35f830189611819565b611be060208301886118a6565b611bed60408301876118a6565b611bfa6060830186611764565b611c076080830185611764565b611c1460a0830184611764565b979650505050505050565b5f604082019050611c325f8301856118a6565b611c3f60208301846118a6565b9392505050565b5f606082019050611c595f8301866118a6565b611c666020830185611764565b611c736040830184611764565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611cb2826116c0565b9150611cbd836116c0565b9250828201905080821115611cd557611cd4611c7b565b5b92915050565b5f60a082019050611cee5f830188611819565b611cfb6020830187611819565b611d086040830186611819565b611d156060830185611764565b611d2260808301846118a6565b9695505050505050565b5f608082019050611d3f5f830187611819565b611d4c60208301866117e8565b611d596040830185611819565b611d666060830184611819565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea2646970667358221220f2abf413366692e0f4725ec58fccab2d863586f17bea31e17311f5cda1a9e8b864736f6c634300081a0033

    [ 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.