🐙

[Astar]コントラクト備忘録47(Polkadot.jsを使って、ウォレット接続を行おう!)

2023/03/16に公開

本日は、こちらの「Polkadot.js」を元に、ウォレット接続を行っていこうと思います。

https://polkadot.js.org/docs/extension/cookbook

こちらの「Cookbook」から確認します。

「@polkadot/extension-dapp」の「web3Accounts」と「web3Enable」が今回のキーです。


https://polkadot.js.org/docs/extension/cookbook

ちなみに、「next.js」の場合はこのままやるとエラーが出ます。

こちらのサイトが参考になりました。
https://techblg.app/articles/how-to-solve-reference-error-window-is-not-defined-with-polkadotjs-on-nextjs/

「@polkadot/extension-dapp」では「window」が使われます。

next.jsはサーバーサイドレンダリングがされてしまうので、下のように設定する必要があります。

https://techblg.app/articles/how-to-solve-reference-error-window-is-not-defined-with-polkadotjs-on-nextjs/

では、これらを踏まえ、今回、下のようなコードを使用しました。

import React, { useState } from 'react';

const inter = Inter({ subsets: ['latin'] })

export default function Home() {
  const [address, setAddress] = useState('');
  const [source, setSource] = useState('');
  
  async function connectWallet () {

    const { web3Accounts, web3Enable} = await import(
      "@polkadot/extension-dapp"
    );

    const allInjected = await web3Enable('my dapp');
  
    if (allInjected.length === 0) {
      return;
    }
    const accounts = await web3Accounts();
    console.log("accounts",accounts)

    const account = accounts[0];
    console.log("account",account)

    const address = account?.address
    const source = account?.meta?.source

    console.log("address",address)
    console.log("source",source)

    setAddress(address);
    setSource(source);
  }
  return (

まずは「web3Enable」を使い、ウォレットに対し、許可するか否かのポップアップを表示します。

そして、許可されたウォレットの情報を取得します。

ちなみに、ここでの「my dapp」とは、ポップアップに表示され、どのdappが許可を求めているのかがわかるようにするためのものです。

このように許可を求められました。

「Yes, allow this application access」を選択します。

すると、このように表示されました。

私の場合、「talisman」と「polkadot.js」が許可をしています。

次に重要なのが、「web3Accounts」です。

このようにアカウント情報を取得します。

今回は先頭のアカウント情報を取ってきました。

このように、私の場合は、6つのアカウントを持っていることがわかりました。

では、表示の部分です。

<div>
            <button onClick={connectWallet}>Connect Wallet</button>
            {address && <p>Address: {address}</p>}
            {source && <p>Source: {source}</p>}
          </div>

下のように、ボタンを押すと実行するようにしましょう。

このように、ボタンがあり、

押すと、このように情報を取得してくれました。

以上です。

Discussion