Ich möchte das auf meinem Konto verfügbare Ethereum als Transaktionsgebühr verwenden, um eine Token-Transaktion zu senden. Ich kenne das Gas, das ich brauche, also dachte ich theoretisch, dass die folgende Formel funktionieren würde:
gasPrice = balanceInWei / gas
also habe ich es mit 0,001 ETH versucht:
gasPrice = 1000000000000000 Wei / 130091
was 0,000000007686926843 ETH pro Gaseinheit ergibt
Aber ich habe
Fehler: Zurückgegebener Fehler: Unzureichende Mittel für Gas * Preis + Wert
Ich sende keinen Wert, also stimmt der Gaspreis * theoretisch mit dem Geld überein.
Was vermisse ich? Muss ich mindestens 1 gwei als Gas verwenden?
Ich verwende Web3js Version 5.6.0. Hier ist der Code:
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();
Beispielausgabe:
*** PROGRAM START ***
Transferring from address 0x8Df3..
The nonce is 71
Balance: 0.003703316
Starting transaction. with nonce 71
Gas price : 28467119170.426853
Ihr Code multipliziert das übergebene Guthaben mit 10**18
, vermutlich um von Ether in Wei umzuwandeln. Aber die Waage kommt aus web3.eth.getBalance
, die wei schon zurückgibt . Sie setzen also den Gaspreis viel zu hoch (um den Faktor 10**18
). Benutz einfach:
var balanceInWei = balance;
(Oder balance
direkt verwenden.)
BEARBEITEN
Sie sollten auch vermeiden, einen Gaspreis mit Bruchteilen von Wei zu verwenden, also das Ergebnis der Division:
gasPrice = Math.floor(balanceInWei / gas);
BEARBEITEN 2
Diese Linie versucht, die gleiche Menge an Ether zu senden, wie Sie Token senden. Sie sagten, Sie versuchen nicht, Ether zu übertragen, also löschen Sie diese Zeile:
"value": web3.utils.toHex(tokensToSend),
web3.eth.getBalance
gibt den Saldo in wei zurück. Können Sie den Code teilen, der die Ausgabe erzeugt, die Sie der Frage hinzugefügt haben? (Der aktuelle Code erzeugt keine solche Ausgabe.)npm
Sie verwenden.)web3.eth.getBalance
gibt Ihnen das Gleichgewicht in Wei. Wenn Sie etwas anderes sehen, müssen Sie überzeugende Beweise liefern (z. B. eine minimale Repro, die jeder ausführen kann und die auf einen Mainnet-Knoten zeigt, der das falsche Ergebnis zurückgibt).console.log
Zeilen nicht mit der Ausgabe übereinstimmen.web3.eth.getBalance('0x<your address here>').then(console.log);
var balance = web3.utils.fromWei(result, 'ether');
.
Roman Frolov
Sieger
Benutzer19510
Sieger