Web3 sendSignedTransaction Costo de transacción

Soy nuevo en el mundo Ethereum. Acabo de lograr crear un ejemplo que calcula la tarifa de transacción y envía una transacción firmada sin contrato utilizando la biblioteca Web3js.

Mi problema es que mi cuenta de prueba se está quedando sin saldo bastante rápido. Debo estar haciendo algo mal. Hice esta transacción: https://kovan.etherscan.io/tx/0x5cb10c454d8d331e35ba3812522ea9cd5b82fdb7ecde75c5b48ec1550d99cc98

Si ves los detalles:

Value: 0.000106 Ether ($0.00) 
Gas Limit: 21000 
Gas Used By Txn: 21000 
Gas Price: 0.000106 Ether (106,000 Gwei) 
Actual Tx Cost/Fee: 2.226 Ether ($0.000000)

¡Veo que la tarifa de transacción real es 2.226 Ether!

Estoy calculando la tarifa de transacción de la siguiente manera:

var transactionObject = {
  from: sender,
  value: amount
}
w3.eth.estimateGas(transactionObject, function(error, gas) {
  w3.eth.getGasPrice(function (error, gasPrice) {
    var gasPrice = Number(gasPrice);
    var transactionFee = gasPrice * gas;
    console.log(transactionFee);
 })
});

Entonces esta tarifa de transacción, la estoy usando en mi transacción:

w3.eth.getBalance(sender, function(error, balance) {
  if (balance < (transactionFee + transactionValue)) {
    reject("You don't have enough balance to cover this transaction");
  } else {
    w3.eth.getTransactionCount(sender).then(function(count) {
      var transactionObject = {
        nonce: w3.utils.toHex(count),
        from: sender,
        to: receiver,
        gasPrice: w3.utils.toHex(transactionFee),
        value: w3.utils.toHex(transactionValue),
        data: ''
      }
      w3.eth.estimateGas(transactionObject, function (error, gas) {
        transactionObject.gasLimit = gas;
        var tx = new Tx(transactionObject);
        tx.sign(privateKey);
        var serializedTx = tx.serialize();
        w3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'), function (error, result) {
          if(!error) {
            resolve(result);
          } else {
            reject(error)
          }
        })
      });
    }).catch(function(error) {
      reject(error);
    });
  }
})

¿Estoy asignando incorrectamente un valor o me falta alguna conversión?

¿Ha considerado convertir explícitamente el gas a wei? Parece que los está tomando como éteres.
@ranchalp, ¿te refieres a cambiar esta línea: gasPrice: w3.utils.toHex(transactionFee) a gasPrice: w3.utils.toHex(w3.utils.toWeis(transactionFee))?
parece que va por buen camino... el precio de la gasolina de 106 000 Gwei es 1000 veces más alto de lo normal

Respuestas (1)

Encontré el problema, estaba pasando a:

gasPrice: w3.utils.toHex(transactionFee)

Toda la tarifa: gas * gasPrice. Eso provocó que internamente mi tarifa de transacción se multiplicara nuevamente por el gas.

Necesito pasar:

gasLimit: w3.utils.toHex(gas),
gasPrice: w3.utils.toHex(gasPrice)
Sí, pero debería ser gas:en lugar de gasLimit:.