如何使用react js更改metamask中的网络

Sur*_*war 13 javascript reactjs web3-react

我正在开发我的第一个 Dapp,为此我使用 metamask 和 web3。到目前为止,我能够获取我的钱包余额并将帐户连接到元掩码。现在我正在尝试在两个网络之间切换,我正在使用handleChainChanged,我还传递了chainId和Networkversion,但是它给了我错误。我不确定是否从changeNetwork函数返回任何内容,或者我只需要传递chainId和Networkversion。

import { useStoreApi } from "./storeApi";
import { useState } from "react";
import useWeb3 from "./useWeb3";
import { Button, TextField } from "@material-ui/core";

import "./App.css";

function App() {
  const { balance, address, message, setAddress, setBalance } = useStoreApi();
  const web3 = useWeb3();

  // get user account on button click
  const getUserAccount = async () => {
    if (window.ethereum) {
      try {
        await window.ethereum.enable();
        web3.eth.getAccounts().then((accounts) => {
          setAddress(accounts[0]);
          updateBalance(accounts[0]);
          console.log(accounts);
        });
      } catch (error) {
        console.error(error);
      }
    } else {
      alert("Metamask extensions not detected!");
    }
    web3.eth.getChainId().then(console.log);
  };

  const updateBalance = async (fromAddress) => {
    await web3.eth.getBalance(fromAddress).then((value) => {
      setBalance(web3.utils.fromWei(value, "ether"));
    });
  };

  const changeNetwork = async () => {
    if (window.ethereum) {
      try {
        await window.ethereum.enable();
        window.ethereum._handleChainChanged({
          chainId: 0x1,
          networkVersion: 1,
        });
      } catch (error) {
        console.error(error);
      }
    }
  };

  return (
    <div className="App">
      <header className="App-header">
        {address ? (
          <>
            <p> Balance: {balance} </p>
          </>
        ) : null}
        <Button
          onClick={() => getUserAccount()}
          variant="contained"
          color="primary"
        >
          Connect your account
        </Button>
        <Button onClick={changeNetwork} variant="contained" color="primary">
          Switch to mainnet ethereum
        </Button>

      </header>
    </div>
  );
}

export default App;
Run Code Online (Sandbox Code Playgroud)

Nag*_*aba 27

如果用户没有添加所需的网络怎么办?这是一个尝试切换的扩展版本,否则将网络添加到 MetaMask:

const chainId = 137 // Polygon Mainnet

if (window.ethereum.networkVersion !== chainId) {
      try {
        await window.ethereum.request({
          method: 'wallet_switchEthereumChain',
          params: [{ chainId: web3.utils.toHex(chainId) }]
        });
      } catch (err) {
          // This error code indicates that the chain has not been added to MetaMask
        if (err.code === 4902) {
          await window.ethereum.request({
            method: 'wallet_addEthereumChain',
            params: [
              {
                chainName: 'Polygon Mainnet',
                chainId: web3.utils.toHex(chainId),
                nativeCurrency: { name: 'MATIC', decimals: 18, symbol: 'MATIC' },
                rpcUrls: ['https://polygon-rpc.com/']
              }
            ]
          });
        }
      }
    }
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以使用 Metamask 的 RPC API 的wallet_switchEthereumChain方法

访问:https ://docs.metamask.io/guide/rpc-api.html#wallet-switchethereumchain