Mint Ethereum NFTs by Hardhat in 10mins

利用 Hardhat 快速鑄造並部署 ERC721 合約到 Rinkeby Network。

1. Create New Hardhat Project

首先我們用 hardhat 開啟一個新專案
跳出詢問時選擇 Create a basic sample project
後續選項直接 Enter 全部選擇預設即可

npm init -y
npm install --save-dev hardhat
npx hardhat
hardhat-basic-project
npx hardhat run scripts/sample-script.js
hardhat-sample-script

2. Install Contract Relative Packages

接著安裝 Hardhat 以及它支援的以太鏈合約相關套件 hardhat-waffle、hardhat-ethers
當然也少不了要裝目前最完整以及最被廣泛使用的合約底層庫 openzeppelin

npm install --save-dev @nomiclabs/hardhat-waffle ethereum-waffle chai 
npm install --save-dev @nomiclabs/hardhat-ethers ethers
npm install @openzeppelin/contracts

npx hardhat run scripts/sample-script.js

3. Upload NFT Image to IPFS

IPFS (InterPlanetary File System) 是區塊鏈上去中心化的檔案系統,目前已有很多平台可供使用
這邊使用的是 Pinata,註冊後即可上傳檔案
除了要上傳圖檔之外,還需要上傳一個用來描述 NFT 的 metadata json 檔
筆者拿目前最火紅的 Anya Forger 無聊猿版上傳來做測試

{
    "name": "Anya Forger Bored APE",
    "description": "This is a Anya Forger bored ape NFT.",
    "image": "ipfs://QmTxnDRGbDZGjHUfgihdj8touu46qyPj2QoArQA9NDhnmB"
}
pitana-upload

4. Basic NFT Mint Contract

NFT 合約部分我們在 contracts 資料夾下新增一個 CoolNFT.sol 的檔案
直接繼承 openzeppelin 下的 ERC721 合約
並利用它提供的 Counters 計數器來計算 NFT 目前要 Mint 的流水號
TokenURI 則要帶入剛剛我們在 Pitana 創造的 NFT Json metadata IPFS 網址

pragma solidity ^0.8.1;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "hardhat/console.sol";

contract CoolNFT is ERC721URIStorage {
  using Counters for Counters.Counter;
  Counters.Counter private _tokenIds;

  constructor() ERC721 ("CoolNFT", "COOL") {
    console.log("This is cool NFT contract.");
  }

  function mint() public {
    uint256 newItemId = _tokenIds.current();
    _safeMint(msg.sender, newItemId);
    _setTokenURI(newItemId, "ipfs://Qmd5pJmeDL1JUoVaEuPyNNVKUVfKeXbw2R83mxbxjBMtz1");
    _tokenIds.increment();
  }
}

5. Deploy Contract

Deploy 時就可以體驗到 Hardhat 的簡潔與便利性
利用 hre(Hardhat Runtime Environment),可以快速使用剛剛安裝套件的功能
透過 ContractFactory 我們幾乎可以一行就完成合約的 Deploy

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

    let txn = await nftContract.mint();
    await txn.wait();

    console.log("Minted Cool NFT #1");
};
  
const main = async () => {
    try {
        await deployAndMint();
        process.exit(0);
    } catch (error) {
        console.log(error);
        process.exit(1);
    }
};
  
main();

6. Deploy to Rinkeby Network

這部分要先裝一下 dotenv 這個專門用來處理敏感資訊的套件
設定方式類似環境變數,在 local 端會有個 .env 的檔案
這個檔案預設會加入到 .gitignore 裡,否則一上傳你的私鑰就公開了

npm install dotenv

在 .env 裡我們需要設定兩個東西,一個是 Alchemy 的 URL,一個是你錢包的私鑰
Alchemy 的部分去官網註冊帳號後,開一個 Rinkeby 的 App (名稱隨意) 就會有了
私鑰的部分就開一個新的 MetaMask 開發用 Account,選設定下的帳戶詳情 => 導出私鑰即可

ALCHEMY_API_KEY_URL=<YOUR API URL>
RINKEBY_PRIVATE_KEY=<YOUR PRIVATE KEY>
create-alchemy-app

最後我們回到專案下打開 hardhat.config.js
把 dotenv 導入並把剛剛兩個變數分別新增到 rinkeby network 下

require('@nomiclabs/hardhat-waffle');
require("dotenv").config({ path: ".env" });

module.exports = {
  solidity: '0.8.1',
  networks: {
    rinkeby: {
      url: process.env.ALCHEMY_API_KEY_URL,
      accounts: [process.env.RINKEBY_PRIVATE_KEY],
    },
  },
};

將合約部署到 Rinkeby Network

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

7. View Your NFT on Opensea Testnet

透過以下兩個網址來檢查剛 mint 出來的 NFT
把合約地址貼上去搜尋,或是直接連接開發使用的錢包帳戶即可
https://testnets.opensea.io/
https://rinkeby.rarible.com/

anya-forger-bored-ape

看到你的 NFT 圖片了嗎?
恭喜你!我們成功利用 Hardhat 完成 Mint 和 Deploy NFT Contract 這項任務啦!
若有任何問題歡迎留言討論!

Github 連結:
https://github.com/scissor/Mint-NFT-Hardhat-Sample

發佈留言