Latest 25 from a total of 25 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 38158079 | 36 mins ago | IN | 0 ETH | 0.00000019 | ||||
| Approve | 38156563 | 1 hr ago | IN | 0 ETH | 0.00000024 | ||||
| Approve | 38144357 | 8 hrs ago | IN | 0 ETH | 0.00000036 | ||||
| Transfer | 38122713 | 20 hrs ago | IN | 0 ETH | 0.0000002 | ||||
| Approve | 38093977 | 36 hrs ago | IN | 0 ETH | 0.00000029 | ||||
| Approve | 38083112 | 42 hrs ago | IN | 0 ETH | 0.00000011 | ||||
| Approve | 38001921 | 3 days ago | IN | 0 ETH | 0.00000017 | ||||
| Approve | 38000560 | 3 days ago | IN | 0 ETH | 0.00000039 | ||||
| Approve | 37992891 | 3 days ago | IN | 0 ETH | 0.00000003 | ||||
| Approve | 37985188 | 4 days ago | IN | 0 ETH | 0.00000013 | ||||
| Approve | 37976743 | 4 days ago | IN | 0 ETH | 0.00000013 | ||||
| Approve | 37974739 | 4 days ago | IN | 0 ETH | 0.00000018 | ||||
| Approve | 37965303 | 4 days ago | IN | 0 ETH | 0.00000013 | ||||
| Approve | 37962550 | 4 days ago | IN | 0 ETH | 0.00000012 | ||||
| Approve | 37953547 | 4 days ago | IN | 0 ETH | 0.00000032 | ||||
| Approve | 37952870 | 4 days ago | IN | 0 ETH | 0.00000011 | ||||
| Approve | 37952861 | 4 days ago | IN | 0 ETH | 0.00000011 | ||||
| Approve | 37952795 | 4 days ago | IN | 0 ETH | 0.00000012 | ||||
| Approve | 37947197 | 4 days ago | IN | 0 ETH | 0.00000014 | ||||
| Approve | 37946781 | 4 days ago | IN | 0 ETH | 0.00000007 | ||||
| Approve | 37944343 | 4 days ago | IN | 0 ETH | 0.00000006 | ||||
| Approve | 37917270 | 5 days ago | IN | 0 ETH | 0.00000007 | ||||
| Approve | 37906329 | 5 days ago | IN | 0 ETH | 0.00000004 | ||||
| Approve | 37833554 | 7 days ago | IN | 0 ETH | 0.00000019 | ||||
| Transfer | 37832992 | 7 days ago | IN | 0 ETH | 0.00000047 |
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 10050776 | 650 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ERC20FreeMintSigned
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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);
}
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
OVERVIEW
The first fair launchpad on farcaster, governed by FAR DAO.Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.