game2006market/server/web3helper/services/exec_confirm_owner.js
2022-04-23 08:34:16 +08:00

170 lines
4.0 KiB
JavaScript

const bcutils = require('j7/bcutils');
const utils = require('j7/utils');
const app = require('j7/app');
const log = require('j7/log');
const event = require('j7/event');
const bc = require('../blockchain');
const C = require('../C');
class ExecConfirmOwner {
async init(tokenId) {
try {
this.tryCount = 1;
this.tokenId = tokenId;
this.nftDb = await this.getNftDb(tokenId);
if (!this.nftDb) {
return;
}
this.addTryCount();
await this.doConfirm();
} catch (err) {
log.error('ExecConfirmOwner:' + this.tokenId + ' err:' + err);
} finally {
this.destory();
}
}
destory() {
event.emitEvent(C.DESTORY_EXEC_CONFIRM_OWNER_EVENT, this.tokenId);
}
addTryCount() {
++this.tryCount;
}
async doConfirm() {
while (true) {
await bc.mustBeActive();
const oldTryCount = this.tryCount;
const oldBlockNumber = bc.getCurrBlockNumber();
let oldOwner = await this.getOwner();
while (oldBlockNumber + 8 > bc.getCurrBlockNumber()) {
await utils.sleep(1000 + utils.randRange(0, 500));
}
await bc.mustBeActive();
const newBlockNumber = bc.getCurrBlockNumber();
let newOwner = await this.getOwner();
if (oldOwner == newOwner) {
const ok = await this.updateConfirmed(newOwner, oldBlockNumber);
if (ok && oldTryCount == this.tryCount) {
break;
}
}
await utils.sleep(1000 + utils.randRange(500, 1500));
}
}
getInstanceName() {
switch (this.nftDb['token_type']) {
case bcutils.HERO_TYPE:
{
return 'heroInstance';
}
break;
case bcutils.EQUIP_TYPE:
{
return 'equipInstance';
}
break;
case bcutils.CHIP_TYPE:
{
return 'chipInstance';
}
break;
case bcutils.BLIND_BOX_TYPE:
{
return 'luckboxInstance';
}
break;
}
}
async getNftDb(tokenId) {
const {err, conn} = await app.getDbConn('MarketDb0');
if (err) {
return null;
}
try {
const {err, row} = await conn.ormSelectOne(
't_nft',
[
['token_id', tokenId]
]);
return row;
} finally {
conn.release()
}
}
async getOwner() {
const instanceName = this.getInstanceName();
log.info('getOwner:' + instanceName +
' tryCount:' + this.tryCount +
' token_id:' + this.tokenId);
while (true) {
await bc.lockQuery();
try {
let owner = await bc[instanceName].methods.ownerOf(this.tokenId).call();
return owner;
} catch (err) {
const reason = utils.getVal(err, 'reason');
if (reason == 'ERC721: owner query for nonexistent token') {
return '';
}
log.error(err);
} finally {
await bc.unlockQuery();
}
await utils.sleep(5000 + utils.randRange(1500, 2500));
}
}
async updateConfirmed(newOwner, blockNumber) {
const {err, conn} = await app.getDbConn('MarketDb0');
if (err) {
log.error('updateConfirmed:' + this.tokenId + ' err:' + err);
return false;
}
try {
{
const {err} = await conn.update(
't_nft',
[
['token_id', this.tokenId]
],
[
['owner_address', bcutils.toNormalAddress(newOwner)],
['confirm_count', this.nftDb['confirm_count'] + 1],
['confirm_block_number', blockNumber]
]);
if (err) {
log.error('updateConfirmed:' + this.tokenId + ' err:' + err);
return false;
}
}
{
const {err} = await conn.execScript(
'UPDATE t_nft_transfer SET `owner_confirmed`=1 ' +
'WHERE token_id=? AND block_number < ?',
[
this.tokenId,
blockNumber
]);
if (err) {
log.error('updateConfirmed:' + this.tokenId + ' err:' + err);
return false;
}
}
} finally {
conn.release()
}
return true;
}
}
module.exports = ExecConfirmOwner;