// SPDX-License-Identifier: MITpragmasolidity ^0.8.9 <0.9.0;import"./library/ERC721F.sol";
import"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/utils/math/SafeMath.sol";
/**
* @title Dented Feels contract
* @dev Extends ERC721F Non-Fungible Token Standard basic implementation.
* Optimized to no longer use ERC721Enumerable , but still provide a totalSupply() and walletOfOwner(address _owner) implementation.
* @author @FrankPoncelet
*
*/contractDentedFeelsisERC721F{
usingSafeMathforuint256;
uint256public tokenPrice =0.11ether;
uint256publicconstant MAX_TOKENS=11111;
uintpublicconstant MAX_RESERVE =26; // set 1 to high to avoid some gasboolpublic saleIsActive;
boolpublic preSaleIsActive;
addressprivateconstant ONE =0xE3cE6966c6dCdfB49055d8d0c6D46C09CDbd13f7;
addressprivateconstant TWO =0x12d7F4C942C8264BD1f0D3c3B2313EF794030222;
addressprivateconstant TREE =0xd7d9B479106EF63DF5e46C1D9cAA5db4078E2Ac3;
addressprivateconstant FOUR =0x7356646D4bAC2Ee3c92700f213851fd7Ae9b3533;
addressprivateconstant FIVE =0x74F3647c2b76BD5257D7c1dF25b1759e8fAc7442;
addressprivateconstant SIX =0x7297E66567526781Ca42B818bff80bb747876955;
addressprivateconstant SEVEN =0xB57dF54d276B3555b2F99ab5C1266cBe4e931b1e;
addressprivateconstant FRANK =0xF40Fd88ac59A206D009A07F8c09828a01e2ACC0d;
addressprivateconstant SIMON =0x743CA37E0b8bAFb4Ca2D49382f820410d6e6E431;
mapping(address=>bool) private whitelist;
eventpriceChange(address _by, uint256 price);
constructor() ERC721F("Dented Feels", "DEN") {
setBaseTokenURI("https://ipfs.io/ipfs/QmPtiJaMKgRyYr5Y5EypBSQn4MvaDY3ZmGN9azDkiHF7cd/");
_safeMint( FRANK, 0);
}
/**
* Mint Tokens to a wallet.
*/functionmint(address to,uint numberOfTokens) publiconlyOwner{
uint supply = totalSupply();
require(supply.add(numberOfTokens) <= MAX_TOKENS, "Reserve would exceed max supply of Tokens");
require(numberOfTokens < MAX_RESERVE, "Can only mint 25 tokens at a time");
for (uint i =0; i < numberOfTokens; i++) {
_safeMint(to, supply + i);
}
}
/**
* Mint Tokens to the owners reserve.
*/functionreserveTokens() externalonlyOwner{
mint(owner(),MAX_RESERVE-1);
}
/**
* Pause sale if active, make active if paused
*/functionflipSaleState() externalonlyOwner{
saleIsActive =!saleIsActive;
if(saleIsActive){
preSaleIsActive=false;
}
}
/**
* Pause sale if active, make active if paused
*/functionflipPreSaleState() externalonlyOwner{
preSaleIsActive =!preSaleIsActive;
}
/**
* Set price
*/functionsetPrice(uint256 price) externalonlyOwner{
tokenPrice = price;
emit priceChange(msg.sender, tokenPrice);
}
/**
* add an address to the WL
*/functionaddWL(address _address) publiconlyOwner{
whitelist[_address] =true;
}
/**
* add an array of address to the WL
*/functionaddAdresses(address[] memory _address) externalonlyOwner{
for (uint i=0; i<_address.length; i++) {
addWL(_address[i]);
}
}
/**
* remove an address off the WL
*/functionremoveWL(address _address) externalonlyOwner{
whitelist[_address] =false;
}
/**
* returns true if the wallet is Whitelisted.
*/functionisWhitelisted(address _address) publicviewreturns(bool) {
return whitelist[_address];
}
functionmint(uint256 numberOfTokens) externalpayable{
if(preSaleIsActive){
require(isWhitelisted(msg.sender),"sender is NOT Whitelisted ");
}else{
require(saleIsActive,"Sale NOT active yet");
}
require(balanceOf(msg.sender)+numberOfTokens<3,"Purchase would exceed max mint for walet");
uint256 supply = totalSupply();
require(supply.add(numberOfTokens) <= MAX_TOKENS, "Purchase would exceed max supply of Tokens");
require(tokenPrice.mul(numberOfTokens) <=msg.value, "Ether value sent is not correct");
for(uint256 i; i < numberOfTokens; i++){
_safeMint( msg.sender, supply + i );
}
}
functionwithdraw() publiconlyOwner{
uint256 balance =address(this).balance;
require(balance >0, "Insufficent balance");
_withdraw(ONE, (balance*30)/100);
_withdraw(TWO, (balance*25)/100);
_withdraw(TREE, (balance*20)/100);
_withdraw(FOUR, (balance*9)/100);
_withdraw(FIVE, (balance)/100);
_withdraw(SIX, (balance*5)/100);
_withdraw(SEVEN, (balance*5)/100);
_withdraw(FRANK, (balance)/100);
_withdraw(SIMON, (balance*4)/100);
}
function_withdraw(address _address, uint256 _amount) private{
(bool success, ) = _address.call{ value: _amount }("");
require(success, "Failed to widthdraw Ether");
}
// contract can recieve Etherfallback() externalpayable{ }
receive() externalpayable{ }
}
Contract Source Code
File 5 of 15: ERC165.sol
Contract Source Code
File 6 of 15: ERC721.sol
Contract Source Code
File 7 of 15: ERC721F.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.9 <0.9.0;import"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/token/ERC721/ERC721.sol";
import"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/access/Ownable.sol";
import"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/utils/Counters.sol";
/**
* @title ERC721B
* @dev Extends ERC721 Non-Fungible Token Standard basic implementation.
* Optimized to no longer use ERC721Enumerable , but still provide a totalSupply() and walletOfOwner(address _owner) implementation.
* @author @FrankPoncelet
*
*/contractERC721FisOwnable, ERC721{
usingCountersforCounters.Counter;
Counters.Counter private _tokenSupply;
// Base URI for Meta datastringprivate _baseTokenURI;
constructor(stringmemory name_, stringmemory symbol_) ERC721(name_, symbol_) {
}
/**
* @dev walletofOwner
* @return tokens id owned by the given address
* This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
* It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
*/functionwalletOfOwner(address _owner) externalviewreturns (uint256[] memory){
uint256 ownerTokenCount = balanceOf(_owner);
uint256[] memory ownedTokenIds =newuint256[](ownerTokenCount);
uint256 currentTokenId =1;
uint256 ownedTokenIndex =0;
while ( ownedTokenIndex < ownerTokenCount && currentTokenId < _tokenSupply.current() ) {
if (ownerOf(currentTokenId) == _owner) {
ownedTokenIds[ownedTokenIndex] = currentTokenId;
ownedTokenIndex++;
}
currentTokenId++;
}
return ownedTokenIds;
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/function_baseURI() internalviewvirtualoverridereturns (stringmemory) {
return _baseTokenURI;
}
/**
* @dev Set the base token URI
*/functionsetBaseTokenURI(stringmemory baseURI) publiconlyOwner{
_baseTokenURI = baseURI;
}
/**
*
* @dev Mints `tokenId` and transfers it to `to`.
*
*/function_mint(address to, uint256 tokenId) internalvirtualoverride{
super._mint(to, tokenId);
_tokenSupply.increment();
}
/**
* @dev Gets the total amount of tokens stored by the contract.
* @return uint256 representing the total amount of tokens
*/functiontotalSupply() publicviewreturns (uint256) {
return _tokenSupply.current();
}
}