ganache-cli no tiene fondos suficientes para enviar tx: el número aumenta proporcionalmente a la cantidad con la que inicializo una billetera

Estoy tratando de escribir una función simple para enviar una transacción web3y ethereumjs-txque vacíe la billetera de una cuenta (llame a esta cuenta A) en otra cuenta (cuenta B). Sin embargo, no importa lo que inicialice el saldo de la cuenta A usando ganache-cli, es decir, con ganache-cli --account="0x4482be4e4e36d5521d70dafa57818eed38a4d0c69562bffebf24901c3199b271, 222222222222222222222", obtengo el error:

Error: Returned error: sender doesn't have enough funds to send tx. The upfront cost is: 73361650815041401384341826897131069221944849241050 and the sender's account only has: 222222222222222222222

Además, si aumento la cantidad en la que inicializo la billetera, el 'costo inicial' aumenta proporcionalmente:

Error: Returned error: sender doesn't have enough funds to send tx. The upfront cost is: 22704331223003175573249212746801550559464702875615796870481879467237868556850 and the sender's account only has: 22222222222222222222222222222222

¿Alguien puede decirme qué estoy haciendo mal? Aquí está mi código:

var Web3 = require('web3');
var web3 = new Web3(new 
Web3.providers.WebsocketProvider("ws://localhost:8545/"));
const Tx = require('ethereumjs-tx');


  addr = account..address;
  key = account.key;
  key = key.slice(2);
  web3.eth.getBalance(addr).then( (result) => {
    evmBalance += parseInt(result, 10);

    web3.eth.getGasPrice()
    .then((gasPrice) => {
      var gasLimit = 25000;
      web3.eth.getTransactionCount(addr).then( (nonce) => {
        var nonce = nonce.toString();
        var rawTransaction = {
          "from": addr,
          "nonce": web3.utils.toHex(nonce),
          "gasPrice": web3.utils.toHex(gasPrice * 1e9),
          "gasLimit": web3.utils.toHex(gasLimit),
          "to": destinationAddr,
          "value": result,

        };

        var privKey = Buffer.from(key, 'hex');

        var tx = new Tx(rawTransaction);

        tx.sign(privKey);
        var serializedTx = tx.serialize();

        var transaction = web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'))
        transaction.on('receipt', console.log);
        transaction.on('error', console.log);
También he notado un comportamiento extraño en la estimación del costo inicial de Ganache: Ganache (¿o tal vez Truffle?) estimó el costo de la llamada de la función en aproximadamente 20 veces más de lo que luego tomó del saldo del remitente. Lo que es más interesante: también escribí una función para borrar la cuenta del usuario (para probar mi funcionalidad de autorrecarga).

Respuestas (1)

Estás llamando getBalance, que devuelve la cantidad de éter (en wei) que tiene la cuenta.

Luego, está pasando esa cantidad en el valuecampo de la transacción, por lo que la transacción intentará enviar el saldo total de la cuenta. Es por eso que la cantidad aumenta cuando agrega más fondos a la cuenta.

Tal transacción nunca tendrá éxito, porque la cuenta que envía la transacción debe tener suficiente éter para cubrir tanto la valuetransmisión como la cantidad requerida para pagar el gas. El máximo que puede transferir debe ser result - (gasPrice * 1e9 * gasLimit).

EDITAR

También está eligiendo un precio de gasolina extremadamente alto, porque está multiplicando el precio de la gasolina devuelto getGasPricepor mil millones.