Verwenden Sie das volle Ethereum-Guthaben für die Token-Transaktion

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
Welche Geldbörse verwendest du? Ich meine die, wo der Fehler passiert.
Ich verwende web3js, also ist keine Brieftasche beteiligt, ich bin mir nicht sicher, was Sie meinen
Können Sie den genauen Code teilen, den Sie für die Transaktion ausgeführt haben?
natürlich @smarx - ich habe die Frage mit dem Quellcode aktualisiert

Antworten (1)

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 balancedirekt 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),
Wenn ich die Ausgabe des Kontostands nach dem Abrufen sehe, wird der Betrag in eth angezeigt - ich habe die Frage mit einem Ausgabebeispiel aktualisiert
Danke für die Bestätigung, dass die Formel stimmt. Der Fehler muss darin liegen, wie Dinge im Code gehandhabt werden - vielleicht var-Typen oder so etwas
Ich habe gesehen, dass Leute gerne Hex-Werte in allen Feldern der Transaktion verwenden, bin mir nicht sicher, ob dies für solche Dinge der Fall sein könnte
web3.eth.getBalancegibt 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.)
Es ist der gleiche Code, ich habe nur die Protokollierung entfernt. lass es mich reparieren
Bitte geben Sie auch die Version von web3.js an, die Sie verwenden.
„Web3js-Version 5.6.0“ existiert nicht. Die aktuelle Produktionsversion von web3.js ist 0.20.4 und die aktuelle Betaversion ist 1.0.0-beta.29. Können Sie erklären, was Sie verwenden?
Wenn ich das Ergebnis decke, muss es mindestens über eins liegen, damit der Gaspreis nicht 0 ist. npm -v web3 gibt 5.6.0 | zurück npm list web3 gibt web3@1.0.0-beta.29 zurück
Wei-Bruchteile gibt es nicht. Wenn Ihr Benzinpreis also unter 1 Wei liegen muss, haben Sie keine andere Wahl, als ihn auf 0 Wei zu setzen.
Etwas sehr Seltsames passiert, wenn das wirklich der Code ist, den Sie ausführen. Vielleicht ist es ein Fehler in dem Knoten, mit dem Sie sich verbinden? Bist du mit Geth verbunden? Parität? Infura? Ganache? Etwas anderes?
(FYI, 5.6.0 ist die Version, die npmSie verwenden.)
Das bedeutet, dass die Adresse mindestens 130091 * 1000000000 Wei = 0,000130091 ETH haben müsste, um die Transaktion durchzuführen, habe ich recht? Außerdem bin ich mit infura verbunden
Nein, es müsste mindestens 130091 Wei haben, was 0,000000000000130091 Ether entspricht. (130091 / 130091 == 1)
Okay, vielen Dank, ich werde verrückt mit der ganzen Einheitenumrechnung
Ich bin misstrauisch gegenüber Ihrem Code, da die von Ihnen eingefügte Ausgabe nicht mit den Protokollmeldungen übereinstimmt. Ich wiederhole, das web3.eth.getBalancegibt 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).
Ich habe es gerade mit dem Math Floor ausgeführt und die folgende Ausgabe erhalten: comp.st/i70w - der Code in der Paste ist im Grunde der Code, den ich verwende, ich hatte gerade die console.logs entfernt, um Rauschen zu entfernen, aber das war's
Es ist schwer zu glauben, da der Code etwas Bizarres macht und die console.logZeilen nicht mit der Ausgabe übereinstimmen.
Bitte lauf einfachweb3.eth.getBalance('0x<your address here>').then(console.log);
Und bitte beantworten Sie meine Frage, mit welchem ​​Knoten Sie verbunden sind.
Ich habe es oben gesagt, ich bin im Infura-Netzwerk. Es stellt sich auch heraus, dass ich zurückgeblieben bin, ich habe vergessen, die folgende Zeile in die Quelle aufzunehmen var balance = web3.utils.fromWei(result, 'ether');.
Tut mir leid, ich habe irgendwie übersehen, dass du gesagt hast, dass du auf Infura bist. Ah, diese Zeile erklärt, wie Sie Ether anstelle von Wei bekommen haben. Deshalb habe ich darauf bestanden, den tatsächlichen Code zu sehen. :-) Sehen Sie sich meine letzte Bearbeitung an, um zu sehen, was meiner Meinung nach das verbleibende Problem ist.
Vielen Dank, das macht Sinn, aber wo soll ich die Anzahl der Token angeben, die ich übertragen möchte?
egal, mir ist gerade aufgefallen, dass das in den Datenteil gehört
Kommentare sind nicht für längere Diskussionen gedacht; Diese Konversation wurde in den Chat verschoben .