Web3js

是否可以檢查契約是否有事件?

  • November 4, 2021

我正在遍歷不同的塊,目的是找到部署 nft 的每個塊。我計劃通過檢查 openzepplines ERC721 事件來做到這一點。如何檢查合約是否有事件?謝謝!

const Web3 = require('web3');

class TransactionChecker {
   web3;
   account;

   constructor(account) {
       //this.web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:3232'));
       this.web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
       this.account = account.toLowerCase();
   }

   async checkBlock() {
       let latestBlock = await this.web3.eth.getBlock('10861675');
       let latestNumber = latestBlock.number;
       let contractNumber = 0;
       for (let i = 10861673; i <= latestNumber; i++) {
           let block = await this.web3.eth.getBlock(i);
           let number = block.number;
           if (block != null && block.transactions != null) {
               for (let txHash of block.transactions) {
                   let tx = await this.web3.eth.getTransactionReceipt(txHash);
                   if (tx != null) {
                       let contract = tx.contractAddress;
                       if (contract != null) {
                           console.log("Contract found on block: " + number);
                           console.log(contract);
                           console.log(contractNumber);
                           contractNumber++;
                           if (contract.events != null) {
                               console.log(contract.allEvents);
                           }
                       }
                   }
               }
           }
       }
   }
}

以下是我為實現目標而採取的路線。

if (contract.events != null) {
 console.log(contract.allEvents);
}

是的你可以 !

我最近找到了一種方法,可以查看合約是否有某種方法(找不到連結,對不起),事件幾乎相同。(我相信交易收據中沒有events數組)。我相信您實際上無法獲得某個合約的事件列表,事件隱藏在合約的字節碼中,您需要檢查特定事件。這是功能:

async function contractHasEvent(contractAddress, eventSignature) {
   // client is the Web3 instance
   const contractCode = await client.eth.getCode(contractAddress);
   const eventSignature = client.eth.abi.encodeEventSignature(eventSignature);
   const hasEvent = code.indexOf(eventSignature.slice(2, eventSignature.length)) > 0;
   return hasEvent;
}

事件簽名就是這種形式EventName(argumentTypeOne,argumentTypeTwo,...)。請注意,參數類型之間沒有空格。例如,我相信你在 ERC-20 或 ERC-721 代幣中有這個轉移事件:Transfer(address,address,uint256).

對於 ERC-721,你需要檢查合約是否有這些事件:

  • Transfer(address,address,uint256)
  • Approval(address,address,uint256)
  • ApprovalForAll(address,address,bool)

如果你想檢查一個合約是否有方法,你可以創建一個類似的函式,然後替換client.eth.abi.encodeEventSignaturew3.eth.abi.encodeFunctionSignature

您可能要檢查的事情

  • EIP-165:標準介面檢測,因為它在 ERC-721 中被廣泛使用(注意,所有實現 ERC-721 方法的合約可能都沒有實現 ERC-165supportsInterface方法)
  • 對於您的具體使用,除了檢查事件之外,您還應該檢查您想要的方法是否已實現(ERC-721,查看方法)

祝你的項目好運!

免責聲明:我不會說流利的英語(我盡力而為),我也不是智能合約專家,只是一個隨機的加密愛好者

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