Contract 0x1c86a643633e5587e5460e27ee788b47115944e2

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x820f83edc89278f6d090852a7c4a034f74339bf1df4c6ec135cf84d89479758aTransfer Ownersh...132962702024-04-02 15:42:5847 days 18 hrs ago0x6e70ec9b721343e1ac94329af951cb1e3a2d4222 IN  0x1c86a643633e5587e5460e27ee788b47115944e20 CRO0.1444224395 5,048.5
0xa5627c22a1cd8d575eda26725e85361f9e8818e0009c3617fd5bc43e20229401Create NFT Launc...68826602023-02-09 10:05:04466 days 10 mins ago0x6e70ec9b721343e1ac94329af951cb1e3a2d4222 IN  0x1c86a643633e5587e5460e27ee788b47115944e20 CRO1.9320976459470
0xe53c5cd0cdf270b65db0c9f609a868ce37db8647998aab5349a6df0b163e4923Create NFT Launc...64531762023-01-12 6:39:47494 days 3 hrs ago0x6e70ec9b721343e1ac94329af951cb1e3a2d4222 IN  0x1c86a643633e5587e5460e27ee788b47115944e20 CRO1.9675542766010
0x9e4019b59b9c5f7b196342a49cf7373f924dbb48746e92bc774004c17c82f3beSet ERC721Templa...64531442023-01-12 6:36:47494 days 3 hrs ago0x6e70ec9b721343e1ac94329af951cb1e3a2d4222 IN  0x1c86a643633e5587e5460e27ee788b47115944e20 CRO0.2360439263120
0x61989be039a237948af60ef4d64218c525720e1682b2603e5bce8053981c43720x6080604064531262023-01-12 6:35:05494 days 3 hrs ago0x6e70ec9b721343e1ac94329af951cb1e3a2d4222 IN  Contract Creation0 CRO2.8698544289610
[ Download CSV Export 
Latest 2 internal transactions
Parent Txn Hash Block From To Value
0xa5627c22a1cd8d575eda26725e85361f9e8818e0009c3617fd5bc43e2022940168826602023-02-09 10:05:04466 days 10 mins ago 0x1c86a643633e5587e5460e27ee788b47115944e2  Contract Creation0 CRO
0xe53c5cd0cdf270b65db0c9f609a868ce37db8647998aab5349a6df0b163e492364531762023-01-12 6:39:47494 days 3 hrs ago 0x1c86a643633e5587e5460e27ee788b47115944e2  Contract Creation0 CRO
[ Download CSV Export 
Index Block
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

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

Contract Name:
NFTLaunchpadFactory

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : NFTLaunchpadFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/proxy/Clones.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./interfaces/ILaunchpadERC721.sol";

contract NFTLaunchpadFactory is Ownable, ReentrancyGuard {
    address public erc721Template;

    event LaunchpadERC721(address creator, address erc721Address);

    event SetERC721Template(address erc721Template);

    /**
     * @dev Clone the implementation and initialize with proper parameters
     *
     * @param _name the name of the collection
     * @param _symbol the symbol of the collection
     * @param _defaultBaseURI default base URI
     * @param _maxSupply max supply of the collection
     * @param _ownerAddress address of the contract owner
     * @param _mintFee protocol mint fee
     * @param _mintFeeRecipient protocol mint fee recipient
     * @param _royaltyFee royalty fee numerator, 0 -> 10000 eg. 100 = 1%, 10000 = 100%
     * @param _royaltyFeeRecipient Royalty receiver
     */
    function createNFTLaunchpad(
        string memory _name,
        string memory _symbol,
        string memory _defaultBaseURI,
        uint256 _maxSupply,
        address _ownerAddress,
        uint256 _mintFee,
        address _mintFeeRecipient,
        uint96 _royaltyFee,
        address _royaltyFeeRecipient
    ) external nonReentrant returns (address erc721Address) {
        require(_ownerAddress != address(0), "owner address 0");
        require(_maxSupply > 0, "max supply is zero");

        require((bytes(_defaultBaseURI)).length != 0, "empty default base URI");

        require(erc721Template != address(0), "ERC721 template not set");
        
        erc721Address = Clones.clone(erc721Template);

        ILaunchpadERC721(erc721Address).initialize(
          _name, _symbol, _defaultBaseURI,  _maxSupply, _ownerAddress, _mintFee, _mintFeeRecipient, _royaltyFee, _royaltyFeeRecipient
        );
        emit LaunchpadERC721(msg.sender, erc721Address);
    }

    /**
     * @dev Set ERC721 template for the NFT Project
     *
     * @param _erc721Template: address of the template
     */
    function setERC721Template(address _erc721Template) external onlyOwner {
      require(_erc721Template != address(0), "address 0 not allowed");
        erc721Template = _erc721Template;
        emit SetERC721Template(_erc721Template);
    }
}

File 2 of 6 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * 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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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 3 of 6 : Clones.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/Clones.sol)

pragma solidity ^0.8.0;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
 * deploying minimal proxy contracts, also known as "clones".
 *
 * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
 * > a minimal bytecode implementation that delegates all calls to a known, fixed address.
 *
 * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
 * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
 * deterministic method.
 *
 * _Available since v3.4._
 */
library Clones {
    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone(address implementation) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create(0, ptr, 0x37)
        }
        require(instance != address(0), "ERC1167: create failed");
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create2(0, ptr, 0x37, salt)
        }
        require(instance != address(0), "ERC1167: create2 failed");
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000)
            mstore(add(ptr, 0x38), shl(0x60, deployer))
            mstore(add(ptr, 0x4c), salt)
            mstore(add(ptr, 0x6c), keccak256(ptr, 0x37))
            predicted := keccak256(add(ptr, 0x37), 0x55)
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(address implementation, bytes32 salt)
        internal
        view
        returns (address predicted)
    {
        return predictDeterministicAddress(implementation, salt, address(this));
    }
}

File 4 of 6 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 5 of 6 : ILaunchpadERC721.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;

interface ILaunchpadERC721 {
    function initialize(
        string memory _name,
        string memory _symbol,
        string memory _defaultBaseURI,
        uint256 _maxSupply,
        address _ownerAddress,
        uint256 _mintFee,
        address _mintFeeRecipient,
        uint96 _royaltyFee,
        address _royaltyFeeRecipient
    ) external;
    
    function mint(uint256 _amount, uint8 _sid, bytes32[] calldata _proof) external payable; 
}

File 6 of 6 : Context.sol
// SPDX-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;
    }
}

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

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address","name":"erc721Address","type":"address"}],"name":"LaunchpadERC721","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"erc721Template","type":"address"}],"name":"SetERC721Template","type":"event"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_defaultBaseURI","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"uint256","name":"_mintFee","type":"uint256"},{"internalType":"address","name":"_mintFeeRecipient","type":"address"},{"internalType":"uint96","name":"_royaltyFee","type":"uint96"},{"internalType":"address","name":"_royaltyFeeRecipient","type":"address"}],"name":"createNFTLaunchpad","outputs":[{"internalType":"address","name":"erc721Address","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"erc721Template","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc721Template","type":"address"}],"name":"setERC721Template","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100625760003560e01c8063715018a6146100675780638da5cb5b14610071578063e5f3dc021461009a578063f1f4d7c8146100ad578063f2fde38b146100c0578063ffa1ba38146100d3575b600080fd5b61006f6100e6565b005b6000546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b60025461007e906001600160a01b031681565b61007e6100bb3660046106ba565b610125565b61006f6100ce366004610698565b610384565b61006f6100e1366004610698565b61041f565b6000546001600160a01b031633146101195760405162461bcd60e51b815260040161011090610870565b60405180910390fd5b61012360006104eb565b565b60006002600154141561017a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610110565b60026001556001600160a01b0386166101c75760405162461bcd60e51b815260206004820152600f60248201526e06f776e65722061646472657373203608c1b6044820152606401610110565b6000871161020c5760405162461bcd60e51b81526020600482015260126024820152716d617820737570706c79206973207a65726f60701b6044820152606401610110565b87516102535760405162461bcd60e51b8152602060048201526016602482015275656d7074792064656661756c7420626173652055524960501b6044820152606401610110565b6002546001600160a01b03166102ab5760405162461bcd60e51b815260206004820152601760248201527f4552433732312074656d706c617465206e6f74207365740000000000000000006044820152606401610110565b6002546102c0906001600160a01b031661053b565b60405163ae38684360e01b81529091506001600160a01b0382169063ae386843906102ff908d908d908d908d908d908d908d908d908d906004016107e6565b600060405180830381600087803b15801561031957600080fd5b505af115801561032d573d6000803e3d6000fd5b5050604080513381526001600160a01b03851660208201527fc9b080d6a541d8c9ec9b22b7bc7e38e334bfaf9c578c03e2434b25c60d2d9eba935001905060405180910390a1600180559998505050505050505050565b6000546001600160a01b031633146103ae5760405162461bcd60e51b815260040161011090610870565b6001600160a01b0381166104135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610110565b61041c816104eb565b50565b6000546001600160a01b031633146104495760405162461bcd60e51b815260040161011090610870565b6001600160a01b0381166104975760405162461bcd60e51b81526020600482015260156024820152741859191c995cdcc80c081b9bdd08185b1b1bddd959605a1b6044820152606401610110565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f4c6b035f3a2ac4f36852612ddbddb8ada28c34543627e9f8eaefb92ad2f5847d9060200160405180910390a150565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b0381166105d35760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b6044820152606401610110565b919050565b80356001600160a01b03811681146105d357600080fd5b600082601f83011261060057600080fd5b813567ffffffffffffffff8082111561061b5761061b6108a5565b604051601f8301601f19908116603f01168101908282118183101715610643576106436108a5565b8160405283815286602085880101111561065c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356bffffffffffffffffffffffff811681146105d357600080fd5b6000602082840312156106aa57600080fd5b6106b3826105d8565b9392505050565b60008060008060008060008060006101208a8c0312156106d957600080fd5b893567ffffffffffffffff808211156106f157600080fd5b6106fd8d838e016105ef565b9a5060208c013591508082111561071357600080fd5b61071f8d838e016105ef565b995060408c013591508082111561073557600080fd5b506107428c828d016105ef565b97505060608a0135955061075860808b016105d8565b945060a08a0135935061076d60c08b016105d8565b925061077b60e08b0161067c565b915061078a6101008b016105d8565b90509295985092959850929598565b6000815180845260005b818110156107bf576020818501810151868301820152016107a3565b818111156107d1576000602083870101525b50601f01601f19169290920160200192915050565b60006101208083526107fa8184018d610799565b9050828103602084015261080e818c610799565b90508281036040840152610822818b610799565b606084019990995250506001600160a01b03958616608082015260a081019490945291841660c08401526bffffffffffffffffffffffff1660e0830152909116610100909101529392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052604160045260246000fdfea264697066735822122026bc51a9bfe92cff79894fb299bf238de9c7a9dc03ffc0d99af0f623e01219ee64736f6c63430008070033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.