Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 120 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Mint | 15660689 | 1255 days ago | IN | 0 ETH | 0.00068689 | ||||
| Mint | 15660661 | 1255 days ago | IN | 0 ETH | 0.00064135 | ||||
| Mint | 15660407 | 1255 days ago | IN | 0 ETH | 0.00051125 | ||||
| Mint | 15660331 | 1255 days ago | IN | 0 ETH | 0.00057516 | ||||
| Mint | 15660256 | 1255 days ago | IN | 0 ETH | 0.0006216 | ||||
| Mint | 15659860 | 1255 days ago | IN | 0 ETH | 0.00091078 | ||||
| Mint | 15659493 | 1255 days ago | IN | 0 ETH | 0.00062053 | ||||
| Mint | 15659492 | 1255 days ago | IN | 0 ETH | 0.00055312 | ||||
| Mint | 15659487 | 1255 days ago | IN | 0 ETH | 0.00060669 | ||||
| Mint | 15659480 | 1255 days ago | IN | 0 ETH | 0.00061731 | ||||
| Mint | 15659478 | 1255 days ago | IN | 0 ETH | 0.00060629 | ||||
| Mint | 15658127 | 1255 days ago | IN | 0 ETH | 0.00041293 | ||||
| Mint | 15657922 | 1255 days ago | IN | 0 ETH | 0.00056316 | ||||
| Mint | 15657729 | 1255 days ago | IN | 0 ETH | 0.00080164 | ||||
| Mint | 15657726 | 1255 days ago | IN | 0 ETH | 0.00077839 | ||||
| Mint | 15657534 | 1255 days ago | IN | 0 ETH | 0.00082131 | ||||
| Mint | 15657489 | 1255 days ago | IN | 0 ETH | 0.00088766 | ||||
| Mint | 15657131 | 1255 days ago | IN | 0 ETH | 0.00058206 | ||||
| Mint | 15657123 | 1255 days ago | IN | 0 ETH | 0.00075003 | ||||
| Mint | 15657098 | 1255 days ago | IN | 0 ETH | 0.00055036 | ||||
| Mint | 15656860 | 1255 days ago | IN | 0 ETH | 0.00059899 | ||||
| Mint | 15656856 | 1255 days ago | IN | 0 ETH | 0.00059151 | ||||
| Mint | 15656848 | 1255 days ago | IN | 0 ETH | 0.00060272 | ||||
| Mint | 15656789 | 1255 days ago | IN | 0.0138 ETH | 0.00105917 | ||||
| Mint | 15656270 | 1255 days ago | IN | 0.0069 ETH | 0.00074296 |
Latest 10 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Mint External | 15656789 | 1255 days ago | 0.0138 ETH | ||||
| Mint External | 15656270 | 1255 days ago | 0.0069 ETH | ||||
| Mint External | 15655680 | 1256 days ago | 0.0138 ETH | ||||
| Mint External | 15654591 | 1256 days ago | 0.0069 ETH | ||||
| Mint External | 15654499 | 1256 days ago | 0.0138 ETH | ||||
| Mint External | 15654448 | 1256 days ago | 0.0138 ETH | ||||
| Mint External | 15654433 | 1256 days ago | 0.0069 ETH | ||||
| Mint External | 15654420 | 1256 days ago | 0.0138 ETH | ||||
| Mint External | 15654414 | 1256 days ago | 0.0069 ETH | ||||
| Mint External | 15654408 | 1256 days ago | 0.0138 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DynamicPricePresaleListExtension
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-10-01
*/
// SPDX-License-Identifier: MIXED
// Sources flattened with hardhat v2.9.3 https://hardhat.org
// File @openzeppelin/contracts/utils/Context.sol@v4.7.0
// License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File @openzeppelin/contracts/access/Ownable.sol@v4.7.0
// License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File @openzeppelin/contracts/security/Pausable.sol@v4.7.0
// License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// File @openzeppelin/contracts/utils/cryptography/MerkleProof.sol@v4.7.0
// License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Tree proofs.
*
* The proofs can be generated using the JavaScript library
* https://github.com/miguelmota/merkletreejs[merkletreejs].
* Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
*
* See `test/utils/cryptography/MerkleProof.test.js` for some examples.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the merkle tree could be reinterpreted as a leaf value.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Calldata version of {verify}
*
* _Available since v4.7._
*/
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*
* _Available since v4.7._
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* _Available since v4.7._
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Calldata version of {multiProofVerify}
*
* _Available since v4.7._
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
* consuming from one or the other at each step according to the instructions given by
* `proofFlags`.
*
* _Available since v4.7._
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Calldata version of {processMultiProof}
*
* _Available since v4.7._
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
// File @openzeppelin/contracts/utils/introspection/IERC165.sol@v4.7.0
// License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File @openzeppelin/contracts/utils/introspection/ERC165.sol@v4.7.0
// License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File contracts/interfaces/INFTExtension.sol
// License-Identifier: MIT
pragma solidity ^0.8.9;
interface INFTExtension is IERC165 {}
interface INFTURIExtension is INFTExtension {
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File @openzeppelin/contracts/token/ERC721/IERC721.sol@v4.7.0
// License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File contracts/interfaces/IMetaverseNFT.sol
// License-Identifier: MIT
pragma solidity ^0.8.9;
interface IAvatarNFT {
function DEVELOPER() external pure returns (string memory _url);
function DEVELOPER_ADDRESS() external pure returns (address payable _dev);
// ------ View functions ------
function saleStarted() external view returns (bool);
function isExtensionAdded(address extension) external view returns (bool);
/**
Extra information stored for each tokenId. Optional, provided on mint
*/
function data(uint256 tokenId) external view returns (bytes32);
// ------ Mint functions ------
/**
Mint from NFTExtension contract. Optionally provide data parameter.
*/
function mintExternal(
uint256 tokenId,
address to,
bytes32 data
) external payable;
// ------ Admin functions ------
function addExtension(address extension) external;
function revokeExtension(address extension) external;
function withdraw() external;
}
interface IMetaverseNFT is IAvatarNFT {
// ------ View functions ------
/**
Recommended royalty for tokenId sale.
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
// ------ Admin functions ------
function setRoyaltyReceiver(address receiver) external;
function setRoyaltyFee(uint256 fee) external;
}
// File contracts/extensions/base/NFTExtension.sol
// License-Identifier: MIT
pragma solidity ^0.8.9;
contract NFTExtension is INFTExtension, ERC165 {
IMetaverseNFT public immutable nft;
constructor(address _nft) {
nft = IMetaverseNFT(_nft);
}
function beforeMint() internal view {
require(
nft.isExtensionAdded(address(this)),
"NFTExtension: this contract is not allowed to be used as an extension"
);
}
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(IERC165, ERC165)
returns (bool)
{
return
interfaceId == type(INFTExtension).interfaceId ||
super.supportsInterface(interfaceId);
}
}
// File contracts/extensions/base/SaleControl.sol
// License-Identifier: MIT
pragma solidity ^0.8.9;
abstract contract SaleControl is Ownable {
uint256 public constant __SALE_NEVER_STARTS = 2**256 - 1;
uint256 public startTimestamp = __SALE_NEVER_STARTS;
modifier whenSaleStarted() {
require(saleStarted(), "Sale not started yet");
_;
}
function updateStartTimestamp(uint256 _startTimestamp) public onlyOwner {
startTimestamp = _startTimestamp;
}
function startSale() public onlyOwner {
startTimestamp = block.timestamp;
}
function stopSale() public onlyOwner {
startTimestamp = __SALE_NEVER_STARTS;
}
function saleStarted() public view returns (bool) {
return block.timestamp >= startTimestamp;
}
}
// File contracts/extensions/DynamicPricePresaleListExtension.sol
// License-Identifier: MIT
pragma solidity ^0.8.9;
contract DynamicPricePresaleListExtension is NFTExtension, Ownable, SaleControl {
uint256 public pricePerOne;
uint256 public maxPerAddress;
bytes32 public whitelistRoot;
mapping(address => uint256) public claimedByAddress;
constructor(
address _nft,
bytes32 _whitelistRoot,
uint256 _pricePerOne,
uint256 _maxPerAddress
) NFTExtension(_nft) SaleControl() {
stopSale();
pricePerOne = _pricePerOne;
maxPerAddress = _maxPerAddress;
whitelistRoot = _whitelistRoot;
}
function price(uint256 nTokens) public view returns (uint256) {
// one for free, 2+ for price
return pricePerOne * (nTokens - 1);
}
function updatePrice(uint256 _price) public onlyOwner {
pricePerOne = _price;
}
function updateMaxPerAddress(uint256 _maxPerAddress) public onlyOwner {
maxPerAddress = _maxPerAddress;
}
function updateWhitelistRoot(bytes32 _whitelistRoot) public onlyOwner {
whitelistRoot = _whitelistRoot;
}
function mint(uint256 nTokens, bytes32[] memory proof)
external
payable
whenSaleStarted
{
require(
isWhitelisted(whitelistRoot, msg.sender, proof),
"Not whitelisted"
);
require(
claimedByAddress[msg.sender] + nTokens <= maxPerAddress,
"Cannot claim more per address"
);
require(msg.value >= price(nTokens), "Not enough ETH to mint");
claimedByAddress[msg.sender] += nTokens;
nft.mintExternal{value: msg.value}(nTokens, msg.sender, bytes32(0x0));
}
function isWhitelisted(
bytes32 root,
address receiver,
bytes32[] memory proof
) public pure returns (bool) {
bytes32 leaf = keccak256(abi.encodePacked(receiver));
return MerkleProof.verify(proof, root, leaf);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"bytes32","name":"_whitelistRoot","type":"bytes32"},{"internalType":"uint256","name":"_pricePerOne","type":"uint256"},{"internalType":"uint256","name":"_maxPerAddress","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"__SALE_NEVER_STARTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"maxPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nTokens","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"contract IMetaverseNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nTokens","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerAddress","type":"uint256"}],"name":"updateMaxPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"name":"updateStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistRoot","type":"bytes32"}],"name":"updateWhitelistRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60a060405260001960015534801561001657600080fd5b50604051610f99380380610f9983398101604081905261003591610125565b6001600160a01b03841660805261004b33610065565b6100536100b5565b60029190915560035560045550610170565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6100bd6100c5565b600019600155565b6000546001600160a01b031633146101235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b6000806000806080858703121561013b57600080fd5b84516001600160a01b038116811461015257600080fd5b60208601516040870151606090970151919890975090945092505050565b608051610e076101926000396000818161025f01526107a80152610e076000f3fe60806040526004361061016a5760003560e01c80638d6cc56d116100cb578063ba41b0c61161007f578063e6fd48bc11610059578063e6fd48bc146103e5578063f2fde38b146103fb578063f73d308a1461041b57600080fd5b8063ba41b0c61461039d578063e36b0b37146103b0578063e67151ae146103c557600080fd5b80639a8b93b5116100b05780639a8b93b514610334578063adf8750c14610354578063b66a0e5d1461038857600080fd5b80638d6cc56d146102e95780638da5cb5b1461030957600080fd5b8063456ecb20116101225780635c474f9e116101075780635c474f9e146102a6578063639814e0146102be578063715018a6146102d457600080fd5b8063456ecb201461023757806347ccca021461024d57600080fd5b806328592fc61161015357806328592fc6146101d25780632f74e50e146101ff578063386bfc981461022157600080fd5b806301ffc9a71461016f57806326a49e37146101a4575b600080fd5b34801561017b57600080fd5b5061018f61018a366004610aa9565b61043b565b60405190151581526020015b60405180910390f35b3480156101b057600080fd5b506101c46101bf366004610aeb565b6104b3565b60405190815260200161019b565b3480156101de57600080fd5b506101c46101ed366004610b2d565b60056020526000908152604090205481565b34801561020b57600080fd5b5061021f61021a366004610aeb565b6104cd565b005b34801561022d57600080fd5b506101c460045481565b34801561024357600080fd5b506101c460025481565b34801561025957600080fd5b506102817f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b3480156102b257600080fd5b5060015442101561018f565b3480156102ca57600080fd5b506101c460035481565b3480156102e057600080fd5b5061021f6104da565b3480156102f557600080fd5b5061021f610304366004610aeb565b6104ee565b34801561031557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610281565b34801561034057600080fd5b5061018f61034f366004610c30565b6104fb565b34801561036057600080fd5b506101c47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b34801561039457600080fd5b5061021f61055e565b61021f6103ab366004610c87565b61056c565b3480156103bc57600080fd5b5061021f61081f565b3480156103d157600080fd5b5061021f6103e0366004610aeb565b61084d565b3480156103f157600080fd5b506101c460015481565b34801561040757600080fd5b5061021f610416366004610b2d565b61085a565b34801561042757600080fd5b5061021f610436366004610aeb565b610911565b60007fffffffff00000000000000000000000000000000000000000000000000000000821615806104ad57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60006104c0600183610cfd565b6002546104ad9190610d14565b6104d561091e565b600355565b6104e261091e565b6104ec600061099f565b565b6104f661091e565b600255565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b1660208201526000908190603401604051602081830303815290604052805190602001209050610555838683610a14565b95945050505050565b61056661091e565b42600155565b6001544210156105dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f53616c65206e6f7420737461727465642079657400000000000000000000000060448201526064015b60405180910390fd5b6105ea60045433836104fb565b610650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f742077686974656c6973746564000000000000000000000000000000000060448201526064016105d4565b6003543360009081526005602052604090205461066e908490610d51565b11156106d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f43616e6e6f7420636c61696d206d6f726520706572206164647265737300000060448201526064016105d4565b6106df826104b3565b341015610748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e6f7420656e6f7567682045544820746f206d696e740000000000000000000060448201526064016105d4565b3360009081526005602052604081208054849290610767908490610d51565b90915550506040517f4690521b00000000000000000000000000000000000000000000000000000000815260048101839052336024820152600060448201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634690521b9034906064016000604051808303818588803b15801561080257600080fd5b505af1158015610816573d6000803e3d6000fd5b50505050505050565b61082761091e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600155565b61085561091e565b600155565b61086261091e565b73ffffffffffffffffffffffffffffffffffffffff8116610905576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105d4565b61090e8161099f565b50565b61091961091e565b600455565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105d4565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082610a218584610a2a565b14949350505050565b600081815b8451811015610a6f57610a5b82868381518110610a4e57610a4e610d69565b6020026020010151610a77565b915080610a6781610d98565b915050610a2f565b509392505050565b6000818310610a93576000828152602084905260409020610aa2565b60008381526020839052604090205b9392505050565b600060208284031215610abb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610aa257600080fd5b600060208284031215610afd57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b2857600080fd5b919050565b600060208284031215610b3f57600080fd5b610aa282610b04565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112610b8857600080fd5b8135602067ffffffffffffffff80831115610ba557610ba5610b48565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715610be857610be8610b48565b604052938452858101830193838101925087851115610c0657600080fd5b83870191505b84821015610c2557813583529183019190830190610c0c565b979650505050505050565b600080600060608486031215610c4557600080fd5b83359250610c5560208501610b04565b9150604084013567ffffffffffffffff811115610c7157600080fd5b610c7d86828701610b77565b9150509250925092565b60008060408385031215610c9a57600080fd5b82359150602083013567ffffffffffffffff811115610cb857600080fd5b610cc485828601610b77565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015610d0f57610d0f610cce565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d4c57610d4c610cce565b500290565b60008219821115610d6457610d64610cce565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610dca57610dca610cce565b506001019056fea2646970667358221220b1728e4324c38a19e3a2fd840b85cd80cc0dc689fc7bfdcd7b0c8664cba5910664736f6c6343000809003300000000000000000000000015d6ab15b3779e5da714869133fb2b7c156afd1ca8a22b953b9812c105278e34a4884c1a482f256f048f46a0bd016833aa9bbd720000000000000000000000000000000000000000000000000018838370f340000000000000000000000000000000000000000000000000000000000000000003
Deployed Bytecode
0x60806040526004361061016a5760003560e01c80638d6cc56d116100cb578063ba41b0c61161007f578063e6fd48bc11610059578063e6fd48bc146103e5578063f2fde38b146103fb578063f73d308a1461041b57600080fd5b8063ba41b0c61461039d578063e36b0b37146103b0578063e67151ae146103c557600080fd5b80639a8b93b5116100b05780639a8b93b514610334578063adf8750c14610354578063b66a0e5d1461038857600080fd5b80638d6cc56d146102e95780638da5cb5b1461030957600080fd5b8063456ecb20116101225780635c474f9e116101075780635c474f9e146102a6578063639814e0146102be578063715018a6146102d457600080fd5b8063456ecb201461023757806347ccca021461024d57600080fd5b806328592fc61161015357806328592fc6146101d25780632f74e50e146101ff578063386bfc981461022157600080fd5b806301ffc9a71461016f57806326a49e37146101a4575b600080fd5b34801561017b57600080fd5b5061018f61018a366004610aa9565b61043b565b60405190151581526020015b60405180910390f35b3480156101b057600080fd5b506101c46101bf366004610aeb565b6104b3565b60405190815260200161019b565b3480156101de57600080fd5b506101c46101ed366004610b2d565b60056020526000908152604090205481565b34801561020b57600080fd5b5061021f61021a366004610aeb565b6104cd565b005b34801561022d57600080fd5b506101c460045481565b34801561024357600080fd5b506101c460025481565b34801561025957600080fd5b506102817f00000000000000000000000015d6ab15b3779e5da714869133fb2b7c156afd1c81565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b3480156102b257600080fd5b5060015442101561018f565b3480156102ca57600080fd5b506101c460035481565b3480156102e057600080fd5b5061021f6104da565b3480156102f557600080fd5b5061021f610304366004610aeb565b6104ee565b34801561031557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610281565b34801561034057600080fd5b5061018f61034f366004610c30565b6104fb565b34801561036057600080fd5b506101c47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b34801561039457600080fd5b5061021f61055e565b61021f6103ab366004610c87565b61056c565b3480156103bc57600080fd5b5061021f61081f565b3480156103d157600080fd5b5061021f6103e0366004610aeb565b61084d565b3480156103f157600080fd5b506101c460015481565b34801561040757600080fd5b5061021f610416366004610b2d565b61085a565b34801561042757600080fd5b5061021f610436366004610aeb565b610911565b60007fffffffff00000000000000000000000000000000000000000000000000000000821615806104ad57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60006104c0600183610cfd565b6002546104ad9190610d14565b6104d561091e565b600355565b6104e261091e565b6104ec600061099f565b565b6104f661091e565b600255565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b1660208201526000908190603401604051602081830303815290604052805190602001209050610555838683610a14565b95945050505050565b61056661091e565b42600155565b6001544210156105dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f53616c65206e6f7420737461727465642079657400000000000000000000000060448201526064015b60405180910390fd5b6105ea60045433836104fb565b610650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f742077686974656c6973746564000000000000000000000000000000000060448201526064016105d4565b6003543360009081526005602052604090205461066e908490610d51565b11156106d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f43616e6e6f7420636c61696d206d6f726520706572206164647265737300000060448201526064016105d4565b6106df826104b3565b341015610748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e6f7420656e6f7567682045544820746f206d696e740000000000000000000060448201526064016105d4565b3360009081526005602052604081208054849290610767908490610d51565b90915550506040517f4690521b00000000000000000000000000000000000000000000000000000000815260048101839052336024820152600060448201527f00000000000000000000000015d6ab15b3779e5da714869133fb2b7c156afd1c73ffffffffffffffffffffffffffffffffffffffff1690634690521b9034906064016000604051808303818588803b15801561080257600080fd5b505af1158015610816573d6000803e3d6000fd5b50505050505050565b61082761091e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600155565b61085561091e565b600155565b61086261091e565b73ffffffffffffffffffffffffffffffffffffffff8116610905576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105d4565b61090e8161099f565b50565b61091961091e565b600455565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105d4565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082610a218584610a2a565b14949350505050565b600081815b8451811015610a6f57610a5b82868381518110610a4e57610a4e610d69565b6020026020010151610a77565b915080610a6781610d98565b915050610a2f565b509392505050565b6000818310610a93576000828152602084905260409020610aa2565b60008381526020839052604090205b9392505050565b600060208284031215610abb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610aa257600080fd5b600060208284031215610afd57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b2857600080fd5b919050565b600060208284031215610b3f57600080fd5b610aa282610b04565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112610b8857600080fd5b8135602067ffffffffffffffff80831115610ba557610ba5610b48565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715610be857610be8610b48565b604052938452858101830193838101925087851115610c0657600080fd5b83870191505b84821015610c2557813583529183019190830190610c0c565b979650505050505050565b600080600060608486031215610c4557600080fd5b83359250610c5560208501610b04565b9150604084013567ffffffffffffffff811115610c7157600080fd5b610c7d86828701610b77565b9150509250925092565b60008060408385031215610c9a57600080fd5b82359150602083013567ffffffffffffffff811115610cb857600080fd5b610cc485828601610b77565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015610d0f57610d0f610cce565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d4c57610d4c610cce565b500290565b60008219821115610d6457610d64610cce565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610dca57610dca610cce565b506001019056fea2646970667358221220b1728e4324c38a19e3a2fd840b85cd80cc0dc689fc7bfdcd7b0c8664cba5910664736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000015d6ab15b3779e5da714869133fb2b7c156afd1ca8a22b953b9812c105278e34a4884c1a482f256f048f46a0bd016833aa9bbd720000000000000000000000000000000000000000000000000018838370f340000000000000000000000000000000000000000000000000000000000000000003
-----Decoded View---------------
Arg [0] : _nft (address): 0x15D6aB15b3779E5DA714869133FB2b7c156aFd1c
Arg [1] : _whitelistRoot (bytes32): 0xa8a22b953b9812c105278e34a4884c1a482f256f048f46a0bd016833aa9bbd72
Arg [2] : _pricePerOne (uint256): 6900000000000000
Arg [3] : _maxPerAddress (uint256): 3
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000015d6ab15b3779e5da714869133fb2b7c156afd1c
Arg [1] : a8a22b953b9812c105278e34a4884c1a482f256f048f46a0bd016833aa9bbd72
Arg [2] : 0000000000000000000000000000000000000000000000000018838370f34000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
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.