Задать вопрос
@ff3446r3e

Как правильно обновлять переменную в асинхронной функции, которая запускается в цикле?

async function mintNFT(tokenURI) {
  const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest");   //the transaction
  const tx = {
    from: PUBLIC_KEY,
    to: contractAddress,
    nonce: nonce,
    gas: 500000,
    data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),
  };
  const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY);
  signPromise
    .then((signedTx) => {
      web3.eth.sendSignedTransaction(
        signedTx.rawTransaction,
        function (err, hash) {
          if (!err) {
          } else {
            console.log(
              "Something went wrong when submitting your transaction:",
              err
            );
          }
        }
      );
    })
    .catch((err) => {
      console.log("Promise failed:", err);
    });
}

Если я ее запускаю просто, то все работает прекрасно mintNFT(https://ipfs.io/ipfs/cid/0" );
Но если я ее запускаю в цикле, то первая итерация проходит нормально, но дальше идет ошибка
for (let i = 0; i < 10; i++) {
  mintNFT(
    "https://ipfs.io/ipfs/QmNuaSePp3TGcRncBQdHJgUUPGsPaz5fLV57vBXq8jBpQ4/" + i
  );
}


Error: Returned error: replacement transaction underpriced
    at Object.ErrorResponse (/home/ff/Projects/contract/node_modules/web3-core-helpers/lib/errors.js:28:19)
    at /home/ff/Projects/contract/node_modules/web3-core-requestmanager/lib/index.js:302:36
    at /home/ff/Projects/contract/node_modules/@alch/alchemy-web3/dist/cjs/util/promises.js:28:9
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  data: null
}


При чем, каждый раз при запуске функция, строчка nonce(счетчик транзакций) в tx изменяется на один.
x - текущее число транзакций Если я запускаю функцию в цикле, то во время первой итерации nonce = x+1,
в последующих nonce равняется nonce из первой итерации, хотя должен быть на один больше каждую итераци.

Ошибка как раз в этом, nonce неправильно обновляется. Если я сам поменяю nonce на 10(с таким номером транзакция уже была), то та же самая ошибка. Но если поставить на один больше последней транзакиции(30, например), то ошибки нет.

Просто вынести
const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest")
и потом прибавлять один каждую итерацию нельзя, потому что так она не успевает сделать запрос, и в итоге
nonce = Promise { <pending> } и вылетает та же ошибка. Даже если я запускаю без цикла
  • Вопрос задан
  • 108 просмотров
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы