이들은 가장 공정한 NFT입니다

9776 단어
화이트리스트를 커뮤니티 이벤트 및 게임화와 결합하여 가장 공정하고 재미있는 방식으로 NFT를 시작할 수 있습니다. 이 비디오에서는 참가자에게 더 나은 경험을 제공하기 위해 NFT 계약의 화이트리스트 구현 및 기타 아이디어Vitalik proposed in his blog를 살펴봅니다.

https://youtu.be/x63Hal7xTCQ

시작하기 전에



이 자습서에서는 Metamask 또는 faucet에서 얻을 수 있는 Goerli 자금이 있는 다른 호환 지갑이 필요합니다.

스마트 계약




// 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");
    }
}


이 비디오를 시청해 주셔서 감사합니다!

블록체인 개발과 관련된 모든 것을 보려면 dev.to 및 in에서 우리를 팔로우하세요.

좋은 웹페이지 즐겨찾기