[Solidity] NFT metadata Reveal (랜덤박스 뽑기 만들기)
Reveal / 뽑기 / 리빌 / RandomBox
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 로 변환되어 있다