본문 바로가기
블록체인/블록체인

[BNB Challengers 7일차] NFT 프로젝트의 발전!! - whitelist 등록 및 수수료 받기!

by 일등박사 2022. 11. 24.
728x90

안녕하세요!^^
오늘은 BNB Challengers 강의 7일차, 실습가 계속되고있습니다!
NFT의 또다른 모습에 대하여 공부해 보는 시간이었습니다!


ERC-1155란 무엇일까!?! : Multi Token

여러개의 NFT를 발급할 수 있다!!

https://eips.ethereum.org/EIPS/eip-1155

 

EIP-1155: Multi Token Standard

 

eips.ethereum.org

  Fungible Token
(BEP-20, ERC-20)
Multi Token
(ERC-1155)
Non Fungible Token
(BEP-721, ERC-721)
쪼갤 수 있는가?
(dividable)
O X X
여러개 존재 하는가? O O X
주 사용처 가상화폐 게임 인터페이스 디지털 컨텐츠

아디다스의 NFT를 보면 소유자가 엄청 많아요!!

 

 

화이트리스트!! : 고객관리!?ㅎㅎ

화이트리스트는

 - NFT를 구매할수

 - NFT를 저렴하개 구매할수

 - NFT를 미리 구매할수 

등등의 특권이 있다!!

 

지난수업의 코드에 이어 아래 3가지를 추가해줍니다!!


1. 지갑주소를 받으면 uint 값(구매할수 있는 개수) 을 매핑해준다

2. Owner만 whitelist에 구매할수 있는 개수를 입력 받는다!

3. mint 할때 whitelist인지 확인하고, 맞다면 whitelist 개수를 줄여준다

 

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

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

contract MintNFT is ERC721Enumerable, Ownable {
    uint constant public TOTAL_NFT = 100;
    string public metadataURI;
    string public notRevealedURI;
    bool public isRevealed;
    mapping (address => uint ) whitelist;  // white list를 위한 추가부분 1

    constructor(string memory _metadataURI, string memory _notRevealedURI) ERC721("BNB,Challenger", "BC") {
        metadataURI = _metadataURI;
        notRevealedURI = _notRevealedURI;
    }

    function mintNFT() public  {
        require(TOTAL_NFT > totalSupply(), "No more mint.");
        require(whitelist[msg.sender] > 0 , "Not white List");  // white list를 위한 추가부분 3
        uint tokenId = totalSupply() + 1;

        _mint(msg.sender, tokenId);

        whitelist(msg.sender)--;                                // white list를 위한 추가부분 3
    }

    function batchMintNFT(uint _amount) public {
        for(uint i = 0; i < _amount; i++) {
            mintNFT();
        }
    }

    function tokenURI(uint _tokenId) public override view returns (string memory) {
        if(isRevealed == false) return notRevealedURI;

        return string(abi.encodePacked(metadataURI, '/', Strings.toString(_tokenId), '.json'));
    }

    function reveal() public onlyOwner {
        isRevealed = true;
    }


    function setWhitelist(address _whitelist, uint _amount) public onlyOwner {    // white list를 위한 추가부분 2
        whitelist[_whitelist] = _amount ;                                         // white list를 위한 추가부분 2
        }                                                                         // white list를 위한 추가부분 2
}

배포해보면, 주인도 mintNFT 못하는것을 알수 있다

(화이트 리스트에 안되어있기때문에!!)

그래서!! 내 지갑주소를 화이트리스트에 등록해보쟈!!

 

이제는 아까와 달리 민팅이 됩니다!!^^

Payable : 수익 창출!!

지금까지 우리는 무료로, 가스비만 지급하면 민팅이 가능했다!!

하지만!! 민팅할 경우 민팅참여자가 가스비 + 수수료를 낸다면,

그 수수료를 우리가 받는다면 좋겠지요~!?

 

솔리디티 코드로 알아봅시다!

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

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

contract MintNFT is ERC721Enumerable, Ownable {
    uint constant public TOTAL_NFT = 100;
    string public metadataURI;
    string public notRevealedURI;
    bool public isRevealed;
    mapping (address => uint ) whitelist;  

    constructor(string memory _metadataURI, string memory _notRevealedURI) ERC721("BNB,Challenger", "BC") {
        metadataURI = _metadataURI;
        notRevealedURI = _notRevealedURI;
    }

    function mintNFT() public  payable {                                        // payable 추가부분@@@@ 1 
        require(TOTAL_NFT > totalSupply(), "No more mint.");
        require(whitelist[msg.sender] > 0 , "Not white List"); 
        require(msg.value >=0.1 ether, "Not Enough BNB");                        // payable 추가부분@@@@ 2

         
        uint tokenId = totalSupply() + 1;

        _mint(msg.sender, tokenId);
        
        whitelist[msg.sender]--;       
        payable(owner()).transfer(msg.value);                                    // payable 추가부분@@@@ 3
        // payable(판매자).transfer(msg.value);                                    // payable 추가부분@@@@ 4
    }
    

    function batchMintNFT(uint _amount) public {
        for(uint i = 0; i < _amount; i++) {
            mintNFT();
        }
    }

    function tokenURI(uint _tokenId) public override view returns (string memory) {
        if(isRevealed == false) return notRevealedURI;

        return string(abi.encodePacked(metadataURI, '/', Strings.toString(_tokenId), '.json'));
    }

    function reveal() public onlyOwner {
        isRevealed = true;
    }


    function setWhitelist(address _whitelist, uint _amount) public onlyOwner {    
        whitelist[_whitelist] = _amount ;                                         
        }                                                                        
}

 

1. 이함수는 지불하는 함수다 (Payable)

2. 보내는 수수료가 0.1 이더 가 안되면 mintNFT가 안된다!!  

3. 보내는 돈을 내 지갑에 넣는다!! 인 마이 포켓!ㅎㅎ

4. 여기까지 주석을 활성화 한다면 판매자에게도 금액을 준다!! like Opensea

 

whitelist에 추가된 다른 지갑으로 value 입력 후 mintNFT하면!!! 된다!!!

 

 

감사합니다!%^^

728x90

댓글