Как обработать ошибку, вызванную «_fireError» в web3.js?

Я пытался поймать ошибку, выдаваемую web3.js во время вызова функции в моем смарт-контракте. Это код, который я использую для вызова функции:

                      contract.methods.mintBatch(quantity, data.nonce, data.hash, data.signature, data.nftIds, 1).send({ from: walletId, value: res * quantity }, (err: any, res: any) => {
                  if (err) {
                    console.error('mintBatch failed, error: ', err);
                    reject();
                  }
                  else {
                    console.log('mintBatch succeed, res: ', res);
                    resolve({
                      txHash: res,
                      nftIds: data.nftIds
                    });
                  }
                })

И это функция, которую я использую для отслеживания статуса транзакции:

        function checkIfTransactionProceed(txHash: string) {
    return new Promise<void>(async (resolve, reject) => {
      var receipt = null;
      var counter = 0;
      try {
        while ((receipt = await web3.eth.getTransactionReceipt(txHash)) === null) {
          if (counter++ > 300) {
            break;
          }
          await new Promise<void>(resolve2 => {
              setTimeout(() => {
                  resolve2();
              }, 1000);
          });
        }
        if (receipt && (receipt.status === true)) {
          resolve();
        }
        else {
          reject();
        }
      }
      catch(err) {
        console.error('web3.eth.getTransactionReceipt failed, error: ', err);
        reject();
      }
    })
  }

Второй работает отлично, и при сбое транзакции выдает ошибку. Но сразу после того, как выдается эта ошибка, мой интерфейс реакции выдает это:

      Unhandled Runtime Error
Error: Transaction has been reverted by the EVM:
{
  "blockHash": "0x2d7a0a4e5469e68250eaee0c52eb80559d6f9e2a8873ab4f7b2f47e5e9b973b3",
  "blockNumber": 11284056,
  "contractAddress": null,
  "cumulativeGasUsed": 368714,
  "effectiveGasPrice": 2500000009,
  "from": "somewhere",
  "gasUsed": 76047,
  "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  "status": false,
  "to": "somewhere else",
  "transactionHash": "a random transaction hash",
  "transactionIndex": 2,
  "type": "0x2",
  "events": {}
}

Отслеживая ошибку, кажется, что ошибка исходит от функции, называемой_fireErrorвнутри web3.js.

      var _fireError = function (error, emitter, reject, callback, optionalData) {
    /*jshint maxcomplexity: 10 */
    // add data if given
    if (!!error && typeof error === 'object' && !(error instanceof Error) && error.data) {
        if (!!error.data && typeof error.data === 'object' || Array.isArray(error.data)) {
            error.data = JSON.stringify(error.data, null, 2);
        }
        error = error.message + "\n" + error.data;
    }
    if (typeof error === 'string') {
        error = new Error(error);
    }
    if (typeof callback === 'function') {
        callback(error, optionalData);
    }
    if (typeof reject === 'function') {
        // suppress uncatched error if an error listener is present
        // OR suppress uncatched error if an callback listener is present
        if (emitter &&
            (typeof emitter.listeners === 'function' &&
                emitter.listeners('error').length) || typeof callback === 'function') {
            emitter.catch(function () { });
        }
        // reject later, to be able to return emitter
        setTimeout(function () {
            reject(error);
        }, 1);
    }
    if (emitter && typeof emitter.emit === 'function') {
        // emit later, to be able to return emitter
        setTimeout(function () {
            emitter.emit('error', error, optionalData);
            emitter.removeAllListeners();
        }, 1);
    }
    return emitter;
};

Может ли кто-нибудь дать мне знать, как поймать эту ошибку? С моей стороны он не запускает ловушку, и сообщение «mintBatch failed» тоже не отображается.

0 ответов

Другие вопросы по тегам