Javascript

您如何解決和結束 ethers.js 中的待處理事務檢查?

  • October 26, 2021

我有以下程式碼掃描待處理的交易池,直到找到我的錢包:

var scanTxPool = async () => {
   var myWallet = '0x0000000000000000000000000000000000000000';
   var foundWallet = false;
   provider.on("pending", async (txHash) => {
       if (!foundWallet) {
           provider.getTransaction(txHash).then(async (tx) => {
               if (tx && tx.to) {
                   if (tx.from === myWallet) {
                       console.log('Found my wallet!');
                       foundWallet = true;
                   }
               }
           });
       }
   });
   // do other stuff 
}

程式碼執行良好,但我有兩個問題:

  1. 當掛起的事務在後台執行時,執行繼續“做其他事情”。如何確保在執行其他操作之前等待待處理的事務檢查?
  2. 一旦從我設置的交易雜湊中找到我的錢包foundWallettrue檢查!foundWallet就會阻止它呼叫getTransaction(txHash). 但是,掛起的 txHash 檢查仍然無限期地執行。一旦滿足我的條件,我如何才能乾淨地結束待處理的交易檢查?

編輯:請在 ethers-io repo 中查看 zemse 的解決方案,該解決方案仍然對我不起作用:https ://github.com/ethers-io/ethers.js/discussions/2176#discussioncomment-1487598

你這個概念有點不對。 provider.on("pending", ...)被稱為偵聽器,它應該被稱為全域。所以它會監聽pending交易,當找到交易時,它會通過執行作為第二個參數傳遞的函式來通知你。

const completion = (tx) => {
  /* do some stuff */
}

const checkTxHash = async (txHash) => {
   const tx = await provider.getTransaction(txHash)
   if (!tx || !tx.to) return

   if (tx.from === myWallet) {
       console.log('Found my wallet!')
       provider.removeAllListeners()
       completion(tx)
    }
             
}

provider.on("pending", checkTxHash);

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