Created
March 18, 2022 12:25
-
-
Save dueka/0943ad0567cbc35e57e2bb45887f8a16 to your computer and use it in GitHub Desktop.
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: GPL-3.0 | |
/** | |
!Disclaimer! | |
These contracts have been used to create tutorials, | |
and was created for the purpose to teach people | |
how to create smart contracts on the blockchain. | |
please review this code on your own before using any of | |
the following code for production. | |
*/ | |
pragma solidity >=0.7.0 <0.9.0; | |
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; | |
import "@openzeppelin/contracts/access/Ownable.sol"; | |
/// @title Contract to deploy NFTs to the opensea blockchain | |
contract RetroNFT is ERC721Enumerable, Ownable { | |
using Strings for uint256; | |
/// URI to read metadata of images to be deployed | |
string public baseURI; | |
/// expected file extensuon to be contained in URI | |
string public baseExtension = ".json"; | |
/// cost of individual NFTs in collection | |
uint256 public cost = 0.033 ether; | |
/// Maximum supply of NFTs to be deployed by contract | |
uint256 public maxSupply = 10000; | |
/// maximum amount to be minted | |
uint256 public maxMintAmount = 300; | |
bool public paused = false; | |
/// allowed addresses | |
mapping(address => bool) public whitelisted; | |
constructor( | |
string memory _name, | |
string memory _symbol, | |
string memory _initBaseURI | |
) ERC721(_name, _symbol) { | |
setBaseURI(_initBaseURI); | |
mint(msg.sender, 220); | |
} | |
// set URI which contains created images, likely a pinata CID. | |
function _baseURI() internal view virtual override returns (string memory) { | |
return baseURI; | |
} | |
/// @dev Creates tokens of token type `id`, and assigns them to `to` | |
/// `to` cannot be a zero address | |
function mint(address _to, uint256 _mintAmount) public payable { | |
uint256 supply = totalSupply(); | |
require(!paused); | |
require(_mintAmount > 0); | |
require(_mintAmount <= maxMintAmount); | |
require(supply + _mintAmount <= maxSupply); | |
if (msg.sender != owner()) { | |
if(whitelisted[msg.sender] != true) { | |
require(msg.value >= cost * _mintAmount); | |
} | |
} | |
for (uint256 i = 1; i <= _mintAmount; i++) { | |
_safeMint(_to, supply + i); | |
} | |
} | |
/// function which provides a basic access control mechanism | |
/// where there is an account (an owner) that can be granted access to specific functions | |
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 setCost(uint256 _newCost) public onlyOwner { | |
cost = _newCost; | |
} | |
function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { | |
maxMintAmount = _newmaxMintAmount; | |
} | |
function setBaseURI(string memory _newBaseURI) public onlyOwner { | |
baseURI = _newBaseURI; | |
} | |
function setBaseExtension(string memory _newBaseExtension) public onlyOwner { | |
baseExtension = _newBaseExtension; | |
} | |
function pause(bool _state) public onlyOwner { | |
paused = _state; | |
} | |
function whitelistUser(address _user) public onlyOwner { | |
whitelisted[_user] = true; | |
} | |
function removeWhitelistUser(address _user) public onlyOwner { | |
whitelisted[_user] = false; | |
} | |
function withdraw() public payable onlyOwner { | |
/// implementing transfer instead of call.value | |
(bool os, ) = payable(owner()).call{value: address(this).balance}(""); | |
require(os); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment