Podemos lanzar NFTs de maneras más justas y divertidas combinando whitelists con eventos de comunidad y gamification. En este video exploramos una implementación de whitelist en un contrato de NFTs y también otras ideas que Vitalik ha planteado en su blog para ofrecer una mejor experiencia a los participantes.
Antes de comenzar
Para este tutorial ocuparás Metamask u otra wallet compatible con fondos en Goerli que puedes obtener desde un faucet.
El Smart Contract
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
contract MyWhitelistNFT is ERC721Enumerable, Ownable {
uint256 public price = 0.01 ether;
uint256 public constant MAX_SUPPLY = 10000;
string public baseTokenURI = "https://baseurl.com/";
bool public saleActive = false;
mapping (address => uint256) public whitelistReserved;
constructor () ERC721 ("My MNFT", "MNFT") {
}
// Overide functions
function _baseURI() internal view virtual override returns (string memory) {
return baseTokenURI;
}
// Public functions
function mintToken(uint256 _amount) public payable {
uint256 supply = totalSupply();
require( supply + _amount <= MAX_SUPPLY, "Can't mint more than max supply" );
require( msg.value == price * _amount, "Wrong amount of ETH sent" );
if(!saleActive)
{
uint256 reservedAmt = whitelistReserved[msg.sender];
require(reservedAmt > 0 && _amount <= reservedAmt, "Sale isn't active and you are not whitelisted" );
whitelistReserved[msg.sender] = reservedAmt - _amount;
}
for(uint256 i; i < _amount; i++){
_safeMint( msg.sender, supply + i );
}
}
// Admin functions
function editWhitelistReserved(address[] memory _a, uint256[] memory _amount) public onlyOwner {
for(uint256 i; i < _a.length; i++){
whitelistReserved[_a[i]] = _amount[i];
}
}
function setSaleActive(bool val) public onlyOwner {
saleActive = val;
}
function setBaseURI(string memory baseURI) public onlyOwner {
baseTokenURI = baseURI;
}
function withdraw() public payable onlyOwner {
(bool sent, bytes memory data) = owner().call{value: address(this).balance}("");
data;
require(sent, "Failed to send Ether");
}
}
Gracias por ver este video!
Sígannos en dev.to y en Youtube para todo lo relacionado al desarrollo en Blockchain en Español.