Local 환경에서 ERC-721 개발하는 과정을 살펴보겠습니다.
전체 코드는 다음과 같습니다.
//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() ERC721("MyNFTs", "MNFT") {}
function mintNFT(string memory tokenURI)
public onlyOwner
returns (uint256)
{
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(msg.sender, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
}
const Migrations = artifacts.require('Migrations');
const MyNFTs = artifacts.require('MyNFTs.sol'); // MyNFTs.sol 파일 추가
module.exports = function (deployer) {
deployer.deploy(Migrations);
deployer.deploy(MyNFTs); // MyNFTs를 배포에 추가
};
truffle-config.js 작성하는 과정을 살펴보겠습니다.
MNEMONIC 와 INFURA_ID를 사용하기 위해서 .env 파일을 작성합니다. .gitignore에 .env 파일을 추가합니다.
ropsten: {
provider: () =>
new HDWalletProvider(
process.env.MNEMONIC,
`https://ropsten.infura.io/v3/${process.env.INFURA_ID}`
),
network_id: 3, // ropsten's id
gas: 4000000,
confirmations: 2,
timeoutBlocks: 200,
skipDryRun: true,
}
truffle migrate --compile-all --network ropsten
transaction hash를 복사하여, 이더스캔에서 확인해봅시다.
명령어 npm install truffle-flattener를 입력하고, 명령어 npx truffle-flattener ./contracts/MyNFTs.sol > ./contracts/FlatMyNFTs.sol 를 입력하면 파일을 하나로 묶어주는 과정이 진행됩니다. 이렇게 생성된 FlatMyNFTs.sol 파일을 이용해서 verify and publish를 진행할 수 있습니다. 성공한 결과는 다음 이미지와 같습니다.
require("dotenv").config();
const HDWalletProvider = require("@truffle/hdwallet-provider");
module.exports = {
networks: {
development: {
host: "127.0.0.1", // Localhost (default: none)
port: 8545, // Standard Ethereum port (default: none)
network_id: "*", // Any network (default: none)
},
ropsten: {
provider: () =>
new HDWalletProvider(
process.env.MNEMONIC,
`https://ropsten.infura.io/v3/${process.env.INFURA_ID}`
),
network_id: 3, // ropsten's id
gas: 4000000,
confirmations: 2,
timeoutBlocks: 200,
skipDryRun: true,
},
},
// Configure your compilers
compilers: {
solc: {
version: "0.8.7", // Fetch exact version from solc-bin (default: truffle's version)
settings: {
evmVersion: "london",
},
},
},
};
전체 코드는 다음 링크에서 확인할 수 있습니다.
https://github.com/vamprodo47/erc721-truffle