Events

如何使用 ethers.js 監聽合約事件?

  • April 6, 2021

我需要監聽特定的合約事件,並在事件發出後執行一些任務。我沒有在 ethers.js 文件上找到合適的文件。

誰能告訴我如何使用 ethers.js 繼續監聽我的合約事件?

此答案假設您了解如何使用乙太幣連接到合約。

您的問題指定偵聽要發出的事件,並基於此執行任務。

這是 Ethers v5 文件的連結,我們將在下面進行擴展:https ://docs.ethers.io/v5/api/providers/provider/#Provider–events

(乙太坊 v4 在這里這裡

基本上,該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),你也可以把 an 掛on在它上面。是 v4 文件中的一個部分的連結,其中有一個範例(至少到目前為止,v5 文件中還沒有) - 向下滾動到“監聽事件”程式碼範例。它具有相同的格式,您可以為第一個參數傳遞事件名稱或過濾器,然後可以編寫一個函式回調作為第二個參數。這只會從contract.

引用自:https://ethereum.stackexchange.com/questions/87643