MetaMask SDKをNext.jsで実装する方法

Next.jsでMetaMaskの「ウォレット接続」ボタンを統合する方法を学びましょう。セットアップ、MetaMask SDKの使用、ShadcnUIによるUI作成をカバーするチュートリアルです。

6分で読める
MetaMask SDKをNext.jsで実装する方法

Web3において、ウォレットとはユーザーがブロックチェーンネットワークと対話できるデジタルアプリケーションを指します。ウォレットはユーザーと分散型ブロックチェーンの世界をつなぐ橋渡し役を担っています。メールアドレスとパスワードの組み合わせやOAuthサービスを認証に使用する従来のWebアプリケーションとは異なり、Web3アプリはウォレットの所有権とそれに紐づく秘密鍵に基づいてユーザーを認証します。「Connect Wallet」ボタンは、この認証プロセスを開始するためのものです。

このチュートリアルでは、MetaMaskウォレットとの認証プロセスを開始する「Connect Wallet」ボタンをNext.jsアプリに実装します。

前提条件:

  • Next.jsおよびReactの基本的な知識。

  • Node.jsおよびnpm/yarnがインストール済みであること。

  • ブラウザにMetaMask拡張機能がインストール済みであること。

これらはチュートリアルの前提条件ですが、実際に始めながら学ぶことが最善の方法です。

Next.jsプロジェクトのセットアップ:

Next.jsプロジェクトをセットアップするには、マシンにNode.jsがインストールされている必要があります。Node.jsのインストール後、ターミナルを開いて以下のコマンドを実行することで、新しいNext.jsアプリケーションを作成できます:

npx create-next-app@latest

以下のプロンプトが表示されます:

npx create-next-app@latest
✔ What is your project named? … next-metamask-template
✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like to use `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to customize the default import alias (@/*)? … No / Yes
コピー

このコマンドは、指定したプロジェクト名で新しいフォルダを作成し、Next.jsの初期構造をセットアップして、必要な依存関係をすべてインストールします。作成されたフォルダに移動してください。

cd next-metamask-template

次にnpm run devコマンドを実行します。このコマンドはNext.jsアプリケーションを開発モードで起動し、Webブラウザでhttp://localhost:3000にアクセスすることでアプリケーションを確認できます。

ユーザーインターフェースの作成

アプリにコンポーネントライブラリを追加します。ShadcnUIをインストールしましょう。

npx shadcn-ui@latest init

components.jsonを設定するための以下のプロンプトが表示されます:

Would you like to use TypeScript (recommended)? no / yes
Which style would you like to use? › Default
Which color would you like to use as base color? › Slate
Where is your global CSS file? › › app/globals.css
Do you want to use CSS variables for colors? › no / yes
Where is your tailwind.config.js located? › tailwind.config.js
Configure the import alias for components: › @/components
Configure the import alias for utils: › @/lib/utils
Are you using React Server Components? › no / yes
コピー

ShadcnUIコンポーネントライブラリから、このチュートリアルではButtonとPopoverの2つのコンポーネントを使用します。

また、@metamask/sdk-reactも使用します。詳細はMetaMaskドキュメントでご確認いただけます。

SDKをインストールしましょう:

npm i @metamask/sdk-react

NavBar.tsxという新しいコンポーネントを作成し、「Connect Wallet」ボタンとSDKを追加します。最初のコンポーネントは以下のようになります:

"use client";

import Link from "next/link";

import WalletIcon from "../public/icons/WalletIcon";

import { Button } from "./ui/button";

import { useSDK, MetaMaskProvider } from "@metamask/sdk-react";
import { formatAddress } from "../lib/utils";
import {
  Popover,
  PopoverTrigger,
  PopoverContent,
} from "@/components/ui/popover";

export const ConnectWalletButton = () => {
  const { sdk, connected, connecting, account } = useSDK();

  const connect = async () => {
    try {
      await sdk?.connect();
    } catch (err) {
      console.warn(`No accounts found`, err);
    }
  };

  const disconnect = () => {
    if (sdk) {
      sdk.terminate();
    }
  };

  return (
    <div className="relative">
      {connected ? (
        <Popover>
          <PopoverTrigger>
            <Button>{formatAddress(account)}</Button>
          </PopoverTrigger>
          <PopoverContent className="mt-2 w-44 bg-gray-100 border rounded-md shadow-lg right-0 z-10 top-10">
            
              Disconnect
            
          </PopoverContent>
        </Popover>
      ) : (
        <Button disabled={connecting} onClick={connect}>
          <WalletIcon className="mr-2 h-4 w-4" /> Connect Wallet
        </Button>
      )}
    </div>
  );
};
コピー

ここで行った内容を確認しましょう:

1. useSDKフック:まず、MetaMask SDKの機能にアクセスするためのuseSDKフックに注目します。このフックは、MetaMaskと対話するためのSDKオブジェクト、ウォレットの接続状態を確認するconnectedブール値、接続状態をチェックするconnectingブール値、そしてユーザーのアカウントアドレスにアクセスするためのaccountを提供します。

2. 接続・切断関数:connectとdisconnectという2つの重要な関数が含まれています。connect関数は、SDKを使用してMetaMaskウォレットとの接続を確立しようとする非同期処理です。接続が成功すると、useSDKフックのconnectedとaccountの値が更新されます。一方、disconnect関数はsdk.terminate()を呼び出してウォレットを切断するために使用されます。

3. UI要素:ButtonとPopoverの2つのUI要素を実装しています。コンポーネントのレンダリングは接続状態に応じて変化します。接続中の場合は、フォーマットされたアカウントアドレスと切断オプションを表示するPopoverコンポーネントが表示されます。未接続の場合は「Connect Wallet」ボタンが表示され、接続処理中は無効化されます。

次にNavBarのコードを追加しましょう:

export const NavBar = () => {
  const host =
    typeof window !== "undefined" ? window.location.host : "defaultHost";

  const sdkOptions = {
    logging: { developerMode: false },
    checkInstallationImmediately: false,
    dappMetadata: {
      name: "Next-Metamask-Boilerplate",
      url: host, // using the host constant defined above
    },
  };

  return (
    <nav className="flex items-center justify-between max-w-screen-xl px-6 mx-auto py-7 rounded-xl">
      <Link href="/" className="flex gap-1 px-6">
        <span className="hidden text-2xl font-bold sm:block">
          <span className="text-gray-900">Template</span>
        </span>
      </Link>
      <div className="flex gap-4 px-6">
        <MetaMaskProvider debug={false} sdkOptions={sdkOptions}>
          <ConnectWalletButton />
        </MetaMaskProvider>
      </div>
    </nav>
  );
};

export default NavBar;
コピー

ここで行った内容を確認しましょう:

  1. host変数:この変数は、SDKオプションで使用するために現在のウィンドウのホストアドレスを取得します。ブラウザ環境で実行されているかどうかを確認する条件チェックが含まれています。

  2. SDKオプション:MetaMask SDKの設定オプションで、ログやインストールチェックの設定、およびdappに関するメタデータを含みます。

  3. NavBarコンポーネント:NavBarはホームページへのリンクを含み、ConnectWalletButtonコンポーネントを組み込んでいます。MetaMask SDKから必要なコンテキストを提供するため、@metamask/sdk-reactからインポートしたMetaMaskProviderコンポーネントでConnectWalletButtonをラップしています。

  • ウォレットアイコン:ウォレットアイコンの取得には、SVG画像をReactコンポーネントに変換するツールであるSVGRを使用しました。

NavBarにウォレットの完全なアドレスが表示されすぎないよう、libフォルダ内のutils.tsファイルを調整します。これにより、アドレスがより簡潔な形式で表示されます。

import { clsx, type ClassValue } from "clsx";
import { twMerge } from "tailwind-merge";

export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs));
}
コピー

以下の行を追加してください:

export const formatBalance = (rawBalance: string) => {
  const balance = (parseInt(rawBalance) / 1000000000000000000).toFixed(2);
  return balance;
};

export const formatChainAsNum = (chainIdHex: string) => {
  const chainIdNum = parseInt(chainIdHex);
  return chainIdNum;
};

export const formatAddress = (addr: string | undefined) => {
  return `${addr?.substring(0, 8)}...`;
};
コピー

上記のformatBalance、formatChainAsNum、formatAddressという関数は、dApp全体でインポートして使用することで、ブロックチェーンデータを一貫した形式でユーザーに表示するために設計されています。

NavBarコンポーネントでは、以下のようにインポートします:

import { formatAddress } from "../lib/utils";

そして、ボタンでは以下のように使用します:

あとはNavBar.tsxをlayout.tsxコンポーネントにインポートするだけです。

開発サーバーを起動すると、アプリに加えた変更が確認できます。

まとめ

MetaMask SDKは、DAppを構築する上で非常に便利であり、まさにゲームチェンジャーと言えます。ユーザーがMetaMaskブラウザ拡張機能やMetaMask Mobileに簡単に接続できるようにします。

これはMetaMask SDKを使い始めるための入門でしたが、このSDKではさらに多くのことが可能であり、フルスタックアプリケーションでも活用できます。このプロジェクトのコードはこちらのリポジトリで確認できます。

以下のリソースもあわせてご確認されることをお勧めします:

Happy Building. 🚀

AIによる翻訳です。エラーが含まれている可能性があります。常に情報を確認してください。

翻訳を評価する