// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol";
contract THECLUB is Ownable, ERC721 {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
uint256 public mintFees;
address public admin;
mapping (address => bool) public _whitelist;
mapping (address => uint256) public buyBalance;
uint256 public start;
uint256 public preSaleEnd;
uint256 public pubSaleEnd;
uint256 public sold;
constructor () ERC721("THE CLUB F11", "$F11CLUB") {
mintFees = 76 *10**15;
admin = msg.sender;
sold = 0;
_safeMint(msg.sender, 1);
_safeMint(msg.sender, 26);
_safeMint(msg.sender, 51);
_safeMint(msg.sender, 76);
_safeMint(msg.sender, 101);
_safeMint(msg.sender, 126);
start = 1645437600;
preSaleEnd = 1645524000;
pubSaleEnd = 1645696800;
}
function _baseURI() internal pure override returns (string memory) {
return "https://ipfs.io/ipfs/bafybeiatu2dqn32xprwi4z26kuxr5ezkwr33xpicqxpy3ga2jftven2swe/";
}
function setAdmin (address newAdmin) public {
require(msg.sender == admin, "unauthorized");
admin = newAdmin;
}
function setDates (uint256 start_, uint256 preSaleEnd_, uint256 pubSaleEnd_) public {
require(msg.sender == admin, "unauthorized");
start = start_;
preSaleEnd = preSaleEnd_;
pubSaleEnd = pubSaleEnd_;
}
function whiteList (address[] calldata accounts, bool isWhiteList ) public {
require(msg.sender == admin, "unauthorized");
for (uint256 i = 0; i < accounts.length; ++i ) {
_whitelist[accounts[i]] = isWhiteList;
}
}
function mint(uint256 n) public payable returns(uint256) {
require(buyBalance[msg.sender] < 2 && n <= 2, "you can only buy 2 NFTs");
require(n <= 2 - buyBalance[msg.sender], "invalid n");
require(msg.value == mintFees*n, "invalid fees");
require(block.timestamp >= start, "minting no start yet");
require(block.timestamp <= pubSaleEnd, "minting finished");
uint256 newItemId = 0;
for(uint256 i =0; i < n; ++i) {
sold++;
if(block.timestamp < preSaleEnd) {
require(_whitelist[msg.sender], "you are not whitelisted");
require(sold < 95, "pre sale sold out");
}
_tokenIds.increment();
newItemId = _tokenIds.current();
if(newItemId == 1 || newItemId == 26 || newItemId == 51 || newItemId == 76 || newItemId == 101 || newItemId == 126){
_tokenIds.increment();
newItemId = _tokenIds.current();
}
// 1,26,51,76,101,126
require(newItemId <= 150, "all minted");
_safeMint(msg.sender, newItemId);
buyBalance[msg.sender] += n;
}
(bool succ, ) = address(0xcf60E7aAB58c7fdB68fe720182b5e450BAf85441).call{value: msg.value}("");
require(succ, "ETH not sent");
return newItemId;
}
function tokenURI(uint256 tokenId) override public view virtual returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return string(
abi.encodePacked(
baseURI,
Strings.toString(tokenId),
".json"
)
);
}
function withdrawEth() public {
require(msg.sender == admin, "only admin");
uint256 Balance = address(this).balance;
(bool succ, ) = address(admin).call{value: Balance}("");
require(succ, "ETH not sent");
}
}
{
"compilationTarget": {
"theclub.sol": "THECLUB"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"buyBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubSaleEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start_","type":"uint256"},{"internalType":"uint256","name":"preSaleEnd_","type":"uint256"},{"internalType":"uint256","name":"pubSaleEnd_","type":"uint256"}],"name":"setDates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"isWhiteList","type":"bool"}],"name":"whiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"}]