ETH Price: $1,985.00 (+1.30%)
 

Overview

Max Total Supply

1,000,000,000 FAR

Holders

7,371 (0.00%)

Transfers

-
3

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

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

OVERVIEW

The first fair launchpad on farcaster, governed by FAR DAO.

Market

Volume (24H):$0.00
Market Capitalization:$0.00
Circulating Supply:0.00 FAR
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
ERC20FreeMintSigned

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

import {ERC20} from "../ERC20.sol";
import {IERC20} from "../IERC20.sol";
import {ECDSA} from "../utils/cryptography/ECDSA.sol";
import {IERC20FreeMintSigned} from "./IERC20FreeMintSigned.sol";

/**
 * @title ERC20FreeMintSigned
 *
 * @dev Implementation of the [ERC20](https://eips.ethereum.org/EIPS/eip-20)
 * Token standard with specific mint functionality.
 */
contract ERC20FreeMintSigned is ERC20, IERC20FreeMintSigned {
    bool public launched;

    uint256 public immutable amountPerMint;
    uint256 public immutable mintableCount;
    uint256 public immutable mintStartTime;

    uint256 public maxAllowedMints;
    mapping(address => uint256) public userTotalMints;

    address public immutable factory;
    mapping (address => bool) public signers;

    // Maps a bytes32 hash of (signer, nonce) -> bool
    mapping(bytes32 => bool) public usedNonces;

    event Mint(address indexed to, uint256 amount);

    error MintNotStarted();
    error ERC20NotLaunched();
    error ERC20AlreadyLaunched();
    error NotFactory();
    error InvalidSigner();
    error NonceAlreadyUsed();
    error MaxMintsReached();

    constructor(
        string memory name_, string memory symbol_, uint8 decimals_,
        uint256 amountPerMint_, uint256 mintableCount_,
        uint256 maxAllowedMints_, uint256 mintStartTime_,
        address factory_
    ) ERC20(name_, symbol_, decimals_) {
        require(amountPerMint_ > 0, "Invalid amount per mint");
        require(mintableCount_ > 0, "Invalid mintable count");

        amountPerMint = amountPerMint_;
        mintableCount = mintableCount_;
        maxAllowedMints = maxAllowedMints_;
        mintStartTime = mintStartTime_;
        factory = factory_;
    }

    function mintableOf(address account) external view returns (uint256) {
        if (launched) return 0;
        return super.balanceOf(account);
    }

    function getMetadata() external view returns (string memory, string memory, uint8) {
        return (name(), symbol(), decimals());
    }

    function getStaticInfo() external view returns (uint256, uint256, uint256) {
        return (amountPerMint, mintableCount, mintStartTime);
    }

    function getDynamicInfo() external view returns (bool, uint256) {
        return (launched, super.totalSupply());
    }

    function mint(
        uint256 nonce, address receiver,
        bytes calldata signature
    ) external {
        if (block.timestamp < mintStartTime) revert MintNotStarted();
        if (launched) revert ERC20AlreadyLaunched();

        bytes memory message = abi.encode(block.chainid, address(this), nonce, receiver);
        address _recoveredSigner = ECDSA.recover(keccak256(message), signature);
        if (!signers[_recoveredSigner]) revert InvalidSigner();

        bytes32 _usedNonce = keccak256(abi.encodePacked(_recoveredSigner, nonce));
        if (usedNonces[_usedNonce]) revert NonceAlreadyUsed();
        usedNonces[_usedNonce] = true;

        if (maxAllowedMints > 0 && userTotalMints[receiver] >= maxAllowedMints)
            revert MaxMintsReached();

        ++userTotalMints[receiver];

        _mint(receiver, amountPerMint);
        emit Mint(receiver, amountPerMint);

        // Burn is disabled before launching so totalSupply is accurate.
        if (super.totalSupply() == mintableCount * amountPerMint) {
            launched = true;
        }
    }

    function totalSupply() public view override(ERC20, IERC20) returns (uint256) {
        if (!launched) return 0;
        return super.totalSupply();
    }

    function balanceOf(address account) public view override(ERC20, IERC20) returns (uint256) {
        if (!launched) return 0;
        return super.balanceOf(account);
    }

    function _update(address from, address to, uint256 value) internal override {
        super._update(from, to, value);

        // Transfer disallowed before launching.
        if (!launched && from != address(0)) revert ERC20NotLaunched();
    }

    function setSigner(address signer, bool valid) external {
        if (msg.sender != factory) revert NotFactory();
        signers[signer] = valid;
    }

    function setMaxAllowedMints(uint256 newMaxAllowedMints) external {
        if (msg.sender != factory) revert NotFactory();
        maxAllowedMints = newMaxAllowedMints;
    }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";

/**
 * @title ERC20
 * @dev Implementation of the [ERC20](https://eips.ethereum.org/EIPS/eip-20)
 * Token standard.
 */
abstract contract ERC20 is IERC20 {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

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

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_, uint8 decimals_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return _decimals;
    }

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

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

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

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

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

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

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

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

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

        emit Transfer(from, to, value);
    }

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

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

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

interface IERC20FreeMintSigned is IERC20 {
    function launched() external view returns (bool);

    function amountPerMint() external view returns (uint256);
    function mintableCount() external view returns (uint256);
    function mintStartTime() external view returns (uint256);

    function maxAllowedMints() external view returns (uint256);
    function userTotalMints(address account) external view returns (uint256);

    function factory() external view returns (address);
    function signers(address signer) external view returns (bool);

    function usedNonces(bytes32 hashedSignerNonce) external view returns (bool);

    function mintableOf(address account) external view returns (uint256);
    function getMetadata() external view returns (string memory, string memory, uint8);
    function getStaticInfo() external view returns (uint256, uint256, uint256);
    function getDynamicInfo() external view returns (bool, uint256);

    function mint(uint256 nonce, address receiver, bytes calldata signature) external;

    function setSigner(address signer, bool valid) external;
    function setMaxAllowedMints(uint256 newMaxAllowedMints) external;
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {

    // =============================================================
    //                            ERRORS
    // =============================================================

    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

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

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

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

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

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

    // =============================================================
    //                        IERC20Metadata
    // =============================================================

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

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

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

    // =============================================================
    //                            IERC20
    // =============================================================

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

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

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

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

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

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

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.20;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS
    }

    /**
     * @dev The signature derives the `address(0)`.
     */
    error ECDSAInvalidSignature();

    /**
     * @dev The signature has an invalid length.
     */
    error ECDSAInvalidSignatureLength(uint256 length);

    /**
     * @dev The signature has an S value that is in the upper half order.
     */
    error ECDSAInvalidSignatureS(bytes32 s);

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not
     * return address(0) without also returning an error description. Errors are documented using an enum (error type)
     * and a bytes32 providing additional information about the error.
     *
     * If no error is returned, then the address can be used for verification purposes.
     *
     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);
        _throwError(error, errorArg);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     */
    function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) {
        unchecked {
            bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
            // We do not check for an overflow here since the shift operation results in 0 or 1.
            uint8 v = uint8((uint256(vs) >> 255) + 27);
            return tryRecover(hash, v, r, s);
        }
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     */
    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);
        _throwError(error, errorArg);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError, bytes32) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS, s);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature, bytes32(0));
        }

        return (signer, RecoverError.NoError, bytes32(0));
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);
        _throwError(error, errorArg);
        return recovered;
    }

    /**
     * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.
     */
    function _throwError(RecoverError error, bytes32 errorArg) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert ECDSAInvalidSignature();
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert ECDSAInvalidSignatureLength(uint256(errorArg));
        } else if (error == RecoverError.InvalidSignatureS) {
            revert ECDSAInvalidSignatureS(errorArg);
        }
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"amountPerMint_","type":"uint256"},{"internalType":"uint256","name":"mintableCount_","type":"uint256"},{"internalType":"uint256","name":"maxAllowedMints_","type":"uint256"},{"internalType":"uint256","name":"mintStartTime_","type":"uint256"},{"internalType":"address","name":"factory_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[],"name":"ERC20AlreadyLaunched","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"ERC20NotLaunched","type":"error"},{"inputs":[],"name":"InvalidSigner","type":"error"},{"inputs":[],"name":"MaxMintsReached","type":"error"},{"inputs":[],"name":"MintNotStarted","type":"error"},{"inputs":[],"name":"NonceAlreadyUsed","type":"error"},{"inputs":[],"name":"NotFactory","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDynamicInfo","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMetadata","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStaticInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAllowedMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintableCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"mintableOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxAllowedMints","type":"uint256"}],"name":"setMaxAllowedMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"bool","name":"valid","type":"bool"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"signers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedNonces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTotalMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6101006040523480156200001257600080fd5b506040516200176f3803806200176f83398101604081905262000035916200021c565b87878760036200004684826200036a565b5060046200005583826200036a565b506005805460ff90921660ff19909216919091179055505084620000c05760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420616d6f756e7420706572206d696e7400000000000000000060448201526064015b60405180910390fd5b60008411620001125760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206d696e7461626c6520636f756e74000000000000000000006044820152606401620000b7565b60809490945260a09290925260065560c0526001600160a01b031660e0525062000436915050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200016257600080fd5b81516001600160401b03808211156200017f576200017f6200013a565b604051601f8301601f19908116603f01168101908282118183101715620001aa57620001aa6200013a565b81604052838152602092508683858801011115620001c757600080fd5b600091505b83821015620001eb5785820183015181830184015290820190620001cc565b600093810190920192909252949350505050565b80516001600160a01b03811681146200021757600080fd5b919050565b600080600080600080600080610100898b0312156200023a57600080fd5b88516001600160401b03808211156200025257600080fd5b620002608c838d0162000150565b995060208b01519150808211156200027757600080fd5b50620002868b828c0162000150565b975050604089015160ff811681146200029e57600080fd5b80965050606089015194506080890151935060a0890151925060c08901519150620002cc60e08a01620001ff565b90509295985092959890939650565b600181811c90821680620002f057607f821691505b6020821081036200031157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200036557600081815260208120601f850160051c81016020861015620003405750805b601f850160051c820191505b8181101562000361578281556001016200034c565b5050505b505050565b81516001600160401b038111156200038657620003866200013a565b6200039e81620003978454620002db565b8462000317565b602080601f831160018114620003d65760008415620003bd5750858301515b600019600386901b1c1916600185901b17855562000361565b600085815260208120601f198616915b828110156200040757888601518255948401946001909101908401620003e6565b5085821015620004265787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516112b9620004b660003960008181610347015281816105e901526109dd01526000818161030501528181610430015261066e0152600081816102430152818161040a015261094a015260008181610386015281816103e70152818161089d015281816108ee015261092901526112b96000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c8063736c0d5b116100de578063a9059cbb11610097578063dd62ed3e11610071578063dd62ed3e146103a8578063e5861a03146103e1578063fd4a30351461045e578063feb617241461047157600080fd5b8063a9059cbb1461032f578063c45a015514610342578063cfe73e4c1461038157600080fd5b8063736c0d5b146102a157806373c02519146102c45780637a5b4f59146102d75780638091f3bf146102ee578063931e2e491461030057806395d89b411461032757600080fd5b8063313ce56711610130578063313ce5671461021457806331cb6105146102295780634254337e1461023e57806344fead9e146102655780634f1fc6911461026e57806370a082311461028e57600080fd5b806306fdde0314610178578063095ea7b314610196578063107530dd146101b957806318160ddd146101d85780631ebf8d13146101ee57806323b872dd14610201575b600080fd5b610180610494565b60405161018d9190610fdb565b60405180910390f35b6101a96101a4366004611011565b610526565b604051901515815260200161018d565b6101c1610540565b60408051921515835260208301919091520161018d565b6101e0610562565b60405190815260200161018d565b6101e06101fc36600461103b565b610581565b6101a961020f366004611056565b6105ba565b60055460405160ff909116815260200161018d565b61023c610237366004611092565b6105de565b005b6101e07f000000000000000000000000000000000000000000000000000000000000000081565b6101e060065481565b6101e061027c36600461103b565b60076020526000908152604090205481565b6101e061029c36600461103b565b610652565b6101a96102af36600461103b565b60086020526000908152604090205460ff1681565b61023c6102d23660046110ce565b61066c565b6102df61098f565b60405161018d93929190611155565b6005546101a990610100900460ff1681565b6101e07f000000000000000000000000000000000000000000000000000000000000000081565b6101806109b5565b6101a961033d366004611011565b6109c4565b6103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018d565b6101e07f000000000000000000000000000000000000000000000000000000000000000081565b6101e06103b636600461118e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b604080517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000009181019190915260600161018d565b61023c61046c3660046111c1565b6109d2565b6101a961047f3660046111c1565b60096020526000908152604090205460ff1681565b6060600380546104a3906111da565b80601f01602080910402602001604051908101604052809291908181526020018280546104cf906111da565b801561051c5780601f106104f15761010080835404028352916020019161051c565b820191906000526020600020905b8154815290600101906020018083116104ff57829003601f168201915b5050505050905090565b600033610534818585610a20565b60019150505b92915050565b600554600090819060ff6101009091041661055a60025490565b915091509091565b600554600090610100900460ff1661057a5750600090565b5060025490565b600554600090610100900460ff161561059c57506000919050565b6001600160a01b03821660009081526020819052604090205461053a565b6000336105c8858285610a32565b6105d3858585610ab5565b506001949350505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461062757604051631966391b60e11b815260040160405180910390fd5b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b600554600090610100900460ff1661059c57506000919050565b7f00000000000000000000000000000000000000000000000000000000000000004210156106ad57604051630314872760e11b815260040160405180910390fd5b600554610100900460ff16156106d657604051636054471360e01b815260040160405180910390fd5b604080514660208201523091810191909152606081018590526001600160a01b038416608082015260009060a0016040516020818303038152906040529050600061075e828051906020012085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610b1492505050565b6001600160a01b03811660009081526008602052604090205490915060ff1661079a57604051632057875960e21b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606083901b1660208201526034810187905260009060540160408051601f1981840301815291815281516020928301206000818152600990935291205490915060ff161561080b57604051623f613760e71b815260040160405180910390fd5b6000818152600960205260409020805460ff191660011790556006541580159061084f57506006546001600160a01b03871660009081526007602052604090205410155b1561086d5760405163635a2d9b60e01b815260040160405180910390fd5b6001600160a01b038616600090815260076020526040812080549091906108939061122a565b909155506108c1867f0000000000000000000000000000000000000000000000000000000000000000610b3e565b856001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968857f000000000000000000000000000000000000000000000000000000000000000060405161091c91815260200190565b60405180910390a261096e7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611243565b60025403610986576005805461ff0019166101001790555b50505050505050565b606080600061099c610494565b6109a46109b5565b60055460ff16925092509250909192565b6060600480546104a3906111da565b600033610534818585610ab5565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a1b57604051631966391b60e11b815260040160405180910390fd5b600655565b610a2d8383836001610b78565b505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610aaf5781811015610aa057604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b610aaf84848484036000610b78565b50505050565b6001600160a01b038316610adf57604051634b637e8f60e11b815260006004820152602401610a97565b6001600160a01b038216610b095760405163ec442f0560e01b815260006004820152602401610a97565b610a2d838383610c4d565b600080600080610b248686610c96565b925092509250610b348282610ce3565b5090949350505050565b6001600160a01b038216610b685760405163ec442f0560e01b815260006004820152602401610a97565b610b7460008383610c4d565b5050565b6001600160a01b038416610ba25760405163e602df0560e01b815260006004820152602401610a97565b6001600160a01b038316610bcc57604051634a1406b160e11b815260006004820152602401610a97565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015610aaf57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610c3f91815260200190565b60405180910390a350505050565b610c58838383610d9c565b600554610100900460ff16158015610c7857506001600160a01b03831615155b15610a2d57604051631186937760e01b815260040160405180910390fd5b60008060008351604103610cd05760208401516040850151606086015160001a610cc288828585610ec6565b955095509550505050610cdc565b50508151600091506002905b9250925092565b6000826003811115610cf757610cf761125a565b03610d00575050565b6001826003811115610d1457610d1461125a565b03610d325760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610d4657610d4661125a565b03610d675760405163fce698f760e01b815260048101829052602401610a97565b6003826003811115610d7b57610d7b61125a565b03610b74576040516335e2f38360e21b815260048101829052602401610a97565b6001600160a01b038316610dc7578060026000828254610dbc9190611270565b90915550610e399050565b6001600160a01b03831660009081526020819052604090205481811015610e1a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610a97565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216610e5557600280548290039055610e74565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610eb991815260200190565b60405180910390a3505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610f015750600091506003905082610f8b565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610f55573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610f8157506000925060019150829050610f8b565b9250600091508190505b9450945094915050565b6000815180845260005b81811015610fbb57602081850181015186830182015201610f9f565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000610fee6020830184610f95565b9392505050565b80356001600160a01b038116811461100c57600080fd5b919050565b6000806040838503121561102457600080fd5b61102d83610ff5565b946020939093013593505050565b60006020828403121561104d57600080fd5b610fee82610ff5565b60008060006060848603121561106b57600080fd5b61107484610ff5565b925061108260208501610ff5565b9150604084013590509250925092565b600080604083850312156110a557600080fd5b6110ae83610ff5565b9150602083013580151581146110c357600080fd5b809150509250929050565b600080600080606085870312156110e457600080fd5b843593506110f460208601610ff5565b9250604085013567ffffffffffffffff8082111561111157600080fd5b818701915087601f83011261112557600080fd5b81358181111561113457600080fd5b88602082850101111561114657600080fd5b95989497505060200194505050565b6060815260006111686060830186610f95565b828103602084015261117a8186610f95565b91505060ff83166040830152949350505050565b600080604083850312156111a157600080fd5b6111aa83610ff5565b91506111b860208401610ff5565b90509250929050565b6000602082840312156111d357600080fd5b5035919050565b600181811c908216806111ee57607f821691505b60208210810361120e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001820161123c5761123c611214565b5060010190565b808202811582820484141761053a5761053a611214565b634e487b7160e01b600052602160045260246000fd5b8082018082111561053a5761053a61121456fea26469706673582212208bc0dba6d2d0f47cea7eed0a13ec3f9b5daa7aed82045aa4183ceaf9f60e2d1364736f6c6343000814003300000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000152d02c7e14af6800000000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000065bd16300000000000000000000000000ed674dbbde9cdb28ec4b8322e4d75ce7592bc1900000000000000000000000000000000000000000000000000000000000000094661724c61756e6368000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034641520000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c8063736c0d5b116100de578063a9059cbb11610097578063dd62ed3e11610071578063dd62ed3e146103a8578063e5861a03146103e1578063fd4a30351461045e578063feb617241461047157600080fd5b8063a9059cbb1461032f578063c45a015514610342578063cfe73e4c1461038157600080fd5b8063736c0d5b146102a157806373c02519146102c45780637a5b4f59146102d75780638091f3bf146102ee578063931e2e491461030057806395d89b411461032757600080fd5b8063313ce56711610130578063313ce5671461021457806331cb6105146102295780634254337e1461023e57806344fead9e146102655780634f1fc6911461026e57806370a082311461028e57600080fd5b806306fdde0314610178578063095ea7b314610196578063107530dd146101b957806318160ddd146101d85780631ebf8d13146101ee57806323b872dd14610201575b600080fd5b610180610494565b60405161018d9190610fdb565b60405180910390f35b6101a96101a4366004611011565b610526565b604051901515815260200161018d565b6101c1610540565b60408051921515835260208301919091520161018d565b6101e0610562565b60405190815260200161018d565b6101e06101fc36600461103b565b610581565b6101a961020f366004611056565b6105ba565b60055460405160ff909116815260200161018d565b61023c610237366004611092565b6105de565b005b6101e07f000000000000000000000000000000000000000000000000000000000000271081565b6101e060065481565b6101e061027c36600461103b565b60076020526000908152604090205481565b6101e061029c36600461103b565b610652565b6101a96102af36600461103b565b60086020526000908152604090205460ff1681565b61023c6102d23660046110ce565b61066c565b6102df61098f565b60405161018d93929190611155565b6005546101a990610100900460ff1681565b6101e07f0000000000000000000000000000000000000000000000000000000065bd163081565b6101806109b5565b6101a961033d366004611011565b6109c4565b6103697f0000000000000000000000000ed674dbbde9cdb28ec4b8322e4d75ce7592bc1981565b6040516001600160a01b03909116815260200161018d565b6101e07f00000000000000000000000000000000000000000000152d02c7e14af680000081565b6101e06103b636600461118e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b604080517f00000000000000000000000000000000000000000000152d02c7e14af680000081527f000000000000000000000000000000000000000000000000000000000000271060208201527f0000000000000000000000000000000000000000000000000000000065bd16309181019190915260600161018d565b61023c61046c3660046111c1565b6109d2565b6101a961047f3660046111c1565b60096020526000908152604090205460ff1681565b6060600380546104a3906111da565b80601f01602080910402602001604051908101604052809291908181526020018280546104cf906111da565b801561051c5780601f106104f15761010080835404028352916020019161051c565b820191906000526020600020905b8154815290600101906020018083116104ff57829003601f168201915b5050505050905090565b600033610534818585610a20565b60019150505b92915050565b600554600090819060ff6101009091041661055a60025490565b915091509091565b600554600090610100900460ff1661057a5750600090565b5060025490565b600554600090610100900460ff161561059c57506000919050565b6001600160a01b03821660009081526020819052604090205461053a565b6000336105c8858285610a32565b6105d3858585610ab5565b506001949350505050565b336001600160a01b037f0000000000000000000000000ed674dbbde9cdb28ec4b8322e4d75ce7592bc19161461062757604051631966391b60e11b815260040160405180910390fd5b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b600554600090610100900460ff1661059c57506000919050565b7f0000000000000000000000000000000000000000000000000000000065bd16304210156106ad57604051630314872760e11b815260040160405180910390fd5b600554610100900460ff16156106d657604051636054471360e01b815260040160405180910390fd5b604080514660208201523091810191909152606081018590526001600160a01b038416608082015260009060a0016040516020818303038152906040529050600061075e828051906020012085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610b1492505050565b6001600160a01b03811660009081526008602052604090205490915060ff1661079a57604051632057875960e21b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606083901b1660208201526034810187905260009060540160408051601f1981840301815291815281516020928301206000818152600990935291205490915060ff161561080b57604051623f613760e71b815260040160405180910390fd5b6000818152600960205260409020805460ff191660011790556006541580159061084f57506006546001600160a01b03871660009081526007602052604090205410155b1561086d5760405163635a2d9b60e01b815260040160405180910390fd5b6001600160a01b038616600090815260076020526040812080549091906108939061122a565b909155506108c1867f00000000000000000000000000000000000000000000152d02c7e14af6800000610b3e565b856001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968857f00000000000000000000000000000000000000000000152d02c7e14af680000060405161091c91815260200190565b60405180910390a261096e7f00000000000000000000000000000000000000000000152d02c7e14af68000007f0000000000000000000000000000000000000000000000000000000000002710611243565b60025403610986576005805461ff0019166101001790555b50505050505050565b606080600061099c610494565b6109a46109b5565b60055460ff16925092509250909192565b6060600480546104a3906111da565b600033610534818585610ab5565b336001600160a01b037f0000000000000000000000000ed674dbbde9cdb28ec4b8322e4d75ce7592bc191614610a1b57604051631966391b60e11b815260040160405180910390fd5b600655565b610a2d8383836001610b78565b505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610aaf5781811015610aa057604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b610aaf84848484036000610b78565b50505050565b6001600160a01b038316610adf57604051634b637e8f60e11b815260006004820152602401610a97565b6001600160a01b038216610b095760405163ec442f0560e01b815260006004820152602401610a97565b610a2d838383610c4d565b600080600080610b248686610c96565b925092509250610b348282610ce3565b5090949350505050565b6001600160a01b038216610b685760405163ec442f0560e01b815260006004820152602401610a97565b610b7460008383610c4d565b5050565b6001600160a01b038416610ba25760405163e602df0560e01b815260006004820152602401610a97565b6001600160a01b038316610bcc57604051634a1406b160e11b815260006004820152602401610a97565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015610aaf57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610c3f91815260200190565b60405180910390a350505050565b610c58838383610d9c565b600554610100900460ff16158015610c7857506001600160a01b03831615155b15610a2d57604051631186937760e01b815260040160405180910390fd5b60008060008351604103610cd05760208401516040850151606086015160001a610cc288828585610ec6565b955095509550505050610cdc565b50508151600091506002905b9250925092565b6000826003811115610cf757610cf761125a565b03610d00575050565b6001826003811115610d1457610d1461125a565b03610d325760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610d4657610d4661125a565b03610d675760405163fce698f760e01b815260048101829052602401610a97565b6003826003811115610d7b57610d7b61125a565b03610b74576040516335e2f38360e21b815260048101829052602401610a97565b6001600160a01b038316610dc7578060026000828254610dbc9190611270565b90915550610e399050565b6001600160a01b03831660009081526020819052604090205481811015610e1a5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610a97565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216610e5557600280548290039055610e74565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610eb991815260200190565b60405180910390a3505050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610f015750600091506003905082610f8b565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610f55573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610f8157506000925060019150829050610f8b565b9250600091508190505b9450945094915050565b6000815180845260005b81811015610fbb57602081850181015186830182015201610f9f565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000610fee6020830184610f95565b9392505050565b80356001600160a01b038116811461100c57600080fd5b919050565b6000806040838503121561102457600080fd5b61102d83610ff5565b946020939093013593505050565b60006020828403121561104d57600080fd5b610fee82610ff5565b60008060006060848603121561106b57600080fd5b61107484610ff5565b925061108260208501610ff5565b9150604084013590509250925092565b600080604083850312156110a557600080fd5b6110ae83610ff5565b9150602083013580151581146110c357600080fd5b809150509250929050565b600080600080606085870312156110e457600080fd5b843593506110f460208601610ff5565b9250604085013567ffffffffffffffff8082111561111157600080fd5b818701915087601f83011261112557600080fd5b81358181111561113457600080fd5b88602082850101111561114657600080fd5b95989497505060200194505050565b6060815260006111686060830186610f95565b828103602084015261117a8186610f95565b91505060ff83166040830152949350505050565b600080604083850312156111a157600080fd5b6111aa83610ff5565b91506111b860208401610ff5565b90509250929050565b6000602082840312156111d357600080fd5b5035919050565b600181811c908216806111ee57607f821691505b60208210810361120e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001820161123c5761123c611214565b5060010190565b808202811582820484141761053a5761053a611214565b634e487b7160e01b600052602160045260246000fd5b8082018082111561053a5761053a61121456fea26469706673582212208bc0dba6d2d0f47cea7eed0a13ec3f9b5daa7aed82045aa4183ceaf9f60e2d1364736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000152d02c7e14af6800000000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000065bd16300000000000000000000000000ed674dbbde9cdb28ec4b8322e4d75ce7592bc1900000000000000000000000000000000000000000000000000000000000000094661724c61756e6368000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034641520000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): FarLaunch
Arg [1] : symbol_ (string): FAR
Arg [2] : decimals_ (uint8): 18
Arg [3] : amountPerMint_ (uint256): 100000000000000000000000
Arg [4] : mintableCount_ (uint256): 10000
Arg [5] : maxAllowedMints_ (uint256): 3
Arg [6] : mintStartTime_ (uint256): 1706890800
Arg [7] : factory_ (address): 0x0Ed674dBBdE9Cdb28eC4B8322E4D75cE7592BC19

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 00000000000000000000000000000000000000000000152d02c7e14af6800000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 0000000000000000000000000000000000000000000000000000000065bd1630
Arg [7] : 0000000000000000000000000ed674dbbde9cdb28ec4b8322e4d75ce7592bc19
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [9] : 4661724c61756e63680000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [11] : 4641520000000000000000000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.