Wie kann ich das Gas / den Wert für das Senden einer Transaktion mit web3.js richtig einstellen?

Mein Code ist:

function sendEth(fromAddress, secret, toAddress, amount) {
  let params = {
    to: toAddress,
    from: fromAddress,
    value: web3.utils.toWei(amount + '', 'ether')
  };
  console.log(params);

  return Promise.all([web3.eth.estimateGas(params), web3.eth.getGasPrice()])
    .then((response) => {
      const estimatedGas = response[0];
      const gasPrice = response[1];
      params.gas = estimatedGas;
      params.gasPrice = web3.utils.toWei(1.1 * gasPrice + ''); // Use 10% more gas than recommended
      params.value = web3.utils.toWei(params.value - params.gas * params.gasPrice + '');

      return web3.eth.accounts.signTransaction(params, secret);
    })
    .then((signedTx) => {
      return web3.eth.sendSignedTransaction(signedTx.rawTransaction);
    });
}

Aber ich bekomme einen Fehler:

 Error: while converting number to string, invalid number value '-1.1549989999999999e+23', should be a number matching (^-?[0-9.]+).

Antworten (1)

Javascript unterstützt keine Zahlen mit beliebiger Genauigkeit, die für Berechnungen mit Ether-Werten erforderlich sind (Ether hat 18 Dezimalstellen!).

Web3 v1.0 umschließt numerische Werte in bn.js- Objekten. Anstatt reguläre mathematische Operatoren (+, -, *, / usw.) zu verwenden, müssen Sie arithmetische Methoden aus bn.js verwenden:

Anstatt a * b + czu tun a.mul(b).add(c). Zum Konvertieren in das bn.js-Format bietet web3 die Funktion web3.utils.toBN().

Ihre Gasberechnungen können beispielsweise wie folgt durchgeführt werden:

params.gasPrice = web3.utils.toBN(gasPrice)
    .mul(web3.utils.toBN(11))
    .div(web3.utils.toBN(10));  // gasPrice * 1.1

params.value = web3.utils.toBN(params.value)
    .sub(
        web3.utils.toBN(params.gas).mul(
            web3.utils.toBN(params.gasPrice)
        )
    );     // value - (gas * gasPrice)
Es gibt keine Möglichkeit, times 1.1direkt zu tun?