NFT whitelist (화이트리스트) 란

NFT를 구매(민팅) 할때 아무나 구매하지 못하도록
일종의 ‘구매자격’ 을 부여하는 시스템이다

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MintNFT is ERC721Enumerable, Ownable {

    constructor() ERC721("BlockChainSchool", "BCS") {}

    function mintNFT() public payable {
        require(whitelist[msg.sender] > 0, "Not whitelist."); // 화이트리스트에 최소 1개이상 허용되었는지 확인
        require(msg.value >= 0.1 ether, "Not Enough ETH.") // 0.1 eth 이상에 판매

        uint tokenId = totalSupply() + 1;

        _mint(msg.sender, tokenId);

        whitelist[msg.sender]--; // 화이트리스트 양 감소

        payable(owner()).transfer(msg.value); // owner 에게 eth 전송
    }

    // tokenId와 메타데이터 연결짓기
    function setTokenURI(uint _tokenId, string memory _metadataURI) public {
        metadataURIs[_tokenId] = _metadataURI;
    }

    // 메타데이터 조회
    mapping(uint => string) public metadataURIs;

    function tokenURI(uint _tokenId) public override view returns(string memory) {
        return metadataURIs[_tokenId];
    }
}

    // 화이트리스트
    mapping(address => uint) whitelist;

    function setWhitelist(address _whitelist, uint _amount) public onlyOwner {
        whitelist[_whitelist] = _amount;
        // 해당 주소가 몇개까지 민팅할수 있는지
    }
}

1. openzeppelin 라이브러리에서
ERC721 코드를 상속받아온 코드를 기반으로 작성한다


http://wavescats.github.io/solidity/2022/12/22/sol10.html
(👆 ERC721 코드 분석 참고)


2. setWhitelist 함수는 컨트랙트 배포자 (onlyOwner)만 실행 가능하다

  • mapping 으로 whitelist 를 생성해준다
  • NFT 구매를 허용해주려는 사람의 지갑주소와
  • 그 지갑주소로 몇개의 NFT를 구입할 수 있는지 정해준다

3. mintNFT 함수는 아무나 실행하지 못하도록 require 조건을 걸어준다

  1. whitelist 로 1개 이상 구매할 수 있도록 허용받았는지 확인
  2. 최소 구입가격 0.1 eth 가 있는지 확인

👆 이 두가지 조건을 통과 하면 NFT를 구입(민팅) 할 수 있다


4. 조건을 통과하고 NFT를 민팅하게 되면

  • whitelist 에서 허용된 수를 감소 시켜준다
  • 0.1 eth 로 판매된 금액은 owner 에게 바로전송된다

NFT whitelist 코드

NFT 화이트리스트 코드