NFTがMintできるWEBサイトを作ろう
🪄 Web サイトを構築する
これから、オリジナルのWebサイトを構築し、ユーザーがWebサイトから直接NFTをMintできる機能を実装していきます。
-
ユーザーがMetaMaskウォレットをWebサイトに接続できる
-
ユーザーがコントラクト関数を呼び出し、支払いを行い、コレクションからNFTを作成できるようにする
このレッスンを終了すると、Reactで構築されたdAppが完成します。
また、汎用的なdAppのフロントエンドを構築するために必要な基礎知識も習得できます。
では下記に、今回のプロジェクトのために用意したテンプレートを紹介します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="Collectible NFT on Polygon✨"
content="Solidity + Alchemy + Polygon + React + Vercel = Generative Art NFT を Mint しよう💫"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<title>Collectible NFT on Polygon</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
</html>
次に、packages/client/src
フォルダに移動して、App.test.js
, logo.svg
, setupTests.js
ファイルを削除してください。
このレッスンでは、これらのファイルは必要ありません。
次に、src
フォルダの中にあるApp.js
ファイルを開き、内容を、以下の定型文に置き換えます。
import "./App.css";
function App() {
return <h1>Hello World</h1>;
}
export default App;
src/App.css
の内容もすべて削除してください。
ただし、このファイル自体は削除しないでください。
後で、このデモプロジェクトに使用する基本的なCSSスタイルを提供します。
localhost://3000
に戻ると、Hello World
という画面が表示されるはずです。
これで、Reactプロジェクトのセットアップが完了しました。
📂 コントラクトの ABI とアドレスを取得する
フロントエンドがスマートコントラクトに接続し、通信できるようにするためには、コントラクトのABIとアドレスが必要です。
ABI(またはApplication Binary Interface)は、コントラクトのコンパイル時に自動的に生成されるJSONファイルです。
デプロイ先のブロックチェーンは、スマートコントラクトをバイトコードの形で 保存しています。
そのうえで関数を呼び出し、正しいパラメータを渡し戻り値を解析するためには、関数とコントラクトに関する詳細(名前、引数、型など)をフロントエンドに指定する必要があります。
これがまさにABIファイルの役割です。
packages/contract/artifacts/contracts/NFTCollectible.sol/NFTCollectible.json
をVS Codeで開き中身を確認してみましょう。
NFTCollectible.json
に記載されているすべてのコードが、ABIファイルです。
まず、JSONファイルをReactプロジェクトにコピーする必要があります。
packages/client/src
フォルダにcontracts
という新しいフォルダを作成し、NFTCollectible.json
ファイルをコピーして貼り付けましょう。
次に、前回のレッスンでPolygonテストネットにデプロイしたスマートコントラクトのアドレスを取得してください。
前回のレッスンで私が使用したコントラクトのアドレスは0xF899DeB963208560a7c667FA78376ecaFF684b8E
です。
このレッスンでも、このコントラクトを使用していきます。
それでは、コントラクトABIをインポートして、App.js
ファイルにコントラクトアドレスを定義していきましょう。
import "./App.css";
import contract from "./contracts/NFTCollectible.json";
const contractAddress =
"あなたのコントラクトアドレスをこちらに貼り付けてください";
const abi = contract.abi;
function App() {
return <h1>Hello World</h1>;
}
export default App;
🛠 HTML、CSS、JS を設定する
今回作成するWebサイトは、シンプルなものになります。
あるのは見出しとConnect Wallet
ボタンだけです。
ウォレットが接続されると、Connect Wallet
ボタンがMint NFT
ボタンに置き換わります。
個別のコンポーネントファイルを作成する必要はありません。
代わりに、すべてのHTMLとロジックをApp.js
に、すべてのCSSをApp.css
に記述します。
以下の内容を、App.js
ファイルにコピーしてください。
import { useEffect } from "react";
import "./App.css";
import contract from "./contracts/NFTCollectible.json";
const contractAddress = "あなたのコントラクトアドレスを貼り付けましょう";
const abi = contract.abi;
function App() {
const checkWalletIsConnected = () => {};
const connectWalletHandler = () => {};
const mintNftHandler = () => {};
const connectWalletButton = () => {
return (
<button
onClick={connectWalletHandler}
className="cta-button connect-wallet-button"
>
Connect Wallet
</button>
);
};
const mintNftButton = () => {
return (
<button onClick={mintNftHandler} className="cta-button mint-nft-button">
Mint NFT
</button>
);
};
useEffect(() => {
checkWalletIsConnected();
}, []);
return (
<div className="main-app">
<h1>Scrappy Squirrels Tutorial</h1>
<div>{connectWalletButton()}</div>
</div>
);
}
export default App;
App.js
の5行目であなたのコントラクトアドレスを設定してください。
const contractAddress = "あなたのコントラクトアドレ スを貼り付けましょう";
現時点では、関数をいくつか定義していることに注意してください。後で、その目的を説明し、ロジックを組み込んでいく予定です。
また、Webアプリケーションのために、CSSも用意しました。
以下をApp.css
ファイルにコピーしてください。
.main-app {
text-align: center;
margin: 100px;
}
.cta-button {
padding: 15px;
border: none;
border-radius: 12px;
min-width: 250px;
color: white;
font-size: 18px;
cursor: pointer;
}
.connect-wallet-button {
background: rgb(32, 129, 226);
}
.mint-nft-button {
background: orange;
}
あなたのWebサイトは、このように表示されるはずです 。
CSSスタイルや静的要素(画像、ヘッダ、フッタ、ソーシャルメディアリンクなど)を追加して、Webサイトの外観を自由にカスタマイズしてください。
ここまで、プロジェクトの基礎となるブロックはほぼそろいました。
これで、ユーザーがウォレットをWebサイトに接続する準備が整いました。
🦊 MetaMask ウォレットとの接続
ユーザーがントラクトを呼び出すためには、自分のウォレットをWebサイトに接続する必要があります。
ウォレット接続は、ユーザーがNFTをMintし、ガス代と販売価格を支払うことを可能にします。
このレッスンでは、MetaMaskウォレットとMetaMask APIのみを使用します。
まず、ユーザーのブラウザに、MetaMaskウォレットが存在するか確認していきます。
ユーザーはMetaMaskウォレットを持っていなければ、Webサイト上でNFTをMintできません。
MetaMaskウォレットが存在するかどうかを確認するロジックを、checkWalletIsConnected
関数に入力しましょう。
const checkWalletIsConnected = async () => {
const { ethereum } = window;
if (!ethereum) {
console.log("Make sure you have MetaMask installed!");
return;
} else {
console.log("Wallet exists! We're ready to go!");
}
};
なお、App.js
がロードされる際に、MetaMaskの存在を確認するuseEffect
フックも定義しています。
アプリケーションのlocalhost
ページでConsoleを開いてください。
- ステップ: Webページ上で右クリック →
Inspect
→Console
MetaMaskがインストールされていれば、Wallet exists! We’re ready to go!
というメッセージがConsoleに表示されているはずです。
MetaMaskエクステンションをインストールしたからといって、アクセスしたすべてのWebサイトにMetaMaskが自動的に接続されるわけではありません。
MetaMaskがユーザーにウォレットを接続するように促す必要があるのです。
そこで登場するのがConnect Wallet
機能です。
これはweb3のログインボタンに相当します。
このログインボタンは、ユーザーがフロントエンドを通じてブロックチェーンネットワークに接続し、コントラクトを呼び出すことを可能にします。
MetaMaskはwindow.ethereum.request
メソッドでこのプロセスシンプルに実行します。
まず、ユーザーのウォレットアドレスを追跡するために、App()
でuseState
フックを使って変数を定義しましょう。