最近、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 が自身とウォレットの接続状態を制御することは合理的であり、セキュリティ上の問題は存在しないはずです。