NFTを作ってみた

2021/12/14

Solidity と TypeScript とHardhat nft.storage OpenZeppelin を使って、NFT を作成して、OpenSea で確認してみました。

目次

ソースコード

https://github.com/edo1z/hardhat1

.env の作成

.env をこのリポジトリのルートに作成して、下記を入力します。

NFT_STORAGE_API_KEY = *****
METADATA_URI = https://ipfs.io/ipfs/*****/metadata.json
MATIC_TEST_URL=https://rpc-mumbai.maticvigil.com
PRIVATE_KEY_MATIC_TEST=*****
MINT_ADDRESS = 0x*****

画像と metadata.json の作成・アップロード

  • hoge.jpg を作成して、このリポジトリのルートに置いておきます。
  • nft.storage にアカウントを作成して、API KEY を、.envNFT_STORAGE_API_KEY に書きます。
  • net.storage の github に node.js 用のサンプル がありますので、これを参考に、hoge.jpg を IPFS にアップして、metadata.json を作成し、URI を取得します。
  • このリポジトリの scripts/storage.ts は、上記を参考にしたコードです。下記を実行することで、storage.ts が実行されます。
> npx hardhat run scripts/storage.ts
  • 実行後に、https://ipfs.io/ipfs/****/metadata.json という URL が表示されますので、.envMETADATA_URI にその URL をコピペします。

NFT コントラクトの作成

  • コントラクトは、ここ にあるコードをほぼコピペしました。
  • ERC721URIStorage だと、mint 時に tokenURI を個別に指定できますので、ちょうどよいかなと思いました。
  • このリポジトリの contracts/NftStorage.sol になります。

network の設定

  • 今回は、Polygon のテストネット(mumbai)にデプロイしてみました。
  • hardhat.config.tsで network の設定ができます。Polygon の設定はここ が参考になります。
  • URL と private key が必要なので、.envに書いておきます。
    • URL は、下記のように MATIC_TEST_URL に書きます。
    • プライベートキーは MetaMask から取得したりして、下記のように、 PRIVATE_KEY_MATIC_TEST に書きます。
    • また、アカウントには mumbai の matic が必要です。ない場合は、ここ から貰えます。
MATIC_TEST_URL=https://rpc-mumbai.maticvigil.com
PRIVATE_KEY_MATIC_TEST=*****

コントラクトのデプロイと mint

  • mint 時に NFT を送信するアドレスを、.envMINT_ADDRESSに書きます。
  • 今回は、test/deploy-nft-and-mint-test.tsでデプロイと mint を一緒に実行してみました。
  • 下記コマンドを実行すると、Polygon の mumbai にコントラクトがデプロイされて、その後 mint されます。
> npx hardhat test --network mumbai
Rust🦀, Network⚡, PostgreSQL🐘, Unity🎮

Tags

rust  (9)
rocket  (7)
svelte  (5)
c++  (4)
ethereum  (3)
solidity  (3)
vscode  (3)
sqlx  (3)
glfw  (2)
opengl  (2)
nestjs  (2)
graphql  (2)
render  (2)
wsl2  (2)
truffle  (1)
goerli  (1)
geth  (1)
hardhat  (1)
nft  (1)
gui  (1)
tetris  (1)
next.js  (1)
jwt  (1)
nextauth  (1)
node.js  (1)
prisma  (1)
passport  (1)
urql  (1)
codegen  (1)
mdsvex  (1)
markdown  (1)
tmux  (1)
nvim  (1)
axum  (1)
atcoder  (1)
vim  (1)
pacman  (1)
tracing  (1)
Cursor  (1)
VSCode  (1)
PHP  (1)
Laravel  (1)