Openzeppelin
은 컨트랙트에서 사용할 수 있는 안전하고 검증받은 라이브러리를 제공한다. 예제에서는 NFT 표준인 ERC721
과 counter 기능을 제공하는 Counters
라이브러리를 사용했다.
다시 예제 코드로 돌아와서 하나씩 살펴보자.
우리가 import 해온 ERC721
라이브러리에는 토큰 URI를 기반으로 ERC721
토큰을 저장하는 extension인 ERC721URIStorage
가 있다. 우리가 만들 컨트랙트 뒤에 is
를 통해 간단히 상속할 수 있다.
우리가 만들 NFT에는 각각 고유 번호가 부여되는데, NFT가 만들어질 때 이러한 번호를 관리하기 위해 Counters
컨트랙트를 가져왔다. 해당 코드는 Counters.Counter
타입에 해당하는 것들에 Counters
컨트랙트를 적용시키겠다는 의미다. 이후 tokenIds
변수를 프라이빗으로 선언한다.
constructor
를 통해 만들고자 하는 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을 해줘서 숫자가 중복되지 않게 만든다.
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();
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],
},
},
};
아래 명령어로 디플로이해주면 디플로이 된 주소가 나오고 테스트로 한 민팅이 완료된다.
npx hardhat run scripts/deploy.js --network rinkeby
OpenSea 테스트넷에서 디플로이 주소를 입력하면 민팅된 NFT를 확인할 수 있다!