[Solidity] NFT Minting whitelist (화이트리스트)
민팅 / whitelist / 화이트리스트
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 조건을 걸어준다
- whitelist 로 1개 이상 구매할 수 있도록 허용받았는지 확인
- 최소 구입가격 0.1 eth 가 있는지 확인
👆 이 두가지 조건을 통과 하면 NFT를 구입(민팅) 할 수 있다
4. 조건을 통과하고 NFT를 민팅하게 되면
- whitelist 에서 허용된 수를 감소 시켜준다
- 0.1 eth 로 판매된 금액은 owner 에게 바로전송된다