ETH Price: $3,464.50 (+2.17%)
Gas: 7 Gwei

Token

PSI Gate (PSI/ACC)
 

Overview

Max Total Supply

6,000 PSI/ACC

Holders

0

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Null: 0x000...000
Balance
0 PSI/ACC

Value
$0.00
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x3e1B175b...261398022
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
ERC404M

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}

File 2 of 7 : SignedMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

File 3 of 7 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./math/Math.sol";
import "./math/SignedMath.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @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;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

File 4 of 7 : ERC404M.sol
// SPDX-License-Identifier: BUSL-1.1
// Metadrop Contracts (v2.1.0)

pragma solidity ^0.8.0;

import "../ThirdParty/ERC404/erc404.sol";
import {IErrors} from "../Global/IErrors.sol";
import {Revert} from "../Global/Revert.sol";

import "@openzeppelin/contracts/utils/Strings.sol";

contract ERC404M is ERC404 {
  string baseURI;

  event ERC404MCreated(
    string name,
    string symbol,
    uint256 totalNativeSupply,
    address indexed deployer
  );

/**
 * @dev Constructor
 *
 * @param baseURI_ The base URI for the token
 * @param recipients_ The recipients of the initial distribution
 * @param amounts_ The amounts of the initial distribution
 * @param name_ The name of the token
 * @param symbol_ The symbol of the token
 * @param decimals_ The number of decimals for the token
 * @param totalNativeSupply_ The total supply of the token
 * @param owner_ The owner of the contract
 */
  constructor(
    string memory baseURI_,
    address[] memory recipients_,
    uint256[] memory amounts_,
    string memory name_,
    string memory symbol_,
    uint8 decimals_,
    uint256 totalNativeSupply_,
    address owner_
  ) payable ERC404(name_, symbol_, decimals_, totalNativeSupply_, owner_) {
    baseURI = baseURI_;

    balanceOf[address(this)] = totalNativeSupply_ * 10 ** decimals_;
    setWhitelist(address(this), true);
    setWhitelist(owner, true);

    _distribute(recipients_, amounts_);
    balanceOf[owner] = balanceOf[address(this)];
    balanceOf[address(this)] = 0;

    require(
      msg.value == 1 * 10**17,
      "ERC404M: Must send 0.1 ETH to initialize"
    );

    // METADROP_TREASURY_ADDRESS
    (bool success, ) = address(0xDE3FF2A50bd1BA1bd6a608EA0138946Dddf595bc).call{value: msg.value}("");
    require(success, "ERC404M: Failed to send ETH to treasury");

    emit ERC404MCreated(
      name_,
      symbol_,
      totalNativeSupply_,
      owner_
    );
  }
  /**
   * @dev function {distribute}
   *
   * Distribute tokens to the recipients
   *
   * @param recipients_ The recipients of the distribution
   * @param amounts_ The amounts of the distribution
   *
   */
  function _distribute(
    address[] memory recipients_,
    uint256[] memory amounts_
  ) private
  {
    require(
      recipients_.length == amounts_.length,
      "ERC404M: Amounts and recipients must be the same length"
    );
    uint256 totalAmount = 0;
    for (uint256 i = 0; i < recipients_.length; i++) {
      _transfer(address(this), recipients_[i], amounts_[i]);
      totalAmount += amounts_[i];
    }
  }

  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  //
  // ERC721 Functions
  //
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  /**
   * @dev function {setBaseURI}
   *
   * Set the base URI for the token
   *
   * @param baseURI_ The base URI to set
   *
   */
  function setBaseURI(string memory baseURI_) public onlyOwner {
    baseURI = baseURI_;
  }

  /**
   * @dev function {tokenURI}
   *
   *  Returns the URI for a given token ID. Wraps if the tokenID is bigger than total supply.
   *
   * @param tokenId_ The token ID to query
   *
   * @return string The URI for the token
   */
  function tokenURI(
    uint256 tokenId_
  ) public view override returns (string memory) {
    uint256 wrapper = tokenId_ % (totalSupply / (10 ** decimals));
    return
      bytes(baseURI).length != 0
        ? string(abi.encodePacked(baseURI, Strings.toString(wrapper)))
        : "";
  }
}

File 5 of 7 : IErrors.sol
// SPDX-License-Identifier: MIT
// Metadrop Contracts (v2.1.0)

/**
 *
 * @title IErrors.sol. Interface for error definitions used across the platform
 *
 * @author metadrop https://metadrop.com/
 *
 */

pragma solidity 0.8.21;

interface IErrors {
  enum BondingCurveErrorType {
    OK, //                                                  No error
    INVALID_NUMITEMS, //                                    The numItem value is 0
    SPOT_PRICE_OVERFLOW //                                  The updated spot price doesn't fit into 128 bits
  }

  error AdapterParamsMustBeEmpty(); //                      The adapter parameters on this LZ call must be empty.

  error AdditionToPoolIsBelowPerTransactionMinimum(); //    The contribution amount is less than the minimum.

  error AdditionToPoolWouldExceedPoolCap(); //              This addition to the pool would exceed the pool cap.

  error AdditionToPoolWouldExceedPerAddressCap(); //        This addition to the pool would exceed the per address cap.

  error AddressAlreadySet(); //                             The address being set can only be set once, and is already non-0.

  error AllowanceDecreasedBelowZero(); //                   You cannot decrease the allowance below zero.

  error AlreadyInitialised(); //                            The contract is already initialised: it cannot be initialised twice!

  error AmountExceedsAvailable(); //                        You are requesting more token than is available.

  error ApprovalCallerNotOwnerNorApproved(); //             The caller must own the token or be an approved operator.

  error ApproveFromTheZeroAddress(); //                     Approval cannot be called from the zero address (indeed, how have you??).

  error ApproveToTheZeroAddress(); //                       Approval cannot be given to the zero address.

  error ApprovalQueryForNonexistentToken(); //              The token does not exist.

  error AuctionStatusIsNotEnded(); //                       Throw if the action required the auction to be closed, and it isn't.

  error AuctionStatusIsNotOpen(); //                        Throw if the action requires the auction to be open, and it isn't.

  error AuxCallFailed(
    address[] modules,
    uint256 value,
    bytes data,
    uint256 txGas
  ); //                                                     An auxilliary call from the drop factory failed.

  error BalanceMismatch(); //                               An error when comparing balance amounts.

  error BalanceQueryForZeroAddress(); //                    Cannot query the balance for the zero address.

  error BidMustBeBelowTheFloorWhenReducingQuantity(); //    Only bids that are below the floor can reduce the quantity of the bid.

  error BidMustBeBelowTheFloorForRefundDuringAuction(); //  Only bids that are below the floor can be refunded during the auction.

  error BondingCurveError(BondingCurveErrorType error); //  An error of the type specified has occured in bonding curve processing.

  error botProtectionDurationInSecondsMustFitUint128(); //  botProtectionDurationInSeconds cannot be too large.

  error BurnExceedsBalance(); //                            The amount you have selected to burn exceeds the addresses balance.

  error BurnFromTheZeroAddress(); //                        Tokens cannot be burned from the zero address. (Also, how have you called this!?!)

  error CallerIsNotDepositBoxOwner(); //                    The caller is not the owner of the deposit box.

  error CallerIsNotFactory(); //                            The caller of this function must match the factory address in storage.

  error CallerIsNotFactoryOrProjectOwner(); //              The caller of this function must match the factory address OR project owner address.

  error CallerIsNotFactoryProjectOwnerOrPool(); //          The caller of this function must match the factory address, project owner or pool address.

  error CallerIsNotTheFeeRecipient(); //                    The caller is not the fee recipient.

  error CallerIsNotTheOwner(); //                           The caller is not the owner of this contract.

  error CallerIsNotTheManager(); //                         The caller is not the manager of this contract.

  error CallerMustBeLzApp(); //                             The caller must be an LZ application.

  error CallerIsNotPlatformAdmin(address caller); //        The caller of this function must be part of the platformAdmin group.

  error CallerIsNotSuperAdmin(address caller); //           The caller of this function must match the superAdmin address in storage.

  error CannotAddLiquidityOnCreateAndUseDRIPool(); //       Cannot use both liquidity added on create and a DRIPool in the same token.

  error CannotManuallyFundLPWhenUsingADRIPool(); //         Cannot add liquidity manually when using a DRI pool.

  error CannotPerformDuringAutoswap(); //                   Cannot call this function during an autoswap.

  error CannotPerformPriorToFunding(); //                   Cannot perform this operation before a token is funded (i.e. liquidity added).

  error CannotSetNewOwnerToTheZeroAddress(); //             You can't set the owner of this contract to the zero address (address(0)).

  error CannotSetToZeroAddress(); //                        The corresponding address cannot be set to the zero address (address(0)).

  error CannotSetNewManagerToTheZeroAddress(); //           Cannot transfer the manager to the zero address (address(0)).

  error CannotWithdrawThisToken(); //                       Cannot withdraw the specified token.

  error CanOnlyReduce(); //                                 The given operation can only reduce the value specified.

  error CollectionAlreadyRevealed(); //                     The collection is already revealed; you cannot call reveal again.

  error ContractIsDecommissioned(); //                      This contract is decommissioned!

  error ContractIsPaused(); //                              The call requires the contract to be unpaused, and it is paused.

  error ContractIsNotPaused(); //                           The call required the contract to be paused, and it is NOT paused.

  error DecreasedAllowanceBelowZero(); //                   The request would decrease the allowance below zero, and that is not allowed.

  error DestinationIsNotTrustedSource(); //                 The destination that is being called through LZ has not been set as trusted.

  error DeductionsOnBuyExceedOrEqualOneHundredPercent(); // The total of all buy deductions cannot equal or exceed 100%.

  error DeployerOnly(); //                                  This method can only be called by the deployer address.

  error DeploymentError(); //                               Error on deployment.

  error DepositBoxIsNotOpen(); //                           This action cannot complete as the deposit box is not open.

  error DriPoolAddressCannotBeAddressZero(); //             The Dri Pool address cannot be the zero address.

  error GasLimitIsTooLow(); //                              The gas limit for the LayerZero call is too low.

  error IncorrectConfirmationValue(); //                    You need to enter the right confirmation value to call this funtion (usually 69420).

  error IncorrectPayment(); //                              The function call did not include passing the correct payment.

  error InitialLiquidityAlreadyAdded(); //                  Initial liquidity has already been added. You can't do it again.

  error InitialLiquidityNotYetAdded(); //                   Initial liquidity needs to have been added for this to succedd.

  error InsufficientAllowance(); //                         There is not a high enough allowance for this operation.

  error InvalidAdapterParams(); //                          The current adapter params for LayerZero on this contract won't work :(.

  error InvalidAddress(); //                                An address being processed in the function is not valid.

  error InvalidEndpointCaller(); //                         The calling address is not a valid LZ endpoint. The LZ endpoint was set at contract creation
  //                                                        and cannot be altered after. Check the address LZ endpoint address on the contract.

  error InvalidHash(); //                                   The passed hash does not meet requirements.

  error InvalidMinGas(); //                                 The minimum gas setting for LZ in invalid.

  error InvalidOracleSignature(); //                        The signature provided with the contract call is not valid, either in format or signer.

  error InvalidPayload(); //                                The LZ payload is invalid

  error InvalidReceiver(); //                               The address used as a target for funds is not valid.

  error InvalidSourceSendingContract(); //                  The LZ message is being related from a source contract on another chain that is NOT trusted.

  error InvalidTotalShares(); //                            Total shares must equal 100 percent in basis points.

  error LimitsCanOnlyBeRaised(); //                         Limits are UP ONLY.

  error LimitTooHigh(); //                                  The limit has been set too high.

  error ListLengthMismatch(); //                            Two or more lists were compared and they did not match length.

  error LiquidityPoolMustBeAContractAddress(); //           Cannot add a non-contract as a liquidity pool.

  error LiquidityPoolCannotBeAddressZero(); //              Cannot add a liquidity pool from the zero address.

  error LPLockUpMustFitUint88(); //                         LP lockup is held in a uint88, so must fit.

  error NoTrustedPathRecord(); //                           LZ needs a trusted path record for this to work. What's that, you ask?

  error MachineAddressCannotBeAddressZero(); //             Cannot set the machine address to the zero address.

  error ManagerUnauthorizedAccount(); //                    The caller is not the pending manager.

  error MaxBidQuantityIs255(); //                           Validation: as we use a uint8 array to track bid positions the max bid quantity is 255.

  error MaxBuysPerBlockExceeded(); //                       You have exceeded the max buys per block.

  error MaxPublicMintAllowanceExceeded(
    uint256 requested,
    uint256 alreadyMinted,
    uint256 maxAllowance
  ); //                                                     The calling address has requested a quantity that would exceed the max allowance.

  error MaxSupplyTooHigh(); //                              Max supply must fit in a uint128.

  error MaxTokensPerWalletExceeded(); //                    The transfer would exceed the max tokens per wallet limit.

  error MaxTokensPerTxnExceeded(); //                       The transfer would exceed the max tokens per transaction limit.

  error MetadataIsLocked(); //                              The metadata on this contract is locked; it cannot be altered!

  error MetadropFactoryOnlyOncePerReveal(); //              This function can only be called (a) by the factory and, (b) just one time!

  error MetadropModulesOnly(); //                           Can only be called from a metadrop contract.

  error MetadropOracleCannotBeAddressZero(); //             The metadrop Oracle cannot be the zero address (address(0)).

  error MinETHCannotExceedMaxBuy(); //                      The min ETH amount cannot exceed the max buy amount.

  error MinETHCannotExceedMaxLiquidity(); //                The min ETH amount cannot exceed the max liquidity amount.

  error MinGasLimitNotSet(); //                             The minimum gas limit for LayerZero has not been set.

  error MintERC2309QuantityExceedsLimit(); //               The `quantity` minted with ERC2309 exceeds the safety limit.

  error MintingIsClosedForever(); //                        Minting is, as the error suggests, so over (and locked forever).

  error MintToZeroAddress(); //                             Cannot mint to the zero address.

  error MintZeroQuantity(); //                              The quantity of tokens minted must be more than zero.

  error NewBuyTaxBasisPointsExceedsMaximum(); //            Project owner trying to set the tax rate too high.

  error NewSellTaxBasisPointsExceedsMaximum(); //           Project owner trying to set the tax rate too high.

  error NoETHForLiquidityPair(); //                         No ETH has been provided for the liquidity pair.

  error TaxPeriodStillInForce(); //                         The minimum tax period has not yet expired.

  error NoPaymentDue(); //                                  No payment is due for this address.

  error NoRefundForCaller(); //                             Error thrown when the calling address has no refund owed.

  error NoStoredMessage(); //                               There is no stored message matching the passed parameters.

  error NothingToClaim(); //                                The calling address has nothing to claim.

  error NoTokenForLiquidityPair(); //                       There is no token to add to the LP.

  error OperationDidNotSucceed(); //                        The operation failed (vague much?).

  error OracleSignatureHasExpired(); //                     A signature has been provided but it is too old.

  error OwnableUnauthorizedAccount(); //                    The caller is not the pending owner.

  error OwnershipNotInitializedForExtraData(); //           The `extraData` cannot be set on an uninitialized ownership slot.

  error OwnerQueryForNonexistentToken(); //                 The token does not exist.

  error ParametersDoNotMatchSignedMessage(); //             The parameters passed with the signed message do not match the message itself.

  error ParamTooLargeStartDate(); //                        The passed parameter exceeds the var type max.

  error ParamTooLargeEndDate(); //                          The passed parameter exceeds the var type max.

  error ParamTooLargeMinETH(); //                           The passed parameter exceeds the var type max.

  error ParamTooLargePerAddressMax(); //                    The passed parameter exceeds the var type max.

  error ParamTooLargeVestingDays(); //                      The passed parameter exceeds the var type max.

  error ParamTooLargePoolSupply(); //                       The passed parameter exceeds the var type max.

  error ParamTooLargePoolMaxETH(); //                       The passed parameter exceeds the var type max.

  error ParamTooLargePoolPerTxnMinETH(); //                 The passed parameter exceeds the var type max.

  error ParamTooLargeContributionFee(); //                  The passed parameter exceeds the var type max.

  error ParamTooLargeMaxInitialBuy(); //                    The passed parameter exceeds the var type max.

  error ParamTooLargeMaxInitialLiquidity(); //              The passed parameter exceeds the var type max.

  error PassedConfigDoesNotMatchApproved(); //              The config provided on the call does not match the approved config.

  error PauseCutOffHasPassed(); //                          The time period in which we can pause has passed; this contract can no longer be paused.

  error PaymentMustCoverPerMintFee(); //                    The payment passed must at least cover the per mint fee for the quantity requested.

  error PermitDidNotSucceed(); //                           The safeERC20 permit failed.

  error PlatformAdminCannotBeAddressZero(); //              We cannot use the zero address (address(0)) as a platformAdmin.

  error PlatformTreasuryCannotBeAddressZero(); //           The treasury address cannot be set to the zero address.

  error PoolCannotBeManuallyStarted(); //                   This pool cannot be manually started.

  error PoolIsAboveMinimum(); //                            You required the pool to be below the minimum, and it is not

  error PoolIsBelowMinimum(); //                            You required the pool to be above the minimum, and it is not

  error PoolMustBeSeededWithETHForInitialLiquidity(); //    You must pass ETH for liquidity with this type of pool.

  error PoolPhaseIsNotOpen(); //                            The block.timestamp is either before the pool is open or after it is closed.

  error PoolPhaseIsNotFailed(); //                          The pool status must be failed.

  error PoolPhaseIsNotSucceeded(); //                       The pool status must be succeeded.

  error PoolVestingNotYetComplete(); //                     Tokens in the pool are not yet vested.

  error ProjectOwnerCannotBeAddressZero(); //               The project owner has to be a non zero address.

  error ProofInvalid(); //                                  The provided proof is not valid with the provided arguments.

  error QuantityExceedsRemainingCollectionSupply(); //      The requested quantity would breach the collection supply.

  error QuantityExceedsRemainingPhaseSupply(); //           The requested quantity would breach the phase supply.

  error QuantityExceedsMaxPossibleCollectionSupply(); //    The requested quantity would breach the maximum trackable supply

  error RecipientsAndAmountsMismatch(); //                  The number of recipients and amounts do not match.

  error ReferralIdAlreadyUsed(); //                         This referral ID has already been used; they are one use only.

  error RequestingMoreThanAvailableBalance(); //             The request exceeds the available balance.

  error RequestingMoreThanRemainingAllocation(
    uint256 previouslyMinted,
    uint256 requested,
    uint256 remainingAllocation
  ); //                                                     Number of tokens requested for this mint exceeds the remaining allocation (taking the
  //                                                        original allocation from the list and deducting minted tokens).

  error RouterCannotBeZeroAddress(); //                     The router address cannot be Zero.

  error RoyaltyFeeWillExceedSalePrice(); //                 The ERC2981 royalty specified will exceed the sale price.

  error ShareTotalCannotBeZero(); //                        The total of all the shares cannot be nothing.

  error SliceOutOfBounds(); //                              The bytes slice operation was out of bounds.

  error SliceOverflow(); //                                 The bytes slice operation overlowed.

  error SuperAdminCannotBeAddressZero(); //                 The superAdmin cannot be the sero address (address(0)).

  error SupplyTotalMismatch(); //                           The sum of the team supply and lp supply does not match.

  error SupportWindowIsNotOpen(); //                        The project owner has not requested support within the support request expiry window.

  error SwapThresholdTooLow(); // The select swap threshold is below the minimum.

  error TaxFreeAddressCannotBeAddressZero(); //             A tax free address cannot be address(0)

  error TemplateCannotBeAddressZero(); //                   The address for a template cannot be address zero (address(0)).

  error TemplateNotFound(); //                              There is no template that matches the passed template Id.

  error ThisMintIsClosed(); //                              It's over (well, this mint is, anyway).

  error TotalSharesMustMatchDenominator(); //               The total of all shares must equal the denominator value.

  error TransferAmountExceedsBalance(); //                  The transfer amount exceeds the accounts available balance.

  error TransferCallerNotOwnerNorApproved(); //             The caller must own the token or be an approved operator.

  error TransferFailed(); //                                The transfer has failed.

  error TransferFromIncorrectOwner(); //                    The token must be owned by `from`.

  error TransferToNonERC721ReceiverImplementer(); //        Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.

  error TransferFromZeroAddress(); //                       Cannot transfer from the zero address. Indeed, this surely is impossible, and likely a waste to check??

  error TransferToZeroAddress(); //                         Cannot transfer to the zero address.

  error UnrecognisedVRFMode(); //                           Currently supported VRF modes are 0: chainlink and 1: arrng

  error UnrecognisedType(); //                              Pool type not found.

  error URIQueryForNonexistentToken(); //                   The token does not exist.

  error ValueExceedsMaximum(); //                           The value sent exceeds the maximum allowed (super useful explanation huh?).

  error VRFCoordinatorCannotBeAddressZero(); //             The VRF coordinator cannot be the zero address (address(0)).

  error VestedBalanceExceedsTotalBalance(); //              The vested balance cannot exceed the total balance.
}

File 6 of 7 : Revert.sol
// SPDX-License-Identifier: MIT
// Metadrop Contracts (v2.1.0)

/**
 *
 * @title Revert.sol. For efficient reverts
 *
 * @author metadrop https://metadrop.com/
 *
 */

pragma solidity 0.8.21;

abstract contract Revert {
  /**
   * @dev For more efficient reverts.
   */
  function _revert(bytes4 errorSelector) internal pure {
    assembly {
      mstore(0x00, errorSelector)
      revert(0x00, 0x04)
    }
  }
}

File 7 of 7 : erc404.sol
// https://github.com/0xacme/ERC404
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

abstract contract Ownable {
  event OwnershipTransferred(address indexed user, address indexed newOwner);

  error Unauthorized();
  error InvalidOwner();

  address public owner;

  modifier onlyOwner() virtual {
    if (msg.sender != owner) revert Unauthorized();

    _;
  }

  constructor(address _owner) {
    if (_owner == address(0)) revert InvalidOwner();

    owner = _owner;

    emit OwnershipTransferred(address(0), _owner);
  }

  function transferOwnership(address _owner) public virtual onlyOwner {
    if (_owner == address(0)) revert InvalidOwner();

    owner = _owner;

    emit OwnershipTransferred(msg.sender, _owner);
  }

  function revokeOwnership() public virtual onlyOwner {
    owner = address(0);

    emit OwnershipTransferred(msg.sender, address(0));
  }
}

abstract contract ERC721Receiver {
  function onERC721Received(
    address,
    address,
    uint256,
    bytes calldata
  ) external virtual returns (bytes4) {
    return ERC721Receiver.onERC721Received.selector;
  }
}

/// @notice ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 is Ownable {
  // Events
  event ERC20Transfer(address indexed from, address indexed to, uint256 amount);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 amount
  );
  event Transfer(address indexed from, address indexed to, uint256 indexed id);
  event ERC721Approval(
    address indexed owner,
    address indexed spender,
    uint256 indexed id
  );
  event ApprovalForAll(
    address indexed owner,
    address indexed operator,
    bool approved
  );

  // Errors
  error NotFound();
  error AlreadyExists();
  error InvalidRecipient();
  error InvalidSender();
  error UnsafeRecipient();

  // Metadata
  /// @dev Token name
  string public name;

  /// @dev Token symbol
  string public symbol;

  /// @dev Decimals for fractional representation
  uint8 public immutable decimals;

  /// @dev Total supply in fractionalized representation
  uint256 public immutable totalSupply;

  /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
  uint256 public minted;

  // Mappings
  /// @dev Balance of user in fractional representation
  mapping(address => uint256) public balanceOf;

  /// @dev Allowance of user in fractional representation
  mapping(address => mapping(address => uint256)) public allowance;

  /// @dev Approval in native representaion
  mapping(uint256 => address) public getApproved;

  /// @dev Approval for all in native representation
  mapping(address => mapping(address => bool)) public isApprovedForAll;

  /// @dev Owner of id in native representation
  mapping(uint256 => address) internal _ownerOf;

  /// @dev Array of owned ids in native representation
  mapping(address => uint256[]) internal _owned;

  /// @dev Tracks indices for the _owned mapping
  mapping(uint256 => uint256) internal _ownedIndex;

  /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc)
  mapping(address => bool) public whitelist;

  // Constructor
  constructor(
    string memory _name,
    string memory _symbol,
    uint8 _decimals,
    uint256 _totalNativeSupply,
    address _owner
  ) Ownable(_owner) {
    name = _name;
    symbol = _symbol;
    decimals = _decimals;
    totalSupply = _totalNativeSupply * (10 ** decimals);
  }

  /// @notice Initialization function to set pairs / etc
  ///         saving gas by avoiding mint / burn on unnecessary targets
  function setWhitelist(address target, bool state) public onlyOwner {
    whitelist[target] = state;
  }

  /// @notice Function to find owner of a given native token
  function ownerOf(uint256 id) public view virtual returns (address owner) {
    owner = _ownerOf[id];

    if (owner == address(0)) {
      revert NotFound();
    }
  }

  /// @notice tokenURI must be implemented by child contract
  function tokenURI(uint256 id) public view virtual returns (string memory);

  /// @notice Function for token approvals
  /// @dev This function assumes id / native if amount less than or equal to current max id
  function approve(
    address spender,
    uint256 amountOrId
  ) public virtual returns (bool) {
    if (amountOrId <= minted && amountOrId > 0) {
      address owner = _ownerOf[amountOrId];

      if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) {
        revert Unauthorized();
      }

      getApproved[amountOrId] = spender;

      emit Approval(owner, spender, amountOrId);
    } else {
      allowance[msg.sender][spender] = amountOrId;

      emit Approval(msg.sender, spender, amountOrId);
    }

    return true;
  }

  /// @notice Function native approvals
  function setApprovalForAll(address operator, bool approved) public virtual {
    isApprovedForAll[msg.sender][operator] = approved;

    emit ApprovalForAll(msg.sender, operator, approved);
  }

  /// @notice Function for mixed transfers
  /// @dev This function assumes id / native if amount less than or equal to current max id
  function transferFrom(
    address from,
    address to,
    uint256 amountOrId
  ) public virtual {
    if (amountOrId <= minted) {
      if (from != _ownerOf[amountOrId]) {
        revert InvalidSender();
      }

      if (to == address(0)) {
        revert InvalidRecipient();
      }

      if (
        msg.sender != from &&
        !isApprovedForAll[from][msg.sender] &&
        msg.sender != getApproved[amountOrId]
      ) {
        revert Unauthorized();
      }

      balanceOf[from] -= _getUnit();

      unchecked {
        balanceOf[to] += _getUnit();
      }

      _ownerOf[amountOrId] = to;
      delete getApproved[amountOrId];

      // update _owned for sender
      uint256 updatedId = _owned[from][_owned[from].length - 1];
      _owned[from][_ownedIndex[amountOrId]] = updatedId;
      // pop
      _owned[from].pop();
      // update index for the moved id
      _ownedIndex[updatedId] = _ownedIndex[amountOrId];
      // push token to to owned
      _owned[to].push(amountOrId);
      // update index for to owned
      _ownedIndex[amountOrId] = _owned[to].length - 1;

      emit Transfer(from, to, amountOrId);
      emit ERC20Transfer(from, to, _getUnit());
    } else {
      uint256 allowed = allowance[from][msg.sender];
      if (from != address(this)) {
        require(
          allowed >= amountOrId,
          "ERC404: transfer amount exceeds allowance"
        );
        if (allowed != type(uint256).max)
          allowance[from][msg.sender] = allowed - amountOrId;
      }
      _transfer(from, to, amountOrId);
    }
  }

  /// @notice Function for fractional transfers
  function transfer(address to, uint256 amount) public virtual returns (bool) {
    return _transfer(msg.sender, to, amount);
  }

  /// @notice Function for native transfers with contract support
  function safeTransferFrom(
    address from,
    address to,
    uint256 id
  ) public virtual {
    transferFrom(from, to, id);

    if (
      to.code.length != 0 &&
      ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") !=
      ERC721Receiver.onERC721Received.selector
    ) {
      revert UnsafeRecipient();
    }
  }

  /// @notice Function for native transfers with contract support and callback data
  function safeTransferFrom(
    address from,
    address to,
    uint256 id,
    bytes calldata data
  ) public virtual {
    transferFrom(from, to, id);

    if (
      to.code.length != 0 &&
      ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) !=
      ERC721Receiver.onERC721Received.selector
    ) {
      revert UnsafeRecipient();
    }
  }

  /// @notice Internal function for fractional transfers
  function _transfer(
    address from,
    address to,
    uint256 amount
  ) internal returns (bool) {
    uint256 unit = _getUnit();
    uint256 balanceBeforeSender = balanceOf[from];
    uint256 balanceBeforeReceiver = balanceOf[to];
    balanceOf[from] -= amount;

    unchecked {
      balanceOf[to] += amount;
    }

    // Skip burn for certain addresses to save gas
    if (!whitelist[from]) {
      uint256 tokens_to_burn = (balanceBeforeSender / unit) -
        (balanceOf[from] / unit);
      for (uint256 i = 0; i < tokens_to_burn; i++) {
        _burn(from);
      }
    }

    // Skip minting for certain addresses to save gas
    if (!whitelist[to]) {
      uint256 tokens_to_mint = (balanceOf[to] / unit) -
        (balanceBeforeReceiver / unit);
      for (uint256 i = 0; i < tokens_to_mint; i++) {
        _mint(to);
      }
    }

    emit ERC20Transfer(from, to, amount);
    return true;
  }

  // Internal utility logic
  function _getUnit() internal view returns (uint256) {
    return 10 ** decimals;
  }

  function _mint(address to) internal virtual {
    if (to == address(0)) {
      revert InvalidRecipient();
    }

    unchecked {
      minted++;
    }

    uint256 id = minted;

    if (_ownerOf[id] != address(0)) {
      revert AlreadyExists();
    }

    _ownerOf[id] = to;
    _owned[to].push(id);
    _ownedIndex[id] = _owned[to].length - 1;

    emit Transfer(address(0), to, id);
  }

  function _burn(address from) internal virtual {
    if (from == address(0)) {
      revert InvalidSender();
    }

    uint256 id = _owned[from][_owned[from].length - 1];
    _owned[from].pop();
    delete _ownedIndex[id];
    delete _ownerOf[id];
    delete getApproved[id];

    emit Transfer(from, address(0), id);
  }

  function _setNameSymbol(string memory _name, string memory _symbol) internal {
    name = _name;
    symbol = _symbol;
  }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address[]","name":"recipients_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"totalNativeSupply_","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","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":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"totalNativeSupply","type":"uint256"},{"indexed":true,"internalType":"address","name":"deployer","type":"address"}],"name":"ERC404MCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","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":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","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":"amount","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":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c0604052604051620029a8380380620029a8833981016040819052620000269162000a72565b8484848484806001600160a01b03811662000054576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001620000aa868262000c04565b506002620000b9858262000c04565b5060ff83166080819052620000d090600a62000ddb565b620000dc908362000df2565b60a05250600c9350620000f692508b915083905062000c04565b506200010483600a62000ddb565b62000110908362000df2565b305f818152600460205260409020919091556200012f906001620002fe565b5f5462000147906001600160a01b03166001620002fe565b62000153878762000352565b305f81815260046020526040808220805483546001600160a01b0316845291832091909155918152905567016345785d8a00003414620001eb5760405162461bcd60e51b815260206004820152602860248201527f4552433430344d3a204d7573742073656e6420302e312045544820746f20696e604482015267697469616c697a6560c01b60648201526084015b60405180910390fd5b6040515f9073de3ff2a50bd1ba1bd6a608ea0138946dddf595bc9034908381818185875af1925050503d805f811462000240576040519150601f19603f3d011682016040523d82523d5f602084013e62000245565b606091505b5050905080620002a85760405162461bcd60e51b815260206004820152602760248201527f4552433430344d3a204661696c656420746f2073656e642045544820746f20746044820152667265617375727960c81b6064820152608401620001e2565b816001600160a01b03167f179e052d5933641aec302f60f8eb4e78833310a250dc2c32650b08cfbcef2411878786604051620002e79392919062000e39565b60405180910390a250505050505050505062000f01565b5f546001600160a01b0316331462000328576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b8051825114620003cb5760405162461bcd60e51b815260206004820152603760248201527f4552433430344d3a20416d6f756e747320616e6420726563697069656e74732060448201527f6d757374206265207468652073616d65206c656e6774680000000000000000006064820152608401620001e2565b5f805b835181101562000465576200042330858381518110620003f257620003f262000e72565b60200260200101518584815181106200040f576200040f62000e72565b60200260200101516200046b60201b60201c565b5082818151811062000439576200043962000e72565b6020026020010151826200044e919062000e86565b9150806200045c8162000e9c565b915050620003ce565b50505050565b5f806200047762000643565b6001600160a01b038087165f818152600460205260408082208054948a1683529082205492825293945091929091869190620004b4838662000eb7565b90915550506001600160a01b038087165f90815260046020908152604080832080548a019055928a168252600b9052205460ff166200055a576001600160a01b0387165f908152600460205260408120546200051290859062000ecd565b6200051e858562000ecd565b6200052a919062000eb7565b90505f5b81811015620005575762000542896200065a565b806200054e8162000e9c565b9150506200052e565b50505b6001600160a01b0386165f908152600b602052604090205460ff16620005e8575f62000587848362000ecd565b6001600160a01b0388165f90815260046020526040902054620005ac90869062000ecd565b620005b8919062000eb7565b90505f5b81811015620005e557620005d08862000772565b80620005dc8162000e9c565b915050620005bc565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516200062e91815260200190565b60405180910390a35060019695505050505050565b5f608051600a62000655919062000ddb565b905090565b6001600160a01b0381166200068257604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f9081526009602052604081208054620006a99060019062000eb7565b81548110620006bc57620006bc62000e72565b905f5260205f200154905060095f836001600160a01b03166001600160a01b031681526020019081526020015f20805480620006fc57620006fc62000eed565b5f828152602080822083015f19908101839055909201909255828252600a815260408083208390556008825280832080546001600160a01b031990811690915560069092528083208054909216909155518291906001600160a01b038516905f8051602062002988833981519152908390a45050565b6001600160a01b0381166200079a57604051634e46966960e11b815260040160405180910390fd5b60038054600101908190555f818152600860205260409020546001600160a01b031615620007db5760405163119b4fd360e11b815260040160405180910390fd5b5f81815260086020908152604080832080546001600160a01b0319166001600160a01b03871690811790915580845260098352908320805460018181018355828652938520018590559252905462000834919062000eb7565b5f828152600a602052604080822092909255905182916001600160a01b038516915f8051602062002988833981519152908290a45050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715620008ab57620008ab6200086c565b604052919050565b5f5b83811015620008cf578181015183820152602001620008b5565b50505f910152565b5f82601f830112620008e7575f80fd5b81516001600160401b038111156200090357620009036200086c565b62000918601f8201601f191660200162000880565b8181528460208386010111156200092d575f80fd5b62000940826020830160208701620008b3565b949350505050565b5f6001600160401b038211156200096357620009636200086c565b5060051b60200190565b80516001600160a01b038116811462000984575f80fd5b919050565b5f82601f83011262000999575f80fd5b81516020620009b2620009ac8362000948565b62000880565b82815260059290921b84018101918181019086841115620009d1575f80fd5b8286015b84811015620009f757620009e9816200096d565b8352918301918301620009d5565b509695505050505050565b5f82601f83011262000a12575f80fd5b8151602062000a25620009ac8362000948565b82815260059290921b8401810191818101908684111562000a44575f80fd5b8286015b84811015620009f7578051835291830191830162000a48565b805160ff8116811462000984575f80fd5b5f805f805f805f80610100898b03121562000a8b575f80fd5b88516001600160401b038082111562000aa2575f80fd5b62000ab08c838d01620008d7565b995060208b015191508082111562000ac6575f80fd5b62000ad48c838d0162000989565b985060408b015191508082111562000aea575f80fd5b62000af88c838d0162000a02565b975060608b015191508082111562000b0e575f80fd5b62000b1c8c838d01620008d7565b965060808b015191508082111562000b32575f80fd5b5062000b418b828c01620008d7565b94505062000b5260a08a0162000a61565b925060c0890151915062000b6960e08a016200096d565b90509295985092959890939650565b600181811c9082168062000b8d57607f821691505b60208210810362000bac57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000bff575f81815260208120601f850160051c8101602086101562000bda5750805b601f850160051c820191505b8181101562000bfb5782815560010162000be6565b5050505b505050565b81516001600160401b0381111562000c205762000c206200086c565b62000c388162000c31845462000b78565b8462000bb2565b602080601f83116001811462000c6e575f841562000c565750858301515b5f19600386901b1c1916600185901b17855562000bfb565b5f85815260208120601f198616915b8281101562000c9e5788860151825594840194600190910190840162000c7d565b508582101562000cbc57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111562000d2057815f190482111562000d045762000d0462000ccc565b8085161562000d1257918102915b93841c939080029062000ce5565b509250929050565b5f8262000d385750600162000dd5565b8162000d4657505f62000dd5565b816001811462000d5f576002811462000d6a5762000d8a565b600191505062000dd5565b60ff84111562000d7e5762000d7e62000ccc565b50506001821b62000dd5565b5060208310610133831016604e8410600b841016171562000daf575081810a62000dd5565b62000dbb838362000ce0565b805f190482111562000dd15762000dd162000ccc565b0290505b92915050565b5f62000deb60ff84168362000d28565b9392505050565b808202811582820484141762000dd55762000dd562000ccc565b5f815180845262000e25816020860160208601620008b3565b601f01601f19169290920160200192915050565b606081525f62000e4d606083018662000e0c565b828103602084015262000e61818662000e0c565b915050826040830152949350505050565b634e487b7160e01b5f52603260045260245ffd5b8082018082111562000dd55762000dd562000ccc565b5f6001820162000eb05762000eb062000ccc565b5060010190565b8181038181111562000dd55762000dd562000ccc565b5f8262000ee857634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603160045260245ffd5b60805160a051611a5062000f385f395f81816101d20152610cf801525f818161022401528181610ccc0152610e230152611a505ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c80636352211e116100bf578063a9059cbb11610079578063a9059cbb1461031b578063b88d4fde1461032e578063c87b56dd14610341578063dd62ed3e14610354578063e985e9c51461037e578063f2fde38b146103ab575f80fd5b80636352211e1461029a57806370a08231146102ad5780638da5cb5b146102cc57806395d89b41146102de5780639b19251a146102e6578063a22cb46514610308575f80fd5b80632b968958116101105780632b96895814610217578063313ce5671461021f57806342842e0e146102585780634f02c4201461026b57806353d6fd591461027457806355f804b314610287575f80fd5b806306fdde031461014c578063081812fc1461016a578063095ea7b3146101aa57806318160ddd146101cd57806323b872dd14610202575b5f80fd5b6101546103be565b60405161016191906113b9565b60405180910390f35b6101926101783660046113eb565b60066020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610161565b6101bd6101b8366004611418565b61044a565b6040519015158152602001610161565b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610161565b610215610210366004611440565b610595565b005b61021561097e565b6102467f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610161565b610215610266366004611440565b6109e2565b6101f460035481565b610215610282366004611479565b610ab3565b6102156102953660046114c6565b610b06565b6101926102a83660046113eb565b610b3f565b6101f46102bb366004611571565b60046020525f908152604090205481565b5f54610192906001600160a01b031681565b610154610b79565b6101bd6102f4366004611571565b600b6020525f908152604090205460ff1681565b610215610316366004611479565b610b86565b6101bd610329366004611418565b610bf1565b61021561033c36600461158a565b610c04565b61015461034f3660046113eb565b610cc4565b6101f461036236600461161d565b600560209081525f928352604080842090915290825290205481565b6101bd61038c36600461161d565b600760209081525f928352604080842090915290825290205460ff1681565b6102156103b9366004611571565b610d83565b600180546103cb9061164e565b80601f01602080910402602001604051908101604052809291908181526020018280546103f79061164e565b80156104425780601f1061041957610100808354040283529160200191610442565b820191905f5260205f20905b81548152906001019060200180831161042557829003601f168201915b505050505081565b5f600354821115801561045c57505f82115b15610530575f828152600860205260409020546001600160a01b03163381148015906104ab57506001600160a01b0381165f90815260076020908152604080832033845290915290205460ff16155b156104c8576040516282b42960e81b815260040160405180910390fd5b5f8381526006602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35061058b565b335f8181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b60035481116108a5575f818152600860205260409020546001600160a01b038481169116146105d757604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0382166105fe57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061063a57506001600160a01b0383165f90815260076020908152604080832033845290915290205460ff16155b801561065c57505f818152600660205260409020546001600160a01b03163314155b15610679576040516282b42960e81b815260040160405180910390fd5b610681610e1d565b6001600160a01b0384165f90815260046020526040812080549091906106a890849061169a565b909155506106b69050610e1d565b6001600160a01b038084165f81815260046020908152604080832080549096019095558582526008815284822080546001600160a01b03199081169094179055600681528482208054909316909255918616825260099052908120805461071f9060019061169a565b8154811061072f5761072f6116ad565b5f9182526020808320909101546001600160a01b0387168352600982526040808420868552600a90935290922054815492935083928110610772576107726116ad565b5f9182526020808320909101929092556001600160a01b03861681526009909152604090208054806107a6576107a66116c1565b5f828152602080822083015f19908101839055909201909255838252600a8152604080832054848452818420556001600160a01b038616808452600983529083208054600181810183558286529385200186905592529054610808919061169a565b5f838152600a602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148761088e610e1d565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f81815260056020908152604080832033845290915290205490301461096b57818110156109355760405162461bcd60e51b815260206004820152602960248201527f4552433430343a207472616e7366657220616d6f756e74206578636565647320604482015268616c6c6f77616e636560b81b606482015260840160405180910390fd5b5f19811461096b57610947828261169a565b6001600160a01b0385165f9081526005602090815260408083203384529091529020555b610976848484610e4e565b50505b505050565b5f546001600160a01b031633146109a7576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b6109ed838383610595565b6001600160a01b0382163b15801590610a955750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610a64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8891906116d5565b6001600160e01b03191614155b1561097957604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610adc576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314610b2f576040516282b42960e81b815260040160405180910390fd5b600c610b3b8282611749565b5050565b5f818152600860205260409020546001600160a01b031680610b745760405163c5723b5160e01b815260040160405180910390fd5b919050565b600280546103cb9061164e565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610bfd338484610e4e565b9392505050565b610c0f858585610595565b6001600160a01b0384163b15801590610ca65750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610c599033908a90899089908990600401611805565b6020604051808303815f875af1158015610c75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9991906116d5565b6001600160e01b03191614155b1561097657604051633da6393160e01b815260040160405180910390fd5b60605f610cf27f0000000000000000000000000000000000000000000000000000000000000000600a611937565b610d1c907f0000000000000000000000000000000000000000000000000000000000000000611959565b610d26908461196c565b9050600c8054610d359061164e565b90505f03610d515760405180602001604052805f815250610bfd565b600c610d5c82611007565b604051602001610d6d92919061197f565b6040516020818303038152906040529392505050565b5f546001600160a01b03163314610dac576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116610dd3576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f610e497f0000000000000000000000000000000000000000000000000000000000000000600a611937565b905090565b5f80610e58610e1d565b6001600160a01b038087165f818152600460205260408082208054948a1683529082205492825293945091929091869190610e93838661169a565b90915550506001600160a01b038087165f90815260046020908152604080832080548a019055928a168252600b9052205460ff16610f2c576001600160a01b0387165f90815260046020526040812054610eee908590611959565b610ef88585611959565b610f02919061169a565b90505f5b81811015610f2957610f1789611097565b80610f2181611a02565b915050610f06565b50505b6001600160a01b0386165f908152600b602052604090205460ff16610fad575f610f568483611959565b6001600160a01b0388165f90815260046020526040902054610f79908690611959565b610f83919061169a565b90505f5b81811015610faa57610f98886111b8565b80610fa281611a02565b915050610f87565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148787604051610ff291815260200190565b60405180910390a35060019695505050505050565b60605f611013836112c0565b60010190505f8167ffffffffffffffff811115611032576110326114b2565b6040519080825280601f01601f19166020018201604052801561105c576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461106657509392505050565b6001600160a01b0381166110be57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f90815260096020526040812080546110e39060019061169a565b815481106110f3576110f36116ad565b905f5260205f200154905060095f836001600160a01b03166001600160a01b031681526020019081526020015f20805480611130576111306116c1565b5f828152602080822083015f19908101839055909201909255828252600a815260408083208390556008825280832080546001600160a01b031990811690915560069092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b0381166111df57604051634e46966960e11b815260040160405180910390fd5b60038054600101908190555f818152600860205260409020546001600160a01b03161561121f5760405163119b4fd360e11b815260040160405180910390fd5b5f81815260086020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600983529083208054600181810183558286529385200185905592529054611276919061169a565b5f828152600a602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106112fe5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061132a576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061134857662386f26fc10000830492506010015b6305f5e1008310611360576305f5e100830492506008015b612710831061137457612710830492506004015b60648310611386576064830492506002015b600a831061058f5760010192915050565b5f5b838110156113b1578181015183820152602001611399565b50505f910152565b602081525f82518060208401526113d7816040850160208701611397565b601f01601f19169190910160400192915050565b5f602082840312156113fb575f80fd5b5035919050565b80356001600160a01b0381168114610b74575f80fd5b5f8060408385031215611429575f80fd5b61143283611402565b946020939093013593505050565b5f805f60608486031215611452575f80fd5b61145b84611402565b925061146960208501611402565b9150604084013590509250925092565b5f806040838503121561148a575f80fd5b61149383611402565b9150602083013580151581146114a7575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156114d6575f80fd5b813567ffffffffffffffff808211156114ed575f80fd5b818401915084601f830112611500575f80fd5b813581811115611512576115126114b2565b604051601f8201601f19908116603f0116810190838211818310171561153a5761153a6114b2565b81604052828152876020848701011115611552575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f60208284031215611581575f80fd5b610bfd82611402565b5f805f805f6080868803121561159e575f80fd5b6115a786611402565b94506115b560208701611402565b935060408601359250606086013567ffffffffffffffff808211156115d8575f80fd5b818801915088601f8301126115eb575f80fd5b8135818111156115f9575f80fd5b89602082850101111561160a575f80fd5b9699959850939650602001949392505050565b5f806040838503121561162e575f80fd5b61163783611402565b915061164560208401611402565b90509250929050565b600181811c9082168061166257607f821691505b60208210810361168057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561058f5761058f611686565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f602082840312156116e5575f80fd5b81516001600160e01b031981168114610bfd575f80fd5b601f821115610979575f81815260208120601f850160051c810160208610156117225750805b601f850160051c820191505b818110156117415782815560010161172e565b505050505050565b815167ffffffffffffffff811115611763576117636114b2565b61177781611771845461164e565b846116fc565b602080601f8311600181146117aa575f84156117935750858301515b5f19600386901b1c1916600185901b178555611741565b5f85815260208120601f198616915b828110156117d8578886015182559484019460019091019084016117b9565b50858210156117f557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b600181815b8085111561189157815f190482111561187757611877611686565b8085161561188457918102915b93841c939080029061185c565b509250929050565b5f826118a75750600161058f565b816118b357505f61058f565b81600181146118c957600281146118d3576118ef565b600191505061058f565b60ff8411156118e4576118e4611686565b50506001821b61058f565b5060208310610133831016604e8410600b8410161715611912575081810a61058f565b61191c8383611857565b805f190482111561192f5761192f611686565b029392505050565b5f610bfd60ff841683611899565b634e487b7160e01b5f52601260045260245ffd5b5f8261196757611967611945565b500490565b5f8261197a5761197a611945565b500690565b5f80845461198c8161164e565b600182811680156119a457600181146119b9576119e5565b60ff19841687528215158302870194506119e5565b885f526020805f205f5b858110156119dc5781548a8201529084019082016119c3565b50505082870194505b5050505083516119f9818360208801611397565b01949350505050565b5f60018201611a1357611a13611686565b506001019056fea26469706673582212201668596b078a3959d43314865c7677154815494315b2fbc1324dcde6106b186a64736f6c63430008150033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000100000000000000000000000050d17b6ecd06aa3f04ccf17f6580c2d0dfdcac3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003545354000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035453540000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610148575f3560e01c80636352211e116100bf578063a9059cbb11610079578063a9059cbb1461031b578063b88d4fde1461032e578063c87b56dd14610341578063dd62ed3e14610354578063e985e9c51461037e578063f2fde38b146103ab575f80fd5b80636352211e1461029a57806370a08231146102ad5780638da5cb5b146102cc57806395d89b41146102de5780639b19251a146102e6578063a22cb46514610308575f80fd5b80632b968958116101105780632b96895814610217578063313ce5671461021f57806342842e0e146102585780634f02c4201461026b57806353d6fd591461027457806355f804b314610287575f80fd5b806306fdde031461014c578063081812fc1461016a578063095ea7b3146101aa57806318160ddd146101cd57806323b872dd14610202575b5f80fd5b6101546103be565b60405161016191906113b9565b60405180910390f35b6101926101783660046113eb565b60066020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610161565b6101bd6101b8366004611418565b61044a565b6040519015158152602001610161565b6101f47f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b604051908152602001610161565b610215610210366004611440565b610595565b005b61021561097e565b6102467f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610161565b610215610266366004611440565b6109e2565b6101f460035481565b610215610282366004611479565b610ab3565b6102156102953660046114c6565b610b06565b6101926102a83660046113eb565b610b3f565b6101f46102bb366004611571565b60046020525f908152604090205481565b5f54610192906001600160a01b031681565b610154610b79565b6101bd6102f4366004611571565b600b6020525f908152604090205460ff1681565b610215610316366004611479565b610b86565b6101bd610329366004611418565b610bf1565b61021561033c36600461158a565b610c04565b61015461034f3660046113eb565b610cc4565b6101f461036236600461161d565b600560209081525f928352604080842090915290825290205481565b6101bd61038c36600461161d565b600760209081525f928352604080842090915290825290205460ff1681565b6102156103b9366004611571565b610d83565b600180546103cb9061164e565b80601f01602080910402602001604051908101604052809291908181526020018280546103f79061164e565b80156104425780601f1061041957610100808354040283529160200191610442565b820191905f5260205f20905b81548152906001019060200180831161042557829003601f168201915b505050505081565b5f600354821115801561045c57505f82115b15610530575f828152600860205260409020546001600160a01b03163381148015906104ab57506001600160a01b0381165f90815260076020908152604080832033845290915290205460ff16155b156104c8576040516282b42960e81b815260040160405180910390fd5b5f8381526006602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35061058b565b335f8181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b60035481116108a5575f818152600860205260409020546001600160a01b038481169116146105d757604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0382166105fe57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061063a57506001600160a01b0383165f90815260076020908152604080832033845290915290205460ff16155b801561065c57505f818152600660205260409020546001600160a01b03163314155b15610679576040516282b42960e81b815260040160405180910390fd5b610681610e1d565b6001600160a01b0384165f90815260046020526040812080549091906106a890849061169a565b909155506106b69050610e1d565b6001600160a01b038084165f81815260046020908152604080832080549096019095558582526008815284822080546001600160a01b03199081169094179055600681528482208054909316909255918616825260099052908120805461071f9060019061169a565b8154811061072f5761072f6116ad565b5f9182526020808320909101546001600160a01b0387168352600982526040808420868552600a90935290922054815492935083928110610772576107726116ad565b5f9182526020808320909101929092556001600160a01b03861681526009909152604090208054806107a6576107a66116c1565b5f828152602080822083015f19908101839055909201909255838252600a8152604080832054848452818420556001600160a01b038616808452600983529083208054600181810183558286529385200186905592529054610808919061169a565b5f838152600a602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148761088e610e1d565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f81815260056020908152604080832033845290915290205490301461096b57818110156109355760405162461bcd60e51b815260206004820152602960248201527f4552433430343a207472616e7366657220616d6f756e74206578636565647320604482015268616c6c6f77616e636560b81b606482015260840160405180910390fd5b5f19811461096b57610947828261169a565b6001600160a01b0385165f9081526005602090815260408083203384529091529020555b610976848484610e4e565b50505b505050565b5f546001600160a01b031633146109a7576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b6109ed838383610595565b6001600160a01b0382163b15801590610a955750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610a64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8891906116d5565b6001600160e01b03191614155b1561097957604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610adc576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314610b2f576040516282b42960e81b815260040160405180910390fd5b600c610b3b8282611749565b5050565b5f818152600860205260409020546001600160a01b031680610b745760405163c5723b5160e01b815260040160405180910390fd5b919050565b600280546103cb9061164e565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610bfd338484610e4e565b9392505050565b610c0f858585610595565b6001600160a01b0384163b15801590610ca65750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610c599033908a90899089908990600401611805565b6020604051808303815f875af1158015610c75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9991906116d5565b6001600160e01b03191614155b1561097657604051633da6393160e01b815260040160405180910390fd5b60605f610cf27f0000000000000000000000000000000000000000000000000000000000000012600a611937565b610d1c907f0000000000000000000000000000000000000000000000000de0b6b3a7640000611959565b610d26908461196c565b9050600c8054610d359061164e565b90505f03610d515760405180602001604052805f815250610bfd565b600c610d5c82611007565b604051602001610d6d92919061197f565b6040516020818303038152906040529392505050565b5f546001600160a01b03163314610dac576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116610dd3576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f610e497f0000000000000000000000000000000000000000000000000000000000000012600a611937565b905090565b5f80610e58610e1d565b6001600160a01b038087165f818152600460205260408082208054948a1683529082205492825293945091929091869190610e93838661169a565b90915550506001600160a01b038087165f90815260046020908152604080832080548a019055928a168252600b9052205460ff16610f2c576001600160a01b0387165f90815260046020526040812054610eee908590611959565b610ef88585611959565b610f02919061169a565b90505f5b81811015610f2957610f1789611097565b80610f2181611a02565b915050610f06565b50505b6001600160a01b0386165f908152600b602052604090205460ff16610fad575f610f568483611959565b6001600160a01b0388165f90815260046020526040902054610f79908690611959565b610f83919061169a565b90505f5b81811015610faa57610f98886111b8565b80610fa281611a02565b915050610f87565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148787604051610ff291815260200190565b60405180910390a35060019695505050505050565b60605f611013836112c0565b60010190505f8167ffffffffffffffff811115611032576110326114b2565b6040519080825280601f01601f19166020018201604052801561105c576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461106657509392505050565b6001600160a01b0381166110be57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f90815260096020526040812080546110e39060019061169a565b815481106110f3576110f36116ad565b905f5260205f200154905060095f836001600160a01b03166001600160a01b031681526020019081526020015f20805480611130576111306116c1565b5f828152602080822083015f19908101839055909201909255828252600a815260408083208390556008825280832080546001600160a01b031990811690915560069092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b0381166111df57604051634e46966960e11b815260040160405180910390fd5b60038054600101908190555f818152600860205260409020546001600160a01b03161561121f5760405163119b4fd360e11b815260040160405180910390fd5b5f81815260086020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600983529083208054600181810183558286529385200185905592529054611276919061169a565b5f828152600a602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106112fe5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061132a576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061134857662386f26fc10000830492506010015b6305f5e1008310611360576305f5e100830492506008015b612710831061137457612710830492506004015b60648310611386576064830492506002015b600a831061058f5760010192915050565b5f5b838110156113b1578181015183820152602001611399565b50505f910152565b602081525f82518060208401526113d7816040850160208701611397565b601f01601f19169190910160400192915050565b5f602082840312156113fb575f80fd5b5035919050565b80356001600160a01b0381168114610b74575f80fd5b5f8060408385031215611429575f80fd5b61143283611402565b946020939093013593505050565b5f805f60608486031215611452575f80fd5b61145b84611402565b925061146960208501611402565b9150604084013590509250925092565b5f806040838503121561148a575f80fd5b61149383611402565b9150602083013580151581146114a7575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156114d6575f80fd5b813567ffffffffffffffff808211156114ed575f80fd5b818401915084601f830112611500575f80fd5b813581811115611512576115126114b2565b604051601f8201601f19908116603f0116810190838211818310171561153a5761153a6114b2565b81604052828152876020848701011115611552575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f60208284031215611581575f80fd5b610bfd82611402565b5f805f805f6080868803121561159e575f80fd5b6115a786611402565b94506115b560208701611402565b935060408601359250606086013567ffffffffffffffff808211156115d8575f80fd5b818801915088601f8301126115eb575f80fd5b8135818111156115f9575f80fd5b89602082850101111561160a575f80fd5b9699959850939650602001949392505050565b5f806040838503121561162e575f80fd5b61163783611402565b915061164560208401611402565b90509250929050565b600181811c9082168061166257607f821691505b60208210810361168057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561058f5761058f611686565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f602082840312156116e5575f80fd5b81516001600160e01b031981168114610bfd575f80fd5b601f821115610979575f81815260208120601f850160051c810160208610156117225750805b601f850160051c820191505b818110156117415782815560010161172e565b505050505050565b815167ffffffffffffffff811115611763576117636114b2565b61177781611771845461164e565b846116fc565b602080601f8311600181146117aa575f84156117935750858301515b5f19600386901b1c1916600185901b178555611741565b5f85815260208120601f198616915b828110156117d8578886015182559484019460019091019084016117b9565b50858210156117f557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b600181815b8085111561189157815f190482111561187757611877611686565b8085161561188457918102915b93841c939080029061185c565b509250929050565b5f826118a75750600161058f565b816118b357505f61058f565b81600181146118c957600281146118d3576118ef565b600191505061058f565b60ff8411156118e4576118e4611686565b50506001821b61058f565b5060208310610133831016604e8410600b8410161715611912575081810a61058f565b61191c8383611857565b805f190482111561192f5761192f611686565b029392505050565b5f610bfd60ff841683611899565b634e487b7160e01b5f52601260045260245ffd5b5f8261196757611967611945565b500490565b5f8261197a5761197a611945565b500690565b5f80845461198c8161164e565b600182811680156119a457600181146119b9576119e5565b60ff19841687528215158302870194506119e5565b885f526020805f205f5b858110156119dc5781548a8201529084019082016119c3565b50505082870194505b5050505083516119f9818360208801611397565b01949350505050565b5f60018201611a1357611a13611686565b506001019056fea26469706673582212201668596b078a3959d43314865c7677154815494315b2fbc1324dcde6106b186a64736f6c63430008150033

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