Как правильно установить одноразовый номер в вызове контракта web3?

У меня есть этот код, который работает:

MyToken.airdrop(wallets,amounts,{
  gas: 1267051,
  gasPrice: 2000000000,
},function(err,tx){
  console.log('err is %s',err)
  console.log('tx is %s',tx)
  callback(err,tx)
})

Теперь предположим, что я хочу контролировать nonceсебя ( причина здесь ), поэтому я делаю:

MyToken.airdrop(wallets,amounts,{
  gas: 1267051,
  gasPrice: 2000000000,
  nonce: 432 // = web3.eth.getTransactionCount() + 1
},function(err,tx){
  console.log('err is %s',err)
  console.log('tx is %s',tx)
  callback(err,tx)
})

Я получаю хэш tx в качестве вывода, а не ошибку , но транзакция не может быть найдена на соответствующем etherscan, кажется, она никогда не отправляется в сеть. Пробовал на Ринкеби, Ропстене и Коване.

В чем может быть проблема с указанием nonceсебя или того, как я это делаю?

Примечание. Я использую infuraкак «узел».

Ответы (1)

По-видимому, есть нюанс с одноразовым номером... моя ошибка заключалась в том, что я установил одноразовый номер на web3.eth.getTransactionCount() + 1, что оставило разрыв между одноразовым номером предыдущей транзакции и одноразовым номером следующей транзакции ( одноразовые номера индексируются 0, транзакции индексируются от 1 , это корень ошибки). Получается, что вам не разрешено увеличивать одноразовый номер на 2 и оставлять пробел. Должен быть последовательным.

Вам разрешено отправлять tx со слишком большим одноразовым номером, но он не будет добыт, пока не будет заполнен пробел. И вы должны доверять майнерам, чтобы они сохраняли транзакцию с высоким одноразовым номером в своем пуле транзакций, пока вы заполняете пробел.
Хороший улов! не знал о несоответствии в индексации.
было бы здорово увидеть рабочий код в вашем ответе.