From 7fbcd56bb84db13ba3717eb1b658683404fa372e Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 12 Jul 2023 11:31:22 +0800 Subject: [PATCH] 1 --- server/web3bcspider/services/blockchain.js | 6 +++- .../web3bcspider/services/erc721_refresher.js | 29 +++++++++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/server/web3bcspider/services/blockchain.js b/server/web3bcspider/services/blockchain.js index eb589b0..1971693 100644 --- a/server/web3bcspider/services/blockchain.js +++ b/server/web3bcspider/services/blockchain.js @@ -60,7 +60,11 @@ class BlockChain extends BaseService { } async getPastEvents(contractName, eventName, ...args) { - return this.#bc[contractName + 'Instance'].getPastEvents(eventName, ...args); + return await this.#bc[contractName + 'Instance'].getPastEvents(eventName, ...args); + } + + async ownerOf721(contractName, tokenId) { + return await this.#bc[contractName + 'Instance'].methods.ownerOf(tokenId).call(); } } diff --git a/server/web3bcspider/services/erc721_refresher.js b/server/web3bcspider/services/erc721_refresher.js index cce5c36..ff7685d 100644 --- a/server/web3bcspider/services/erc721_refresher.js +++ b/server/web3bcspider/services/erc721_refresher.js @@ -89,14 +89,14 @@ class Erc721Refresher extends BaseService { while (true) { await this.bc.mustBeActive(); const oldBlockNumber = this.bc.getCurrBlockNumber(); - let oldOwner = await this.getOwner(); + let oldOwner = await this.getOwner(row['token_id']); while (oldBlockNumber + 8 > this.bc.getCurrBlockNumber()) { await utils.sleep(1000 + utils.randRange(0, 500)); } await this.bc.mustBeActive(); const newBlockNumber = this.bc.getCurrBlockNumber(); - let newOwner = await this.getOwner(); + let newOwner = await this.getOwner(row['token_id']); if (oldOwner == newOwner) { const ok = await this.updateConfirmed(newOwner, oldBlockNumber, row); @@ -110,10 +110,33 @@ class Erc721Refresher extends BaseService { } } await utils.sleep(1000 + utils.randRange(500, 1500)); - } } + async getOwner(tokenId) { + while (true) { + await this.bc.lockQuery(); + try { + let owner = await this.bc.ownerOf721(this.getContractName(), tokenId); + return owner; + } catch (err) { + const reason = utils.getVal(err, 'reason'); + if (reason == 'ERC721: owner query for nonexistent token') { + return ''; + } + if (err == 'Error: Returned error: VM Exception while processing transaction: revert ERC721: owner query for nonexistent token' || + err == 'Error: Returned error: execution reverted: ERC721: owner query for nonexistent token') { + return ''; + } + log.error(err); + } finally { + await this.bc.unlockQuery(); + } + await utils.sleep(5000 + utils.randRange(1500, 2500)); + } + } + + async updateConfirmed(newOwner, blockNumber, row) { const logHead = this.genLogHead('updateConfirmed '); const tokenId = row['token_id'];