[Ethereum] NFT 민팅 컨트랙트 짜기

0xDave·2022년 8월 30일
0

Ethereum

목록 보기
7/112
post-thumbnail

🔥 예제 코드



📚 Openzeppelin


Openzeppelin 은 컨트랙트에서 사용할 수 있는 안전하고 검증받은 라이브러리를 제공한다. 예제에서는 NFT 표준인 ERC721과 counter 기능을 제공하는 Counters 라이브러리를 사용했다.


🧑‍💻 Line by line


다시 예제 코드로 돌아와서 하나씩 살펴보자.

1. 상속

우리가 import 해온 ERC721 라이브러리에는 토큰 URI를 기반으로 ERC721 토큰을 저장하는 extension인 ERC721URIStorage가 있다. 우리가 만들 컨트랙트 뒤에 is를 통해 간단히 상속할 수 있다.

우리가 만들 NFT에는 각각 고유 번호가 부여되는데, NFT가 만들어질 때 이러한 번호를 관리하기 위해 Counters 컨트랙트를 가져왔다. 해당 코드는 Counters.Counter 타입에 해당하는 것들에 Counters 컨트랙트를 적용시키겠다는 의미다. 이후 tokenIds 변수를 프라이빗으로 선언한다.


2. NFT 이름과 심볼


constructor를 통해 만들고자 하는 NFT의 이름과 심볼을 설정해준다.


3. NFT 생성

위에서 선언한 _tokenIds의 현재 번호를 확인 후 newItemId에 할당한다. 현재 번호는 Counters 컨트랙트의 current()를 통해 확인할 수 있다.

NFT 민팅은 _safeMint() 함수로 간단하게 구현할 수 있다. 민팅하고자 하는 지갑의 주소와 tokenId만 인자로 넣어주면 된다.

_setTokenURI() 를 통해 NFT의 데이터를 설정할 수 있다. 예제에서는 간단히 blah라고만 했지만 TokenURI에는 NFT의 실제 데이터(메타데이터 - JSON 파일 형태)로 연결되는 JSON URL이 들어간다. 메타데이터는 보통 다음과 같이 이름과 이미지 등이 포함된다. 실제 NFT를 민팅할 때는 JSON Keeper 사이트에서 메타데이터를 입력해 고유한 JSON URL을 만들고 blah 부분을 JSON URL로 바꿔줘야 한다.

이후 increment() 함수로 _tokenIds에 +1을 해줘서 숫자가 중복되지 않게 만든다.


⛓ 디플로이 하기


1. deploy.js

scripts 폴더에 deploy.js 파일을 만든다.

const main = async () => {
  const nftContractFactory = await hre.ethers.getContractFactory('MyEpicNFT');
  const nftContract = await nftContractFactory.deploy();
  await nftContract.deployed();
  console.log("Contract deployed to:", nftContract.address);

  // Call the function.
  let txn = await nftContract.makeAnEpicNFT()
  // Wait for it to be mined.
  await txn.wait()
  console.log("Minted NFT #1")

  txn = await nftContract.makeAnEpicNFT()
  // Wait for it to be mined.
  await txn.wait()
  console.log("Minted NFT #2")
};

const runMain = async () => {
  try {
    await main();
    process.exit(0);
  } catch (error) {
    console.log(error);
    process.exit(1);
  }
};

runMain();

2. hardhat.config.js 파일 수정

hardhat.config.js에서 네트워크를 rinkeby로 설정해주고, env 파일에서 quicknode api와 메타마스크의 프라이빗 키를 적어준다.

require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config({ path: ".env" });


/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
  solidity: "0.8.1",
  networks: {
    rinkeby: {
      url: process.env.QUICKNODE_API_KEY_URL,
      accounts: [process.env.RINKEBY_PRIVATE_KEY],
    },
  },
};

3. 명령어 실행

아래 명령어로 디플로이해주면 디플로이 된 주소가 나오고 테스트로 한 민팅이 완료된다.

npx hardhat run scripts/deploy.js --network rinkeby


🛥 OpenSea에서 확인하기


OpenSea 테스트넷에서 디플로이 주소를 입력하면 민팅된 NFT를 확인할 수 있다!

profile
Just BUIDL :)

0개의 댓글