Created
January 28, 2022 22:37
-
-
Save noFAYZ/96b7d2215d2e2ffbaae15738e540f6f2 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.8.7+commit.e28d00a7.js&optimize=true&runs=200&gist=
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
/* | |
CyberStellar - Smart Contract with burn functionality. | |
Author: Faizan | |
*/ | |
pragma solidity ^0.8.2; | |
import "@openzeppelin/contracts@4.4.2/token/ERC721/ERC721.sol"; | |
import "@openzeppelin/contracts@4.4.2/token/ERC721/extensions/ERC721Enumerable.sol"; | |
import "@openzeppelin/contracts@4.4.2/token/ERC721/extensions/ERC721Burnable.sol"; | |
import "@openzeppelin/contracts@4.4.2/access/Ownable.sol"; | |
contract CyberStellar is ERC721, ERC721Enumerable, ERC721Burnable, Ownable { | |
using Strings for uint256; | |
string public baseExtension = ".json"; | |
uint256 public cost = 0.01 ether; | |
uint256 public maxSupply = 5; | |
uint256 public maxMintAmount = 2; | |
uint256 public nftPerAddressLimit = 4; | |
bool public paused = false; | |
bool public onlyWhitelisted = true; | |
address[] public whitelistedAddresses; | |
constructor( | |
string memory _name, | |
string memory _symbol | |
) ERC721(_name, _symbol) { | |
} | |
function _baseURI() internal pure override returns (string memory) { | |
return "ipfs://QmVrsvEWgL4gndMQWohcSKszqB8ACrZapKYou886KXj8y8/"; | |
} | |
function mint( uint256 _mintAmount) public payable { | |
require(!paused); | |
uint256 supply = totalSupply(); | |
require(_mintAmount > 0); | |
require(_mintAmount <= maxMintAmount); | |
require(supply + _mintAmount <= maxSupply); | |
if (msg.sender != owner()) { | |
if(onlyWhitelisted == true) { | |
require(isWhitelisted(msg.sender), "User not Whitelisted"); | |
uint256 ownerTokenCount = balanceOf(msg.sender); | |
require(ownerTokenCount < nftPerAddressLimit); | |
} | |
require(msg.value >= cost * _mintAmount); | |
} | |
for (uint256 i = 1; i <= _mintAmount; i++) { | |
_safeMint(msg.sender, supply + i); | |
} | |
} | |
function isWhitelisted(address _user) public view returns (bool){ | |
for(uint256 i=0; i< whitelistedAddresses.length;i++){ | |
if(whitelistedAddresses[i] == _user){ | |
return true; | |
} | |
} | |
return false; | |
} | |
function walletOfOwner(address _owner) | |
public | |
view | |
returns (uint256[] memory) | |
{ | |
uint256 ownerTokenCount = balanceOf(_owner); | |
uint256[] memory tokenIds = new uint256[](ownerTokenCount); | |
for (uint256 i; i < ownerTokenCount; i++) { | |
tokenIds[i] = tokenOfOwnerByIndex(_owner, i); | |
} | |
return tokenIds; | |
} | |
function tokenURI(uint256 tokenId) | |
public | |
view | |
virtual | |
override | |
returns (string memory) | |
{ | |
require( | |
_exists(tokenId), | |
"ERC721Metadata: URI query for nonexistent token" | |
); | |
string memory currentBaseURI = _baseURI(); | |
return bytes(currentBaseURI).length > 0 | |
? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) | |
: ""; | |
} | |
//only owner | |
function setNftPerAddressLimit(uint256 _limit) public onlyOwner { | |
nftPerAddressLimit = _limit; | |
} | |
function setCost(uint256 _newCost) public onlyOwner { | |
cost = _newCost; | |
} | |
function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { | |
maxMintAmount = _newmaxMintAmount; | |
} | |
function setBaseExtension(string memory _newBaseExtension) public onlyOwner { | |
baseExtension = _newBaseExtension; | |
} | |
function pause(bool _state) public onlyOwner { | |
paused = _state; | |
} | |
function setOnlyWhitelisted(bool _state) public onlyOwner { | |
onlyWhitelisted = _state; | |
} | |
function whitelistUsers(address[] calldata _users) public onlyOwner { | |
delete whitelistedAddresses; | |
whitelistedAddresses = _users; | |
} | |
function withdraw() public payable onlyOwner { | |
// ============================================================================= | |
(bool os, ) = payable(owner()).call{value: address(this).balance}(""); | |
require(os); | |
// ============================================================================= | |
} | |
// The following functions are overrides required by Solidity. | |
function _beforeTokenTransfer(address from, address to, uint256 tokenId) | |
internal | |
override(ERC721, ERC721Enumerable) | |
{ | |
super._beforeTokenTransfer(from, to, tokenId); | |
} | |
function supportsInterface(bytes4 interfaceId) | |
public | |
view | |
override(ERC721, ERC721Enumerable) | |
returns (bool) | |
{ | |
return super.supportsInterface(interfaceId); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment