我需要侦听特定的契约事件,并在事件发出后执行一些任务。我没有在ethers.js文档中找到合适的文档。
有人能告诉我如何继续使用ethers.js监听我的合同事件吗?
发布于 2020-09-22 11:15:26
此答案假设您了解如何使用以太连接到合同。
您的问题指定侦听要发出的事件,并在此基础上执行任务。
下面是到以太v5文档的链接,我们将在下面对其进行一些扩展:https://docs.ethers.io/v5/api/providers/provider/#Provider--events
基本上,on函数就是您要寻找的东西。使用提供程序,您可以在发出特定事件时设置一个on来触发某个事件。这将在区块链上发出事件时触发回调( on中的第二个参数,函数)。如果您只希望在调用特定契约的事件时才触发on,则需要使用筛选器--在从任何契约发出此事件时,提供者将触发回调。
如果您查看上面链接到v5文档的示例(至少现在是22/09/2020),下面是如何使用过滤器的示例(一般过滤器或主题过滤器--我们将讨论第一个例子)。基本上:
filter = {
address: THE_ADDRESS_OF_YOUR_CONTRACT,
topics: [
// the name of the event, parnetheses containing the data type of each event, no spaces
utils.id("Transfer(address,address,uint256)")
]
}
provider.on(filter, () => {
// do whatever you want here
// I'm pretty sure this returns a promise, so don't forget to resolve it
})关于如何以及如何在上面的链接中过滤哪些内容,还有更多的细节,但是这是基本的构建块。我希望这能帮到你!
更新:基于一条评论,我想我应该补充一下,on也可以与一个contract一起使用。如果您有一个表示契约的变量(我们称之为contract),您也可以将一个on连接到它上。这里's链接到v4文档中的一个部分,其中有一个示例(至少目前还没有在v5文档中)--向下滚动到“侦听事件”代码示例。它的格式与为第一个arg传递事件名称或筛选器的格式相同,然后可以将函数回调作为第二个。这只会从contract返回事件。
发布于 2021-04-06 06:51:59
// ERC-20中的事件:传输(地址索引src,地址索引dst,uint val)
contract.on("Transfer", (to, amount, from) => {
console.log(to, amount, from);
});你可以在这里读到:https://docs.ethers.io/v5/api/contract/contract/#Contract--events
这里也有很好的例子:https://docs.ethers.io/v5/concepts/events/
以及更多信息的讨论主题:https://github.com/ethers-io/ethers.js/issues/492
https://ethereum.stackexchange.com/questions/87643
复制相似问题