본문 바로가기

CHALLENGER : BNB 체인 해커톤

5회차 대량이미지 NFT 발행하기

2022.11.27 - [CHALLENGER : BNB 체인 해커톤] - 5회차 해시립스 (hashlips) 사용해서 대량 이미지 만들기

 

5회차 해시립스 (hashlips) 사용해서 대량 이미지 만들기

# 오픈소스인 해시립스를 사용해서 대량 이미지 만들기 해시립스 깃허브 링크에서 코드를 다운받아준다. readme에 사용법이 자세하게 나와있다. 기본 이미지가 있어서 테스트 해볼 수 있다. https:/

rich-developer.tistory.com

 

# 이전 글에서 만든 이미지로 NFT 를 대량으로 발행해보기

 

1. pinata 에 사진 업로드

2. 메타데이터에 사진 링크 업데이트

3. NFT 발행 시 메타데이터 설정해주기  

-------------------------------------------------------

 

# 메타데이터에 사진 링크 업데이트

 

hashlips 코드에서 src/config.js 에 desctiption과 baseUri를 업데이트 해준다.

pinata에 업로드한 경로를 baseUri로 넣어준다. 이 때 맨 끝에 / 는 빼줘야 한다.

 

const description = "Under The Movie NFT, for all movie lovers";
const baseUri = "https://gateway.pinata.cloud/ipfs/...";

 

코드를 수정한 후 껐다 켜고, 아래 명령어로 업데이트 해준다.

 

npm run update:metadata
> nftchef-art-engine@2.2.0 update:metadata
> node utils/updateInfo.js

/Users/hyeonjeonghan/Projects/art-engine-main/src/config.js
Running with options { options: {} }

Updated baseUri for images to ===> https://gateway.pinata.cloud/ipfs/...

Updated Description for all to ===> Under The Movie NFT, for all movie lovers

 

그러면 아래와 같이 json 파일이 잘 업데이트 되어있다.

 

 

이렇게 업데이트 된 메타데이터 json 파일을 다시 pinata 에 올려서 스마트 컨트렉트에 반영해주어야 한다.

 

 

 

# 스마트 컨트랙트에서 메타데이터 설정해주기

 

지난 번 작업한 코드에 이어서 작성

 

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

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

contract MintNFT is ERC721Enumerable{
    uint constant public MAX_NFT = 100;
    string public metadataURI;

    constructor(string memory _metadataURI) ERC721("UTM", "underTheMovie"){
        metadataURI = _metadataURI;
    }

    function mintNFT() public {
        require(MAX_NFT > totalSupply(), string(abi.encodePacked('can\'t mint more than ', Strings.toString(MAX_NFT), '. current supply :', Strings.toString(totalSupply()))));
        uint tokenId = totalSupply() + 1; // tokenId starts from 1 -> images links should start from 1
        _mint(msg.sender, tokenId);
    }

    function burnNFT(uint _tokenId) public{
        require(msg.sender == ownerOf(_tokenId), "Fail to burn NFT. Requester is Not the Owner of NFT.");
        _burn(_tokenId);
    }

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

    function tokenURI(uint _tokenId) public override view returns(string memory){
        return string(abi.encodePacked(metadataURI, '/', Strings.toString(_tokenId), '.json'));
    }
}

 

실행 결과 

 

배포 시에 메타데이터 uri 를 넣어주어야 한다. (마지막 / 지워주기 : 코드에서 '/' 를 추가해줬기 때문에...)

 

 

그리고 20개 batchMint 20개를 실행해보았습니다.

tokenUri 함수를 실행시켜 metadata를 확인해서 이미지가 잘 들어가 있는 지 확인해볼 수 있다. 

 

발행한 NFT를 테스트넷에서 확인해 볼 수 있다.

 

 

직접 만든 NFT프로젝트

반응형