Estoy tratando de escribir una función simple para enviar una transacción web3
y ethereumjs-tx
que 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);
Estás llamando getBalance
, que devuelve la cantidad de éter (en wei) que tiene la cuenta.
Luego, está pasando esa cantidad en el value
campo 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 value
transmisió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 getGasPrice
por mil millones.
Maciek Loziński