NFT Reveal (리빌) 이란

NFT를 랜덤박스형태 처럼 만들어서 판매하는
일종의 뽑기 시스템이다

처음에는 랜덤박스같은 metadata가 저장된 NFT를
나중에 가치가 있는 metadata로 reveal 시켜준다

// 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 {

    string public yetRevealedURI; // 리빌되기 전 URI 주소
    string public metadataURI; // 리빌된 후 URI 주소

    bool public isRevealed; // true false 로 메타데이터 바꿔주기

    constructor(string memory _metadataURI, string memory _yetRevealedURI) ERC721("BlockChainSchool", "BCS") {
        metadataURI = _metadataURI;
        yetRevealedURI = _yetRevealedURI;
    }

    function mintNFT() public onlyOwner {
        uint tokenId = totalSupply() + 1;

        _mint(msg.sender, tokenId);
    }

    // tokenId와 메타데이터 연결짓기
    mapping(uint => string) public metadataURIs;

    function setTokenURI(uint _tokenId, string memory _metadataURI) public {
        metadataURIs[_tokenId] = _metadataURI;
    }

    // 메타데이터 조회
    function tokenURI(uint _tokenId) public override view returns(string memory) {
        if(isRevealed == false) return yetRevealedURI;

        return metadataURI;
    }

    // 메타데이터 리빌
    function reveal() public onlyOwner {
        isRevealed = true;
    }
}

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


2. string 타입으로 public 변수를 생성해준다
한개는 가치가 있는 metadataURI 가 담기는 변수이고
한개는 랜덤박스 이미지를 보여주는 metadataURI 가 담기는 변수이다


👆 민팅된 랜덤박스 NFT (OpenSea Testnet)


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


3. 메타데이터를 조회하는 tokenURI 함수에서 조건문을 하나 추가해준다

  • isRevealed 이라는 변수를 bool 타입으로 생성한 후
  • default 값인 false 일 경우에는 랜덤박스 이미지를 보여준다

4. reveal 함수를 실행시키면

  • isRevealed 변수는 true로 바뀌게 되면서
  • 랜덤박스 이미지에서 👉 가치가 있는 metadata 로 변환된다

5. 다시 tokenURI 함수로 메타데이터를 조회해보면
reveal 되어있는 metadataURI 가 조회되는걸 확인 할 수 있다


👆 reveal 함수를 실행 시킨 후 openSea 에서 확인해보면
랜덤박스에서 👉 Bcycle NFT 로 변환되어 있다


ERC721 NFT Reveal 코드

NFT 리빌 코드