[Flutter] WalletConnectでweb3のアプリを作る

![](https://storage.googleapis.com/zenn-user-upload/e6dbb2acee57-20240224.png)


こんにちは。いせりゅーです。
開発する中でWeb３についての記事が少なく、開発する中でとても大変だったので、記事にしようと思いました。少しでもお役に立てるような記事になれたら嬉しいです🙌

# WalletConnectについて

- QRコードを利用してスマホもしくはタブレットのウォレットアプリから、パソコンのNFTマーケットプレイスやDApps（分散型アプリケーション）にウォレットを接続できる橋渡しのようなサービスです。
- 様々なウォレットに対応していますが、今回は、MetaMaskの接続をしてみようと思います。

<b>参考文献</b>

https://sbinft.co.jp/how-to-use-walletconnect/

https://walletconnect.com/

# WalletConnectについてのPackages
WalletConnectを実装するにおいて、様々なPackagesが用意されています。

https://pub.dev/packages/walletconnect_dart

https://pub.dev/packages/wallet_connect_v2

https://pub.dev/packages/walletconnect_flutter_v2

https://pub.dev/packages/walletconnect_qrcode_modal_dart

https://pub.dev/packages/web3modal_flutter



いろいろ試してみましたが、<b>`web3modal_flutter`</b>がしっくりときて、実装することができましたので、これで進めていこうと思います。

### 注意🚨
- 1.0系だと古いため、2.0系を使用することを推奨されているそうです。
- 2023年6月28日にWalletConnect v1.0がシャットダウンされました。そのため、WalletConnect v2.0に移行する必要があります。
- そのため、`v2`と書かれたものか更新頻度が近いものを使うことをオススメします。

https://docs.walletconnect.com/advanced/migration-from-v1.x/overview


# 実装する
`web3modal_flutter`を使用して実装を進めていきます。

https://pub.dev/packages/web3modal_flutter


<b>１、`pubspec.yaml`に追加
```
flutter pub add web3modal_flutter
```

<b>２、iOSに必要な準備をする
- `/ios/Podfile`に追記
```
platform :ios, '13.0'
```
- Info.plistに`LSApplicationQueriesSchemes`を追記する。
必要なウォレットを記載しましょう。 
```plist
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>metamask</string>
  <string>trust</string>
  <string>safe</string>
  <string>rainbow</string>
  <!-- Add other wallet schemes names here -->
</array>
```
  
<b>３、Androidに必要な準備をする
- AndroidManifest.xmlに記載をする。
必要なウォレットを記載しましょう。 

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <queries>
        <package android:name="io.metamask"/>
        <package android:name="com.wallet.crypto.trustapp"/>
        <package android:name="io.gnosis.safe"/>
        <package android:name="me.rainbow"/>
        <!-- Add other wallet schemes names here -->
    </queries>

    <application>
        ...
    </application>
</manifest>
```

<b>4、wallet_connectに登録をして、projectIdを取得する。

以下のサイトからアカウントを作成して、ProjectIDを取得しましょう。

https://cloud.walletconnect.com/sign-in


<b>5、実装を行う
- サンプルコードを使用しています。ひとまず実装できるまでを目標にしているため、詳しい実装などは別の記事にしようと思います。
- 

```dart

import 'package:flutter/material.dart';
import 'package:web3modal_flutter/web3modal_flutter.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  late W3MService _w3mService;

  @override
  void initState() {
    super.initState();
    _initializeW3MService();
  }

  void _initializeW3MService() async {
    // 初期設定を行う
    _w3mService = W3MService(
      //wallet_connectのプロジェクトID
      projectId: 'YOUR_PROJECT_ID',
      metadata: const PairingMetadata(
        name: 'Web3Modal Flutter Example',
        description: 'Web3Modal Flutter Example',
        url: 'https://web3modal.com/',
        icons: ['https://web3modal.com/images/rpc-illustration.png'],
        redirect: Redirect(
          native: 'web3modalflutter://',
          universal: 'https://web3modal.com',
        ),
      ),
    );

    await _w3mService.init();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Column(
        children: !_w3mService.isConnected
            ? [
          W3MNetworkSelectButton(service: _w3mService),
          W3MConnectWalletButton(service: _w3mService),
        ]
            : [
          W3MAccountButton(service: _w3mService),
        ],
      ),
    );
  }
}
```

# 最後に
あまりWeb3関連の記事が多くないかつ、そもそもアプリ化することが少ないと思うので、実装する人が少ないと思っています。
だからこそ、チャンスだと思っています。たくさん開発して、実装して、アウトプットするぞ🔥