Web3開発者ツールボックス

Wagmiとは?React/TypeScriptでWeb3フロントエンド開発を効率化するメリット、使い方、技術選定のポイント

Tags: Wagmi, React, TypeScript, Web3フロントエンド, DApps開発, 技術選定

はじめに

ブロックチェーン技術を活用した分散型アプリケーション(DApps)やWeb3サービスの開発において、ユーザーインターフェースとなるフロントエンドの開発は重要な要素です。特にモダンなWeb開発において広く採用されているReactフレームワークやTypeScriptを使った開発環境では、効率的かつ堅牢なWeb3連携を実現するためのライブラリが求められています。

この記事では、ReactとTypeScriptに特化したWeb3フロントエンド開発ライブラリである「Wagmi」に焦点を当てます。Wagmiがどのような課題を解決し、プロジェクトにどのような価値をもたらすのか、その特徴、基本的な使い方、そして技術選定における考慮点について解説します。

Wagmiの概要と特徴

Wagmiは、React HooksベースのWeb3フロントエンド開発ライブラリです。Ethereumエコシステム(および互換性のあるチェーン)との連携に必要な様々な機能を、Reactの慣習に沿った使いやすい形で提供しています。

React Hooksベースのアプローチ

Wagmiの最大の特徴は、React Hooksを全面的に採用している点です。これにより、Web3の様々な状態(ウォレット接続状況、アカウントアドレス、ネットワークIDなど)や非同期操作(トランザクション送信、コントラクト呼び出しなど)を、Reactコンポーネント内で直感的かつ効率的に扱えます。useConnect, useAccount, useBalance, useContractRead, useSendTransactionといった豊富なHooksが提供されており、ボイラープレートコードを削減し、開発速度を向上させます。

TypeScriptによる高い型安全性

WagmiはTypeScriptで記述されており、スマートコントラクトのABI(Application Binary Interface)情報に基づいて、コントラクト呼び出しの関数名や引数、戻り値の型を自動的に生成・推論できます。これにより、開発者は実行時エラーのリスクを減らし、より安全で保守性の高いコードを書くことができます。

Ethers.jsまたはViemを内部使用

Wagmiは、Web3プロバイダーとの低レベルな通信部分には、人気のあるライブラリであるEthers.jsまたはViem(Wagmi v2以降のデフォルト)を内部的に利用しています。これにより、これらのライブラリが持つ堅牢性や幅広いプロバイダーサポートの恩恵を受けつつ、より抽象化されたReact Hooksインターフェースを通じてWeb3機能にアクセスできます。

具体的な使い方

Wagmiを使った開発は、プロジェクトへのインストールと基本的な設定から始まります。

1. インストール

npmまたはyarnを使って、プロジェクトにWagmiとその依存ライブラリを追加します。

npm install wagmi viem
# または
yarn add wagmi viem

2. 設定

アプリケーションのルートコンポーネントなどで、Wagmiクライアントとネットワーク(チェーン)を設定します。Providerとしては、Infura, Alchemy, Public RPCなど、様々な選択肢があります。また、サポートするウォレットコネクターも設定します。

// App.tsx (例)
import { WagmiConfig, createConfig, configureChains } from 'wagmi';
import { mainnet, polygon, optimism, arbitrum } from 'wagmi/chains';
import { publicProvider } from 'wagmi/providers/public';
import { MetaMaskConnector } from 'wagmi/connectors/metaMask';
import { WalletConnectConnector } from 'wagmi/connectors/walletConnect';

const { chains, publicClient, webSocketPublicClient } = configureChains(
  [mainnet, polygon, optimism, arbitrum],
  [publicProvider()]
);

const config = createConfig({
  autoConnect: true,
  connectors: [
    new MetaMaskConnector({ chains }),
    new WalletConnectConnector({
      chains,
      options: { projectId: 'YOUR_PROJECT_ID' }, // WalletConnect V2ではプロジェクトIDが必要
    }),
    // 他のコネクター...
  ],
  publicClient,
  webSocketPublicClient,
});

function App() {
  return (
    <WagmiConfig config={config}>
      {/* アプリケーションの他のコンポーネント */}
    </WagmiConfig>
  );
}

3. Hooksの利用例

設定が完了すれば、各種Wagmi HooksをReactコンポーネント内で利用できます。

ウォレット接続状況の取得

現在の接続アカウントや接続状態を取得します。

import { useAccount, useConnect, useDisconnect } from 'wagmi';
import { InjectedConnector } from 'wagmi/connectors/injected';

function ConnectWalletButton() {
  const { address, isConnected } = useAccount();
  const { connect } = useConnect({
    connector: new InjectedConnector(), // MetaMaskなどが対象
  });
  const { disconnect } = useDisconnect();

  if (isConnected) {
    return (
      <div>
        Connected to {address}
        <button onClick={() => disconnect()}>Disconnect</button>
      </div>
    );
  }

  return <button onClick={() => connect()}>Connect Wallet</button>;
}

コントラクトデータの読み取り

スマートコントラクトのView関数やPure関数を呼び出してデータを取得します。ABIとコントラクトアドレスを指定します。

import { useContractRead } from 'wagmi';
import { abi as yourContractAbi } from './yourContractAbi.json'; // ABIファイルをインポート

const yourContractAddress = '0x...'; // スマートコントラクトのアドレス

function TokenSymbol() {
  const { data, isError, isLoading } = useContractRead({
    address: yourContractAddress,
    abi: yourContractAbi,
    functionName: 'symbol', // ABIに定義されている関数名
  });

  if (isLoading) return <div>Fetching symbol...</div>;
  if (isError) return <div>Error fetching symbol</div>;

  return <div>Token Symbol: {data as string}</div>;
}

トランザクションの送信

ユーザーに署名を求め、トランザクションを送信します。

import { useSendTransaction } from 'wagmi';
import { parseEther } from 'viem';

function SendEthButton() {
  const { data, isLoading, isSuccess, sendTransaction } = useSendTransaction();

  return (
    <div>
      <button
        disabled={isLoading}
        onClick={() =>
          sendTransaction({
            to: '0x...', // 送信先アドレス
            value: parseEther('0.01'), // 送信量 (ETHの場合)
          })
        }
      >
        Send 0.01 ETH
      </button>
      {isLoading && <div>Check wallet...</div>}
      {isSuccess && <div>Transaction sent: {JSON.stringify(data)}</div>}
    </div>
  );
}

これらの例はWagmiが提供する機能のほんの一部です。実際には、署名、イベントリスニング、マルチコールなど、様々なユースケースに対応するHooksが用意されています。

活用事例

Wagmiは、React/TypeScriptを採用している多様なWeb3アプリケーションのフロントエンド開発に活用できます。

技術選定のポイント

Web3フロントエンドライブラリとしてWagmiを選択するかどうかは、いくつかの要因を考慮して判断する必要があります。

メリットとデメリット

メリット

デメリット

まとめ

Wagmiは、ReactとTypeScriptを使ったWeb3フロントエンド開発において、開発効率とコードの品質を大きく向上させる強力なライブラリです。React Hooksベースのアプローチは現代的なフロントエンド開発のワークフローに馴染みやすく、TypeScriptによる型安全性は大規模なプロジェクトでも安心して利用できる基盤を提供します。

React/TypeScript環境でWeb3アプリケーションの開発を検討している技術リーダーやプロジェクトマネージャーにとって、Wagmiは技術選定の有力な候補となるでしょう。プロジェクトの要件、開発チームのスキルセット、そして他のWeb3ライブラリとの比較検討を通じて、Wagmiがもたらす価値を最大限に引き出せるか判断することが重要です。

Web3技術は常に進化しており、Wagmiのようなライブラリも継続的に改善されています。最新情報を追いつつ、最適なツールを選択することが、成功するWeb3プロジェクトには不可欠です。