diff --git a/packages/bitcore-wallet-service/src/lib/chain/eth/index.ts b/packages/bitcore-wallet-service/src/lib/chain/eth/index.ts index 449acb103b6..8556af417a5 100644 --- a/packages/bitcore-wallet-service/src/lib/chain/eth/index.ts +++ b/packages/bitcore-wallet-service/src/lib/chain/eth/index.ts @@ -649,7 +649,15 @@ export class EthChain implements IChain { return cb(null, 0); } - refreshTxData(_server: WalletService, txp, _opts, cb) { - return cb(null, txp); + refreshTxData(server: WalletService, txp, opts, cb) { + // set latest nonce + server._getTransactionCount(opts.wallet, txp.from, (err, nonce) => { + if (err) return cb(err); + if (!Number(nonce)) { + return cb(new Error('Nonce is not a number')); + } + txp.nonce = nonce; + return cb(null, txp); + }); } } diff --git a/packages/bitcore-wallet-service/src/lib/server.ts b/packages/bitcore-wallet-service/src/lib/server.ts index 455a2872065..552b9c48e4b 100644 --- a/packages/bitcore-wallet-service/src/lib/server.ts +++ b/packages/bitcore-wallet-service/src/lib/server.ts @@ -2655,6 +2655,10 @@ export class WalletService implements IWalletService { // SOL is skipped since its a non necessary field that is expected to be provided by the client. if (!opts.nonce && !Constants.SVM_CHAINS[wallet.chain.toUpperCase()]) { try { + if (Constants.EVM_CHAINS[wallet.chain.toUpperCase()]) { + // if nonce mangement is done by BWS, default to refreshing nonce on txp publish + opts.refreshOnPublish = true; + } opts.nonce = await ChainService.getTransactionCount(this, wallet, opts.from); } catch (error) { return next(error); @@ -2897,6 +2901,7 @@ export class WalletService implements IWalletService { ChainService.checkTxUTXOs(this, txp, opts, err => { if (err) return cb(err); txp.status = 'pending'; + opts.wallet = wallet; ChainService.refreshTxData(this, txp, opts, (err, txp) => { if (err) return cb(err); if (txp.isRepublishEnabled() && !txp.prePublishRaw) { @@ -3162,7 +3167,8 @@ export class WalletService implements IWalletService { if (txp.signingMethod === 'schnorr' && !opts.supportBchSchnorr) return cb(Errors.UPGRADE_NEEDED); - if ([...Object.keys(Constants.EVM_CHAINS), 'XRP'].includes(wallet.chain.toUpperCase())) { + // Validate nonces only if they are not reset on signing via a re-publish + if ([...Object.keys(Constants.EVM_CHAINS), 'XRP'].includes(wallet.chain.toUpperCase()) && !txp.isRepublishEnabled()) { try { const txps = await this.getPendingTxsPromise({}); for (let t of txps) {