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
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 balance
directamente).
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),
web3.eth.getBalance
devuelve 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).npm
está usando).web3.eth.getBalance
te 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).console.log
líneas no coinciden con la salida.web3.eth.getBalance('0x<your address here>').then(console.log);
var balance = web3.utils.fromWei(result, 'ether');
.
Román Frólov
Víctor
usuario19510
Víctor