// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract MyNFTs is ERC721 {
constructor() public ERC721("MyNFT", "NFT") {}
}
그러나, OpenZeppelin에서 제공하는 ERC-721 라이브러리에는 표준 함수9가지만 구현되어 있다. 실제로 우리가 작성한 ERC-721 컨트랙트를 통해 NFT를 민팅하기 위해서는 컨트랙트에 새로운 함수를 추가해야 한다.
새로운 NFT 발행을 위해 다음의 코드를 수정한다.
//Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
contract MyNFTs is ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() public ERC721("MyNFT", "NFT") {}
function mintNFT(address recipient, string memory tokenURI)
public onlyOwner
returns (uint256)
{
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(recipient, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
}
위의 코드에서는 NFT를 민팅하는 함수 mintNFT()
가 추가되었다. 그리고, 우리가 마든 ERC-721 컨트랙트가 ERC721URIStorage
와 Ownable
컨트랙트를 상속받고 있다.
tokenURI
를 관리하는 컨트랙트이다.tokenURI
는 이미지 주소 등 NFT의 특성을 저장하는 JSON 객체이다mintNFT()
함수에서는 ERC721URIStorage
컨트랙트를 사용해 tokenURI
를 관리한다.Ownable
컨트랙트의 onlyOwner
라는 modifier를 사용하여, 함수를 실행가지 전, 함수를 호출한 계정이 컨트랙트 소유자의 계정인지 확인한다.mintNFT()
함수에서도 함수 실행 전 onlyOwner
modifier를 통해 함수를 호출한 계정이 컨트랙트 소유자 계정인지 확인한다. 이를 통해 mintNFT()
함수를 컨트랙트 소유자만 실행할 수 있도록 한다.이제 컨트랙트의 컴파일을 진행한다.
마찬가지로, 배포를 완료 한 후 NFT를 발행할 수 있다.
이제는 mintNFT 트랜잭션 생성 함수가 포함된 걸 확인할 수 있다.
pinata 에서 NFT 이미지를 생성한다.
NFT 이미지를 등록한다.
{
"attributes" : [ {
"trait_type" : "Breed",
"value" : "puppy"
}, {
"trait_type" : "Color",
"value" : "Mocha"
} ],
"description" : "puppy designed by bcdy",
"image" : "ipfs://NFT CID 주소,
"name" : "Pachu"
}