lesson-2_webアプリケーションからNFTをmintしよう
☘️ Web アプリケーションから NFT を Mint する
前回のレッスンでは、Webアプリケーションを立ち上げました。
これから、Web アプリケーションからWeb3Mint.sol
コントラクトにアクセスして、NFT を発行するmintIpfsNFT
関数を呼び出していきましょう。
- 以前のレッスンで
mintIpfsNFT
関数はWeb3Mint.sol
に実装しました。
まず、NftUploader.jsx
内import { Button } from '@mui/material';
の下に、下記のコードを追加してください。
// NftUploader.jsx
import { ethers } from "ethers";
ここでは、フロントエンドとコントラクトを連携させるライブラリethers
をインポートしています。
まだethers
のライブラリをインストールしてなかったので、プロジェクトのル ートで以下のコマンドを実行してください。
yarn workspace client add ethers@5.7.2
ethersをもっと詳しく知りたい方は、こちらをどうぞ。
次に、下記のコードをNftUploader.jsx
のconnectWallet
関数の下にaskContractToMintNft
関数を追加してください。
- フロントエンドに実装する
askContractToMintNft
関数が、コントラクトとWebサイトを連動させ、mintIpfsNFT
関数を呼び出します。
// NftUploader.jsx
const askContractToMintNft = async (ipfs) => {
const CONTRACT_ADDRESS =
"ここに Sepolia Test Network にデプロイしたコントラクトのアドレスを貼り付けてください";
try {
const { ethereum } = window;
if (ethereum) {
const provider = new ethers.providers.Web3Provider(ethereum);
const signer = provider.getSigner();
const connectedContract = new ethers.Contract(
CONTRACT_ADDRESS,
Web3Mint.abi,
signer
);
console.log("Going to pop wallet now to pay gas...");
let nftTxn = await connectedContract.mintIpfsNFT("sample", ipfs);
console.log("Mining...please wait.");
await nftTxn.wait();
console.log(
`Mined, see transaction: https://sepolia.etherscan.io/tx/${nftTxn.hash}`
);
} else {
console.log("Ethereum object doesn't exist!");
}
} catch (error) {
console.log(error);
}
};
1行ずつ、コードを見ていきましょう。
// NftUploader.jsx
const CONTRACT_ADDRESS =
"ここに Sepolia Test Network にデプロイしたコントラクトのアドレスを貼り付けてください";
ここでは、コントラクトのアドレスをCONTRACT_ADDRESS
に格納しています。
ルーディレクトリでもう一度下記を実行し、コントラクトのアドレスを取得 してください。
yarn contract deploy
貼り付けるアドレスの例は、以下のようになります。
Contract deployed to: 0x88a0e9c2F3939598c402eccb7Ae1612e45448C04
上記のアドレスを'ここに ... 貼り付けてください'
の中身と入れ替えてください。
provider
やsigner
の概念がわからない方は、Project2-section3-lesson3を見て復習してみてください。
では、コントラクトインスタンスの説明から始めます。
// NftUploader.jsx
const connectedContract = new ethers.Contract(
CONTRACT_ADDRESS,
Web3Mint.abi,
signer
);ここでは、コントラクトへの接続を行っています。
新しいコントラクトインスタンス(=
connectedContract
)を作成するには、以下 3 つの変数をethers.Contract
関数に渡す必要があります。
CONTRACT_ADDRESS
: コントラクトのデプロイ先のアドレス(ローカル、テストネット、またはイーサリアムメインネット)
Web3Mint.abi
: コントラクトの ABI
signer
もしくはprovider
コントラクトインスタンスでは、コントラクトに格納されているすべての関数を呼び出すことができます。
もしこのコントラクトインスタンスに
provider
を渡すと、そのインスタンスは読み取り専用の機能しか実行できなくなります。一方、
signer
を渡すと、そのインスタンスは読み取りと書き込みの両方の機能を実行できるようになります。※ ABI についてはこのレッスンの終盤にて詳しく説明します。
次に、下記のコードを見ていきましょう。
// NftUploader.jsx
let nftTxn = await connectedContract.mintIpfsNFT("sample", ipfs);
console.log("Mining...please wait.");
ここでは、mintIpfsNFT
関数をコントラクトから呼び出し、await
を使用して、NFTの発行が承認(=マイニング)されるまで、処理をやめています。
console.log
では、NFTを発行するためのトランザクションが「承認中」であることを通知しています。
次に、下記のコードを見ていきましょう。
// NftUploader.jsx
await nftTxn.wait();
console.log(
`Mined, see transaction: https://sepolia.etherscan.io/tx/${nftTxn.hash}`
);
承認が終わったら、await nftTxn.wait()
が実行され、トランザクションの結果を取得します。コードが冗長に感じるかもしれませんが、大事な処理です。
console.log
では、取得したトランザクションの結果を、Etherscan URLとして出力しています。
askContractToMintNft
関数を呼び出すコードはこの後実装していくので、今は気にしないでください。
すべての変更をNftUploader.jsx
に反映させた後、ターミナルで下記を実行しみてください。
yarn client start