Created
March 8, 2022 06:15
-
-
Save sinned/c15f5b80fe424f57ba09a774582a8c02 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=false&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 | |
pragma solidity ^0.8.7; | |
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; | |
import "@openzeppelin/contracts/access/Ownable.sol"; | |
contract UrinalDotNetNft is ERC721Enumerable, Ownable { | |
using Strings for uint256; | |
string public baseURI; | |
string public baseExtension = ".json"; | |
uint256 public cost = 0.05 ether; | |
uint256 public presaleCost = 0.01 ether; | |
uint256 public maxSupply = 1000; | |
uint256 public maxMintAmount = 20; | |
bool public paused = false; | |
mapping(address => bool) public whitelisted; | |
mapping(address => bool) public presaleWallets; | |
constructor( | |
string memory _initBaseURI | |
) ERC721("Urinal Dot Net", "UDN") { | |
setBaseURI(_initBaseURI); | |
mint(msg.sender, 20); | |
} | |
// internal | |
function _baseURI() internal view virtual override returns (string memory) { | |
return baseURI; | |
} | |
// public | |
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) { | |
if (presaleWallets[msg.sender] != true) { | |
//general public | |
require(msg.value >= cost * _mintAmount); | |
} else { | |
//presale | |
require(msg.value >= presaleCost * _mintAmount); | |
} | |
} | |
} | |
for (uint256 i = 1; i <= _mintAmount; i++) { | |
_safeMint(_to, supply + i); | |
} | |
} | |
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 setPresaleCost(uint256 _newCost) public onlyOwner { | |
presaleCost = _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 addPresaleUser(address _user) public onlyOwner { | |
presaleWallets[_user] = true; | |
} | |
function add100PresaleUsers(address[100] memory _users) public onlyOwner { | |
for (uint256 i = 0; i < 2; i++) { | |
presaleWallets[_users[i]] = true; | |
} | |
} | |
function removePresaleUser(address _user) public onlyOwner { | |
presaleWallets[_user] = false; | |
} | |
function withdraw() public payable onlyOwner { | |
(bool success, ) = payable(msg.sender).call{ | |
value: address(this).balance | |
}(""); | |
require(success); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment