首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何触发EthersJS *.on事件?

如何触发EthersJS *.on事件?
EN

Stack Overflow用户
提问于 2022-02-24 20:32:23
回答 1查看 581关注 0票数 1

我正在使用redux开发一个react应用程序。我确实实施了以下几个步骤:

instance

  • Register provider

  • Register
  1. 创建web3modal web3modal a ethersjs

每件事都是非常基本和简单的。然而,每当我尝试使用on事件(不管提供者是否签订合同),它们都不会触发。

我有两个档案:

  1. walletSlice.ts,它将处理所有的还原操作,并使用@reduxjs/toolkit .
  2. wallet-api.ts处理还原器逻辑,后者具有与钱包交互的所有相关功能。

walletSlice.ts相关部分看起来就像这样:

代码语言:javascript
复制
export const connectWallet = createAsyncThunk(
  'web3wallet/connectWallet',
  async (arg, thunkApi) => {
    const instance = await WalletAPI.registerWalletInstance();
    provider = await WalletAPI.registerWalletProvider(instance);
    signer = await WalletAPI.registerWalletSigner(provider);
   
    return Promise.resolve();
  }
);

wallet-api.ts相关部分的外观如下所示:

代码语言:javascript
复制
import { ethers, providers } from 'ethers';
import Web3Modal from 'web3modal';

// get Web3Modal Instance
export async function registerWalletInstance(): Promise<Web3Modal> {
  const providerOptions = {};

  const web3Modal = new Web3Modal({
    providerOptions,
  });
  const instance = await web3Modal.connect();

  return Promise.resolve(instance);
}

/**
 * register Wallet provider.
 * Events on provider @see https://docs.ethers.io/v5/api/providers/provider/#Provider--event-methods
 * Implementing the EIP-1193 Standard @see https://eips.ethereum.org/EIPS/eip-1193
 */
export async function registerWalletProvider(
  instance: any
): Promise<providers.JsonRpcProvider> {
  const provider = new ethers.providers.Web3Provider(instance);

  // Subscribe to accounts change
  provider.on('accountsChanged', (accounts: string[]) => {
    console.log(accounts);
  });

  // Subscribe to chainId change
  provider.on('chainChanged', (chainId: number) => {
    console.log(chainId);
  });

  // Subscribe to provider connection
  provider.on('connect', (info: { chainId: number }) => {
    console.log(info);
  });

  // Subscribe to provider disconnection
  provider.on('disconnect', (error: { code: number; message: string }) => {
    console.log(error);
  });

  provider.on('error', (tx) => {
    // Emitted when any error occurs
    console.log({ tx });
  });

  return Promise.resolve(provider);
}

// register Wallet signer.
export async function registerWalletSigner(
  provider: providers.JsonRpcProvider
): Promise<providers.JsonRpcSigner> {
  const signer = provider.getSigner();
  return Promise.resolve(signer);
}

所有provider.on()事件都不会触发。我曾试图将网络从rinkeby改为polygonmainnet,但什么也没有发生。当我与网站断开连接时,什么都不会发生。所有提供程序事件都是一样的,如wallet-api.ts所示。我对另一个名为contract-api.ts的文件尝试了同样的方法。然而,合同事件也不会触发。

我尝试将provider.on()事件与useEffect()useCallback()结合使用。将代码移动到独立的tsx。但什么都没发生。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-25 08:29:37

await web3Modal.connect()已经返回一个提供程序;尝试使用该提供程序而不是new ethers.providers.Web3Provider(instance);

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71257916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档