在教程和 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()
两个问题:
事件对象如何添加到 TransactionReceipt 中? TransactionReceipt 上的 etherjs 文档 不包含事件对象。它仅包含
logs
属性。
events[0].topics
和events[0].args
有什么区别?
问题 1 的更新
仍在研究,但以太币来源显示以下内容: 接口 Event 扩展了 Log (ref),接口 TransactionReceipt 有一个 Log 数组 (ref) Event 是 Log 的子级,因此它实现了与 Log 相同的接口,但 TxReceipt 上仍然没有称为事件的属性。
所以 ethersjs 的文档与来源一致。
下一个问题是如何将名为
events
的属性添加到 TransactionReceipt
界面。
以太坊文档具有误导性,正如此处所讨论的:
events 属性仅在 ContractReceipt 上可用(请参阅文档),因为普通收据无法访问 ABI。
因此,在这种情况下不要期望
TransactionResponse
和 TransactionReceipt
,而是使用接口 ContractTransaction
和 ContractReceipt
。
喜欢:
const txResponse : ContractTransaction = await contract.method();
const txReceipt : ContractReceipt = await txResponse.wait();
可以在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