Use el saldo completo de ethereum para la transacción de token

Quiero usar cualquier ethereum que esté disponible en mi cuenta como tarifa de transacción para enviar una transacción de token. Sé el gas que necesito, así que en teoría pensé que la siguiente fórmula funcionaría:

gasPrice = balanceInWei / gas

así que probé con 0.001 ETH:

gasPrice = 1000000000000000 Wei / 130091

lo que da como resultado 0.000000007686926843 ETH por unidad de gas

pero tengo

Error: error devuelto: fondos insuficientes para gas * precio + valor

No estoy enviando ningún valor, por lo que, en teoría, el precio del gas * coincide con los fondos.

¿Qué me estoy perdiendo? ¿Tengo que usar un mínimo de 1 gwei como gas?

Estoy usando Web3js versión 5.6.0. Aquí está el código:

function main() {
    console.log('Transferring from address 0x8..');
    web3.eth.getTransactionCount(SOURCE_WALLET_ADDRESS).then(function (nonce) {
        console.log('The nonce is ' + nonce);
        web3.eth.getBalance(SOURCE_WALLET_ADDRESS).then(function (balance) { 

            console.log('Balance ' + balance); 
            sendTransaction(nonce, balance);
        });
    });
}

function sendTransaction (nonce, balance) {
    var tokensToSend = '1000';
    var contract = new web3.eth.Contract(abiArray, CONTRACT_ADDRESS, { from: SOURCE_WALLET_ADDRESS });
    var balanceInWei = balance * 1000000000000000000;
    var gas = 130091;

    // Find out gas price to use full eth balance
    gasPrice = balanceInWei / gas;

    console.log('\r\nStarting transaction. with nonce ' + nonce);
    console.log('Gas price : ' + gasPrice + '\r\n');

    let details = {
        "to": CONTRACT_ADDRESS,
        "from": SOURCE_WALLET_ADDRESS,
        "data": contract.methods.transfer(DESTINATION_WALLET_ADDRESS, tokensToSend).encodeABI(),
        "value": web3.utils.toHex(tokensToSend),
        "nonce": nonce,
        "gas": gas, // tx fee (gas * gasPrice)
        "gasPrice": gasPrice, // has to be in Wei
        "chainId": 1 // EIP 155 chainId - mainnet: 1, rinkeby: 4
    }

    const transaction = new EthereumTx(details);
    transaction.sign(Buffer.from(WALLET_PRIVATE_KEY, 'hex'));
    const serializedTransaction = transaction.serialize();

    web3.eth.sendSignedTransaction('0x' + serializedTransaction.toString('hex')).then(function (transId) {
        console.log('My job here is done. ' + transId.transactionHash);
    });
}

main();

Salida de ejemplo:

*** PROGRAM START ***

Transferring from address 0x8Df3..
The nonce is 71
Balance: 0.003703316

Starting transaction. with nonce 71
Gas price : 28467119170.426853
¿Qué billetera usas? Me refiero a aquel en el que ocurre el error.
Estoy usando web3js, por lo que no hay billetera involucrada, no estoy seguro de lo que quieres decir
¿Puedes compartir el código exacto que ejecutaste para realizar la transacción?
por supuesto, @smarx: actualicé la pregunta con el código fuente

Respuestas (1)

Su código multiplica el saldo pasado por 10**18, presumiblemente para convertir de ether a wei. Pero el saldo viene de web3.eth.getBalance, que ya regresa wei . Así que está fijando el precio de la gasolina demasiado alto (por un factor de 10**18). Solo usa:

var balanceInWei = balance;

(O usar balancedirectamente).

EDITAR

También debe evitar tratar de usar un precio de gasolina con fracciones de wei, así que piso el resultado de la división:

gasPrice = Math.floor(balanceInWei / gas);

EDITAR 2

Esta línea intenta enviar la misma cantidad de éter que estás enviando tokens. Dijiste que no estás tratando de transferir ningún ether, así que borra esta línea:

"value": web3.utils.toHex(tokensToSend),
Cuando veo la salida del saldo después de su recuperación, la cantidad se muestra en eth: actualicé la pregunta con un ejemplo de salida
Gracias por confirmar que la fórmula es correcta. El error debe estar en cómo se manejan las cosas en el código, tal vez tipos var o algo así
He visto que a la gente le gusta usar valores hexadecimales en todos los campos de la transacción, no estoy seguro si podría ser para cosas como esta
web3.eth.getBalancedevuelve el saldo en wei. ¿Puede compartir el código que produce el resultado que agregó a la pregunta? (El código actual no produce tal salida).
es el mismo código, acabo de eliminar el registro. Déjame arreglarlo
También incluya la versión de web3.js que está utilizando.
"Web3js versión 5.6.0" no existe. La versión de producción actual de web3.js es 0.20.4 y la versión beta actual es 1.0.0-beta.29. ¿Puedes aclarar lo que estás usando?
Si piso el resultado, deberá estar al menos por encima de uno para que el precio de la gasolina no sea 0. npm -v web3 devuelve 5.6.0 | lista npm web3 devuelve web3@1.0.0-beta.29
Las fracciones de wei no existen, por lo que si el precio de la gasolina debe ser inferior a 1 wei, no tiene más remedio que establecerlo en 0 wei.
Algo muy extraño está sucediendo si ese es realmente el código que está ejecutando. ¿Quizás es un error en el nodo al que se está conectando? ¿Estás conectado con geth? ¿Paridad? ¿Infura? ¿ganache? ¿Algo más?
(FYI, 5.6.0 es la versión que npmestá usando).
Eso significa que la dirección debería tener un mínimo de 130091 * 1000000000 Wei = 0.000130091 ETH para poder realizar la transacción, ¿estoy en lo correcto? También estoy conectado a infura
No, tendría que tener un mínimo de 130091 wei, que es 0.000000000000130091 ether. (130091 / 130091 == 1)
Vale, muchas gracias, me estoy volviendo loco con toda la conversión de unidades.
Sospecho de su código, ya que la salida que pegó no coincide con los mensajes de registro. Repito que web3.eth.getBalancete da el saldo en wei. Si está viendo algo diferente, tendrá que dar alguna evidencia convincente (por ejemplo, una reproducción mínima que cualquiera puede ejecutar apuntando a un nodo de la red principal que arroja un resultado incorrecto).
Acabo de ejecutarlo con el piso de matemáticas y obtuve el siguiente resultado: comp.st/i70w - el código en el pegado es básicamente el código que estoy usando, acababa de eliminar la consola.logs para eliminar el ruido, pero eso es todo
Es difícil de creer eso, dado que el código está haciendo algo extraño y las console.loglíneas no coinciden con la salida.
por favor solo correweb3.eth.getBalance('0x<your address here>').then(console.log);
Y responda mi pregunta sobre a qué nodo está conectado.
Lo dije arriba, estoy en la red infura. También resulta que soy retrasado, olvidé incluir la siguiente línea en la fuente var balance = web3.utils.fromWei(result, 'ether');.
Lo siento, de alguna manera me perdí que dijiste que estabas en Infura. Ah, esa línea explica cómo obtuviste ether en lugar de wei. Por eso insistí en ver el código real. :-) Vea mi edición más reciente para saber cuál creo que es el problema restante.
Muchas gracias, eso tiene sentido, pero ¿dónde debo especificar la cantidad de tokens que quiero transferir?
no importa, me acabo de dar cuenta de que va en la parte de datos
Los comentarios no son para una discusión extensa; esta conversación se ha movido a chat .