Define the Goal
Do you want to:
- Send a new transaction, after all your previous transactions have completed, or...
- Replace a pending (unmined) transaction, with the new raw transaction.
Send a New Transaction
The error message implies that you're trying to replace a pending transaction. That's because the raw transaction you're trying to send has the same nonce
as another transaction that you have pending.
Since replacing a transaction is not your goal, simply increase the nonce to be one higher than your last pending transaction. You may need to track this internally, rather than relying on web3.eth.getTransactionCount()
.
Replace a Pending Transaction
The 10% Minumum
Since your goal is to replace a transaction that is pending, you must try to convince the miners to use your new transaction. To do that, you must use a gas price that is 10% higher* than the gasPrice
of the pending transaction.
const gasPrice = web3.eth.gasPrice.toNumber() * 1.40
note I'm already adding 40% to gasPrice
The quoted code adds 40% to web3.eth.gasPrice
. This may not be 10% higher than the pending transaction's gas price. web3.eth.gasPrice
may vary over time, and/or you might have set any arbitrary gas price on the pending transaction.
* 10% isn't defined in the protocol, it's just how most nodes & miners implement it.
Determining the Minimum
If you have the hash of the pending transaction, you can determine the required gas price with something like:
replacement_price = web3.eth.getTransaction(pending_txn_hash).gasPrice * 1.101
Note that this is floating point math, which will have rounding errors, so I threw in an extra 10th of a percent to be sure it was over the minimum.