Web3js
是否可以檢查契約是否有事件?
我正在遍歷不同的塊,目的是找到部署 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.encodeEventSignature
為w3.eth.abi.encodeFunctionSignature
您可能要檢查的事情:
- EIP-165:標準介面檢測,因為它在 ERC-721 中被廣泛使用(注意,所有實現 ERC-721 方法的合約可能都沒有實現 ERC-165
supportsInterface
方法)- 對於您的具體使用,除了檢查事件之外,您還應該檢查您想要的方法是否已實現(ERC-721,查看方法)
祝你的項目好運!
免責聲明:我不會說流利的英語(我盡力而為),我也不是智能合約專家,只是一個隨機的加密愛好者