etherjs TransactionReceipt 有事件对象吗?

问题描述 投票:0回答:2

在教程和 stackoverflow 答案中,经常会看到读取发出的事件数据的代码,如下所示:

let someTx = await contractRef.someFunc();
let txReceipt = await someTx.wait(1);

let eventData = txReceipt.events[0].topics[0]  
// or txReceipt.events[0].args.someData.toString()

两个问题:

  1. 事件对象如何添加到 TransactionReceipt 中? TransactionReceipt 上的 etherjs 文档 不包含事件对象。它仅包含

    logs
    属性。

  2. events[0].topics
    events[0].args
    有什么区别?

问题 1 的更新

仍在研究,但以太币来源显示以下内容: 接口 Event 扩展了 Log (ref),接口 TransactionReceipt 有一个 Log 数组 (ref) Event 是 Log 的子级,因此它实现了与 Log 相同的接口,但 TxReceipt 上仍然没有称为事件的属性。

所以 ethersjs 的文档与来源一致。

下一个问题是如何将名为

events
的属性添加到
TransactionReceipt
界面。

ethers.js hardhat
2个回答
3
投票

以太坊文档具有误导性,正如此处所讨论的:

events 属性仅在 ContractReceipt 上可用(请参阅文档),因为普通收据无法访问 ABI。

因此,在这种情况下不要期望

TransactionResponse
TransactionReceipt
,而是使用接口
ContractTransaction
ContractReceipt

喜欢:

const txResponse : ContractTransaction = await contract.method();
const txReceipt : ContractReceipt = await txResponse.wait();

0
投票

可以在wait()之前使用日志;

let someTx = await contractRef.someFunc();
let txReceipt = await someTx.wait(1);
const logs = txReceipt?.logs as EventLog[];
console.log(logs) // your all information about event and fields
© www.soinside.com 2019 - 2024. All rights reserved.