You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ethers.js中使用WalletConnect?无需迁移至Wagmi

如何在Ethers.js中使用WalletConnect实现指定链的连接/断开功能

完全可以直接通过WalletConnect核心库结合Ethers.js实现需求,无需迁移到Wagmi。以下是具体实现步骤:

1. 安装依赖

npm install @walletconnect/ethereum-provider ethers @web3modal/ethereum @web3modal/html

2. 定义支持的链

对应你需要的Arbitrum、以太坊主网、Polygon,配置链ID和基础信息:

const SUPPORTED_CHAINS = [
  {
    chainId: 1, // 以太坊主网
    name: "Ethereum Mainnet",
    rpcUrls: ["https://mainnet.infura.io/v3/你的Infura项目ID"],
    nativeCurrency: { name: "ETH", symbol: "ETH", decimals: 18 }
  },
  {
    chainId: 137, // Polygon主网
    name: "Polygon Mainnet",
    rpcUrls: ["https://polygon-rpc.com"],
    nativeCurrency: { name: "MATIC", symbol: "MATIC", decimals: 18 }
  },
  {
    chainId: 42161, // Arbitrum One
    name: "Arbitrum One",
    rpcUrls: ["https://arb1.arbitrum.io/rpc"],
    nativeCurrency: { name: "ETH", symbol: "ETH", decimals: 18 }
  }
];

3. 初始化WalletConnect Provider和Web3Modal

import { EthereumProvider } from "@walletconnect/ethereum-provider";
import { Web3Modal } from "@web3modal/html";
import { ethers } from "ethers";

// 初始化WalletConnect Provider
const provider = await EthereumProvider.init({
  projectId: "你的WalletConnect项目ID", // 需在WalletConnect控制台申请
  chains: SUPPORTED_CHAINS.map(chain => chain.chainId),
  showQrModal: false, // 禁用内置模态框,使用Web3Modal的UI
  methods: ["eth_sendTransaction", "personal_sign"],
  events: ["chainChanged", "accountsChanged"]
});

// 配置Web3Modal(匹配你提供的示例UI)
const web3Modal = new Web3Modal({
  projectId: "你的WalletConnect项目ID",
  ethereumClient: provider
});

4. 实现连接/断开逻辑

// 连接钱包
async function connectWallet() {
  try {
    await web3Modal.openModal();
    // 转换为Ethers.js可用的Provider
    const ethersProvider = new ethers.BrowserProvider(provider);
    // 获取已连接账户
    const accounts = await ethersProvider.listAccounts();
    console.log("已连接账户:", accounts);

    // 监听链切换,限制仅支持指定链
    provider.on("chainChanged", (chainId) => {
      const parsedChainId = parseInt(chainId, 16);
      const isSupported = SUPPORTED_CHAINS.some(chain => chain.chainId === parsedChainId);
      if (!isSupported) {
        alert("当前网络不支持,请切换到指定链");
        disconnectWallet();
      }
    });

    // 根据连接状态切换按钮显示
    document.querySelector("button[onclick='connectWallet()']").style.display = "none";
    document.querySelector("button[onclick='disconnectWallet()']").style.display = "inline-block";
  } catch (err) {
    console.error("连接失败:", err);
  }
}

// 断开钱包
async function disconnectWallet() {
  try {
    await provider.disconnect();
    await web3Modal.closeModal();
    console.log("已断开连接");

    // 恢复按钮显示
    document.querySelector("button[onclick='connectWallet()']").style.display = "inline-block";
    document.querySelector("button[onclick='disconnectWallet()']").style.display = "none";
  } catch (err) {
    console.error("断开失败:", err);
  }
}

5. UI按钮实现(匹配示例图)

<button onclick="connectWallet()">连接钱包</button>
<button onclick="disconnectWallet()" style="display: none;">断开连接</button>

注意事项

  • 需在WalletConnect控制台申请项目ID,替换代码中的占位符
  • 链的RPC URL可替换为自己的节点服务(如Infura、Alchemy)以提升稳定性
  • 链切换监听逻辑可根据需求调整提示方式,比如替换alert为自定义弹窗

内容的提问来源于stack exchange,提问作者user20922557

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:45:25