最近、MetaMask の接続を切り替えられない問題について調査するために時間を費やしました。以前は公式ドキュメントに対応する API が提供されていないと思っていましたが、後に Wagmi が shimDisconnect 機能を実験的にサポートしたことに気付きました。そのソースコードを調査し、ここに記録しておきます!
問題の説明#
Dapp が MetaMask ウォレットに接続する際、Dapp がログアウトするとき、MetaMask はウォレットと現在のウェブサイトの接続状態を切断する API を提供していないため、次回ユーザーが再度ログインすると、アカウント選択画面が表示されなくなります。
詳細はこちら: https://github.com/MetaMask/metamask-extension/issues/8990
解決策#
問題に対する回答と wagmi の shimdisconnect 機能の実装を参考にしてください: https://github.com/wevm/wagmi/pull/616/files
以下は核心的なコードです。ログイン時に wallet_requestPermissions を呼び出してアカウント選択画面を表示し、その後 eth_requestAccounts を呼び出してユーザーが選択したアカウントを取得します。
const accounts = await window.ethereum.request({
method: "wallet_requestPermissions",
params: [{
eth_accounts: {}
}]
}).then(() => ethereum.request({
method: 'eth_requestAccounts'
}))
const account = accounts[0]
考察#
-
MetaMask と OKX ウォレットはこの方法で要件を満たすことができますが、これはおそらく無理な選択肢です。
-
現在、ほとんどの Web3 ウォレットは programmatically disconnect をサポートしていません。これはどのような考慮からなのか?セキュリティ上の問題であれば、Dapp が自身とウォレットの接続状態を制御することは合理的であり、セキュリティ上の問題は存在しません。