DEV Community

Cover image for Ceux-ci sont les NFTs les plus Justes
Ahmed Castro
Ahmed Castro

Posted on

Ceux-ci sont les NFTs les plus Justes

On peut combiner des whitelistes, avec des événements communautaires et gamification pour lancer des NFTs. Dans cette vidéo on va explorer une implémentation d'un contrat d'NFTs et d'autres idées de Vitalik pour une meilleure expérience pour les participants.

https://youtu.be/rygoKOO8lao

Avant de commencer

Pour ce video tu auras besoin de Metamask ou n'importe quel wallet compatible avec l'EVM et aussi du GoerliETH que tu peux trouver gratuitement en un faucet.

Le Contrat Intéligent

// 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");
    }
}
Enter fullscreen mode Exit fullscreen mode

¡Merci pour voir ce video!

Suivez nous ici en dev.to et en Youtube pour tout ce qui a à voir avec Blockchain en Francais.

Top comments (0)