Alchemyのサイトを参考に、Node.jsでNFTをミントしてみました。
https://docs.alchemy.com/docs/how-to-mint-an-nft-from-code
私の環境
- Node.js: v20.0.0
- テストネットワーク:Goerli
- 開発環境: VS Code
※2024年に入りGoerli が使えなくなりました。
テストネットSepoliaについてはこちらをご確認ください。
https://www.alchemy.com/overviews/migrate-to-sepolia
準備
画像
画像を簡単にIPFSにできるPinataを使う。
Pinataはアカウントなくても(ログインしなくても)使える。
「Start Building」をクリック
アップロードしたファイルは、以下のサイトで見ることができる。
https://gateway.pinata.cloud/ipfs/<ハッシュ値>
NFTのメタデータ作成
OpenSea の標準を参考に
メタデータのJSONファイルを作成する。
OpenSea の標準はこちら参照
https://docs.opensea.io/docs/metadata-standards
{
"description": " ",
"external_url": "",
"image": "https://gateway.pinata.cloud/ipfs/<ハッシュ値>",
"name": "Cats",
"attributes": [ ... ]
}
このJSONファイルを再度Pinataにアップロードする。
アップロード後、JSONファイルのハッシュ値をコピーしてどこかに控える。
以下が、のちほどのコードの変数tokenUriの値になる
https://gateway.pinata.cloud/ipfs/<メタデータJSONファイルのハッシュ値>
Remixでスマートコントラクト作成
こちらを参考
https://qiita.com/tatsuya1970/items/2381d21399a19f349e57
作成したコントラクトのABIをコピーしてどこかに控えておく。
Alchemy API キーの作成
Alchemy にアクセスする。
https://www.alchemy.com/
「Apps」 > 「Create App」
チェーンとネットワークを選び、
アプリ名前を記入し
「Create app」をクリックする。
API Key と HTTPSをどこかに控えておく。
環境変数の設定
ルートディレクトリで
Ethereumブロックチェーンのライブラリ ethers.js と
環境変数設定のライブラリ dotenv をインストールする。
$ npm install --save ethers
$ npm install --save dotenv
ルートディレクトリに .envファイルを作成し、
環境変数を設定する。
API_URL = "AlchemyのHTTP"
API_KEY = "AlchemyのAPIキー"
PRIVATE_KEY = "自分のMetamaskの秘密鍵"
同じくルートディレクトリに先ほどRemixで作成したNFTのコントラクトのABIをコピーして「abi.json」 というファイルを作る。
スクリプトの作成
'use strict';
require('dotenv').config();
const { ethers } = require("ethers");
// Get Alchemy API Key
const API_KEY = process.env.API_KEY;
const provider = new ethers.AlchemyProvider('goerli', API_KEY)
const privateKey = process.env.PRIVATE_KEY
const signer = new ethers.Wallet(privateKey, provider)
const abi = require("./abi.json")
const contractAddress = 'さきほどRemixで作成したNFTのコントラクトアドレス'
// Create a contract instance
const myNftContract = new ethers.Contract(contractAddress, abi, signer)
const tokenUri = "https://gateway.pinata.cloud/ipfs/<メタデータJSONファイルのハッシュ値>"
// Call mintNFT function
const mintNFT = async () => {
let nftTxn = await myNftContract.safeMint(signer.address, tokenUri)
await nftTxn.wait()
console.log(`NFT Minted! Check it out at: https://goerli.etherscan.io/tx/${nftTxn.hash}`)
}
mintNFT()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
実行
$ node mint-nft.js
このメッセージがでたら、NFTのミント成功です。
NFT Minted! Check it out at: https://goerli.etherscan.io/tx/........
Openseaのテストネットで確認すると、NFTができてます。
以上です。