求助:如何通过Alchemy RPC Provider实现Polygon dApp与Wallet Connect对接?
实现Wallet Connect与Alchemy Provider对接(Polygon链+ethers)
我们当前通过ethers库将dApp连接至Metamask,在Polygon主网进行交易操作,现需新增WalletConnect连接支持,但尝试以下两种方案均未成功:
方案一:使用@walletconnect/web3-provider
import WalletConnectProvider from "@walletconnect/web3-provider"; const provider = await new WalletConnectProvider({ rpc: { 137: 'https://polygon-mainnet.g.alchemy.com/v2/<OUR_ALCHEMY_RPC_PRIVATE_KEY>' }, chainId: 137 }); await provider.enable(); const eProvider = await new ethers.providers.Web3Provider(provider)
问题:扫码后provider.enable()无返回、无报错,连接无法建立。
方案二:使用@maticnetwork/walletconnect-provider
const WalletConnectProviderPolygon = require('@maticnetwork/walletconnect-provider') const wcProvider = new WalletConnectProviderPolygon({ host: 'https://polygon-mainnet.g.alchemy.com/v2/<OUR_ALCHEMY_RPC_PRIVATE_KEY>', callbacks: { onConnect: (res: any) => { console.log('onConnect', res) }, onDisconnect: (res: any) => { console.log('onDisconnect', res) } } }) // await alchemyProvider.createWebconnector() const eProvider = new ethers.providers.Web3Provider(wcProvider, 137)
问题:未显示连接弹窗;取消注释await alchemyProvider.createWebconnector()后,弹窗变形且无桌面选项,扫码后仍无法完成连接。
正确实现方案
1. 依赖安装
确保安装兼容版本的依赖:
npm install @walletconnect/web3-provider@1.8.0 ethers@5.7.2
(注:WalletConnect v2.x API与v1.x差异较大,此处采用稳定的v1.x版本适配ethers v5)
2. 完整代码实现
import WalletConnectProvider from "@walletconnect/web3-provider"; import { ethers } from "ethers"; async function connectWithWalletConnect() { try { // 初始化WalletConnect Provider const provider = new WalletConnectProvider({ rpc: { 137: "https://polygon-mainnet.g.alchemy.com/v2/<OUR_ALCHEMY_RPC_PRIVATE_KEY>", }, chainId: 137, // Polygon主网链ID qrcodeModalOptions: { mobileLinks: ["rainbow", "metamask", "trust"], // 指定支持的移动端钱包 }, }); // 监听连接事件 provider.on("connect", (info) => { console.log("WalletConnect连接成功", info); }); // 监听断开事件 provider.on("disconnect", (error) => { console.log("WalletConnect连接断开", error); }); // 触发连接弹窗 await provider.enable(); // 包装为ethers Provider const ethersProvider = new ethers.providers.Web3Provider(provider); const signer = ethersProvider.getSigner(); // 验证连接:获取当前账户地址 const address = await signer.getAddress(); console.log("当前连接账户:", address); return { ethersProvider, signer }; } catch (error) { console.error("WalletConnect连接失败:", error); throw error; } }
关键修复点
- 错误捕获:添加
try/catch捕获provider.enable()可能抛出的异常(比如用户取消扫码) - 事件监听:通过
connect/disconnect事件监控连接状态,避免因无返回值导致的阻塞感知问题 - 版本兼容:使用WalletConnect v1.x与ethers v5配套,v2.x需使用
@walletconnect/sign-client等新API,适配逻辑不同 - 弹窗配置:通过
qrcodeModalOptions显式指定移动端钱包,确保弹窗正常渲染
注意事项
- 替换
<OUR_ALCHEMY_RPC_PRIVATE_KEY>为你的Alchemy API密钥 - 若需支持WalletConnect v2,需重构代码使用其新的SDK
- 测试时确保前端环境允许弹窗弹出(浏览器弹窗权限需开启)
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

