Estoy tratando de enviar una transacción sin procesar usando web3 para ropsten testnet y recibo este error:
transacción de reemplazo infravalorada
donde a veces mi tx funciona y a veces me sale este error.
mis parámetros tx:
const nonce = web3.eth.getTransactionCount(ethereumConfig.contract.account)
const block = web3.eth.getBlock("latest")
const gasLimit = block.gasLimit
const gasPrice = web3.eth.gasPrice.toNumber() * 1.40
tenga en cuenta que ya estoy agregando un 40% a gasPrice
También me he encontrado con este problema. La red cree que está tratando de reemplazar una transacción no minada existente. Hay dos formas de evitar esto:
También he estado recibiendo este error:
"La transacción no se extrajo dentro de los 50 bloques, asegúrese de que su transacción se envió correctamente. ¡Tenga en cuenta que aún podría ser extraída!"
En mi caso, creo que la transacción se está quedando atrapada en el limbo de alguna manera. No está siendo minado por nadie, pero no está siendo eliminado del grupo de transacciones no minadas. Tenga en cuenta que web3.eth.getTransactionCount(walletAddress)
solo le dará el último nonce CONFIRMADO. Por lo tanto, no tendrá en cuenta los no minados.
Quieres:
El mensaje de error implica que está intentando reemplazar una transacción pendiente. Esto se debe a que la transacción sin procesar que intenta enviar es igual nonce
a otra transacción que tiene pendiente.
Dado que reemplazar una transacción no es su objetivo, simplemente aumente el nonce para que sea uno más alto que su última transacción pendiente. Es posible que deba realizar un seguimiento de esto internamente, en lugar de depender de web3.eth.getTransactionCount()
.
Dado que su objetivo es reemplazar una transacción que está pendiente, debe intentar convencer a los mineros para que usen su nueva transacción. Para ello, debe utilizar un precio de gasolina un 10% superior* al gasPrice
de la transacción pendiente .
const gasPrice = web3.eth.gasPrice.toNumber() * 1.40
tenga en cuenta que ya estoy agregando un 40% a gasPrice
El código citado agrega un 40% a web3.eth.gasPrice
. Este no puede ser un 10% más alto que el precio del gas de la transacción pendiente. web3.eth.gasPrice
puede variar con el tiempo y/o es posible que haya establecido un precio de gasolina arbitrario en la transacción pendiente.
* El 10% no está definido en el protocolo, así es como lo implementan la mayoría de los nodos y mineros.
Si tiene el hash de la transacción pendiente, puede determinar el precio del gas requerido con algo como:
replacement_price = web3.eth.getTransaction(pending_txn_hash).gasPrice * 1.101
Tenga en cuenta que se trata de matemáticas de coma flotante, que tendrán errores de redondeo, por lo que añadí una décima de porcentaje adicional para asegurarme de que estaba por encima del mínimo.
He visto esto cuando llamo al mismo método de contrato dos veces desde JavaScript sin esperar a que termine la primera llamada await
o llamando por segunda vez en la devolución de llamada exitosa.
Supongo que los métodos de contrato en web3js no son seguros para subprocesos.
Estoy usando Ganache y MetaMask de repente dejó de manejar transacciones, puso en cola la primera y cada llamada subsiguiente no devolvería nada o "transacción subvaluada". He aquí cómo resolverlo:
Si eso no ayuda, intente reinstalar MetaMask.
Aniket
ernane luis