如何在 node.js 应用程序中使用 ethers.js contract.on() 监听来自智能合约的事件?

问题描述

我正在尝试在 node.js 应用程序中使用 ethers.js(而非 web3)侦听从 USDT 合约 Transfer 函数发出的事件。

当我运行脚本时,代码运行没有错误,然后快速退出。我希望得到事件日志。我不确定我错过了什么步骤。

我已经通过调用 getowner() 方法和控制台记录结果测试了这个脚本,这工作正常,所以我与主网的连接正常。

我正在使用 alchemy websocket。

我的 index.js 文件

const hre = require("hardhat");
const ethers = require('ethers');
const USDT_ABI = require('../abis/USDT_ABI.json')

async function main() {

const usdt = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
const provider = new ethers.providers.WebSocketProvider("wss://eth-mainnet.ws.alchemyapi.io/v2/gRR0KK-rRxTfSUdGd_g11RvpjrgCRN8a");
const contract = new ethers.Contract(usdt,USDT_ABI,provider)

contract.on('Transfer',(from,to,value) => console.log(from,value))

}

main()
  .then(() => process.exit(0))
  .catch(error => {
    console.error(error);
    process.exit(1);
  });

我的 hardhat.config.js 文件


    require("@nomiclabs/hardhat-waffle");
require('dotenv').config()

// This is a sample Hardhat task. To learn how to create your own go to
// https://hardhat.org/guides/create-task.html
task("accounts","Prints the list of accounts",async () => {
  const accounts = await ethers.getSigners();

  for (const account of accounts) {
    console.log(account.address);
  }
});

// You need to export an object to set up your config
// Go to https://hardhat.org/config/ to learn more

/**
 * @type import('hardhat/config').HardhatUserConfig
 */
 module.exports = {
  paths: {
    artifacts: './src/artifacts',},networks: {
    mainnet: {
      url: "wss://eth-mainnet.ws.alchemyapi.io/v2/gRR0KK-rRxTfSUdGd_g11RvpjrgCRN8aß",accounts: [`0x${process.env.PRIVATE_KEY}`]
    },hardhat: {
      chainId: 1337
    },solidity: "0.4.8"
};`

解决方法

我通过删除解决了这个问题

.then(() => process.exit(0))
  .catch(error => {
    console.error(error);
    process.exit(1);
  });

并且只是调用 main。在安全帽文档中建议使用 .then 和 .catch 代码,但是当运行像这个脚本使用 contract.on() 那样长时间运行的进程时,它会导致脚本退出。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...