Web3js

如何檢查使用者是否已登錄 Metamask?

  • June 7, 2021

我嘗試了一個非常簡單的 web3 範例,如果您登錄 Metamask 並嘗試發送一些 ETH,它就可以工作。

但是,如果我沒有登錄 Metamask,則不會顯示任何錯誤和提示。

如何檢查使用者是否已登錄 Metamask?

   <html>
     <head>
        <title>Introduction to Dapps. Simple MetaMask example.</title>
     </head>
     <body>
     <div id="meta-mask-required"></div>
     <fieldset>
       <label> Ether:
         <input type="text" id="amount"></input>
       </label>
       <button onclick="send()">Donate to the Author</button>
       <div id="response"></div>
     </fieldset>

     <script>
       // MetaMask injects the web3 library for us.
       window.onload = function() {
         if (typeof web3 === 'undefined') {
           document.getElementById('meta-mask-required').innerHTML = 'You need <a href="https://metamask.io/">MetaMask</a> browser plugin to run this example'
         }
       }
       function send() {
         web3.eth.sendTransaction({
           from: web3.eth.coinbase,
           to: '0xA7b25444868Cc0e6AcFd81852b3bc3F335933760',
           value: web3.toWei(document.getElementById("amount").value, 'ether')
         }, function(error, result) {
           if (!error) {
             document.getElementById('response').innerHTML = 'Success: <a href="https://testnet.etherscan.io/tx/' + result + '"> View Transaction </a>'
           } else {
             document.getElementById('response').innerHTML = '<pre>' + error + '</pre>'
           }
         })
       }
     </script>
     </body>
   </html>

我解決這個問題的方法是呼叫web3.eth.getAccounts()

如果它返回一個空數組,實際上意味著使用者沒有登錄到 MetaMask:

web3.eth.getAccounts(function(err, accounts){
   if (err != null) console.error("An error occurred: "+err);
   else if (accounts.length == 0) console.log("User is not logged in to MetaMask");
   else console.log("User is logged in to MetaMask");
});

MetaMask 將不再注入web3,因此依賴它不是一個好習慣。

我使用了ethers.js圖書館。我必須使用 rollup.js 將其引入我的項目,但您也可以使用 bundler 或 webpack 或其他任何東西。

const { ethereum } = window;
if (ethereum) {
   var provider = new ethers.providers.Web3Provider(ethereum);
}

...

const isMetaMaskConnected = async () => {
   const accounts = await provider.listAccounts();
   return accounts.length > 0;
}

await isMetaMaskConnected().then((connected) => {
   if (connected) {
       // metamask is connected
   } else {
       // metamask is not connected
   }
});

引用自:https://ethereum.stackexchange.com/questions/27366