Wie lese ich alle Token-Guthaben aus der Brieftasche?

Der folgende Code funktioniert für mich, um den Ether-Wert aus der Brieftasche zu lesen:

var web3Instance =  new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

export async function readAccountEtherValue(address: string): Promise<number> {
    var balance = await web3Instance.eth.getBalance(address);
    return web3Instance.utils.fromWei(balance, "ether");
}

Wie kann ich die Werte aller Token aus dem Wallet auslesen?

Antworten (3)

Token-Guthaben werden nicht in der Brieftasche eines Benutzers gespeichert. Sie werden im entsprechenden Token-Vertrag gespeichert. Angenommen, der Token, von dem Sie den Kontostand lesen möchten, ist ein ERC20-Token, dann müssten Sie den Token-Vertrag instanziieren und dann anrufen balanceOf(address), um den Kontostand der Adresse zu erhalten. Zum Beispiel:

let token = await ERC20Basic.at(_tokenAddress);
let balance = await token.balanceOf(accounts[0]);
OMG, das heißt, ich muss für jeden Token auf der ganzen Welt einen anderen Code schreiben?
Nicht unbedingt, Token, die ERC20-konform sind, folgen alle der Spezifikation und haben diese gemeinsamen Funktionen, zum Beispiel balanceOf(). Was Sie tun müssten, um jeden zu lesen, ist einfach die Adresse des Tokens zu ändern, dessen Saldo Sie erhalten möchten. Sie könnten eine Funktion schreiben, die eine Liste von Token-Adressen durchläuft und das jeweilige Guthaben für einen bestimmten Benutzer zurückgibt.
OK, wie kann ich dann wissen, welche Token ERC20 implementieren, und wie kann ich alle vorhandenen Token kennen und wissen, was ihre Schnittstelle ist? Es gibt Websites wie etherscan.io, die in der Lage sind, jeden vorhandenen Token zu lesen, sogar viele Token, die nicht auf Coinmarketcap gelistet sind.

Sie können stattdessen das Ereignis verwenden Transfer, um danach zu filtern. Sie werden wahrscheinlich einen fast vollständigen Knoten benötigen:

const Web3 = require("web3");
const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545"));
const transferEventTopic = web3.sha3("Transfer(Adresse,Adresse,uint256)");
const meineAdresse = "0x000000000000000000000003f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be";
const fromBlock = 4647513;
const myBalances = {};

konstanter Filter = web3.eth.filter({
        fromBlock: fromBlock,
        Themen: [ transferEventThema ]
    });

filter.watch((err, obj) => {
        wenn (fehler) {
            Konsole.Fehler (err);
        } anders {
            if (typeof myBalances[obj.address] === "undefined") {
                myBalances[obj.address] = web3.toBigNumber(0);
            }
            let message = "Token" + obj.address;
            geändert lassen = falsch;
            if (obj.themen[1] == meineAdresse) {
                geändert = wahr;
                myBalances[obj.address] = myBalances[obj.address].minus(obj.data);
                Nachricht += ", Gesendet " + web3.toBigNumber(obj.data).toString(10);
            } else if (obj.themen[2] == meineAdresse) {
                geändert = wahr;
                myBalances[obj.address] = myBalances[obj.address].plus(obj.data);
                Nachricht += ", Empfangen " + web3.toBigNumber(obj.data).toString(10);
            }
            wenn (geändert) {
                Nachricht += ", Kontostand " + myBalances[obj.address].toString(10);
                console.log (Nachricht);
            }
        }
    });

process.on('SIGINT', () => {
    console.log("Hör auf zu schauen");
    filter.stopWatching(console.log);
    process.exit();
});

Wenn Sie nur die Ereignisse wünschen, die "empfangen" bezeichnen, ersetzen Sie die Themen durch topics: [ transferEventTopic, null, myAddress ].

Wenn Sie nur die Ereignisse wünschen, die "send" bezeichnen, ersetzen Sie es durch topics: [ transferEventTopic, myAddress ].

Iteriert dieser Code alle Brieftaschen auf der ganzen Welt, bis er meine findet?
Dieser Code iteriert alle Ereignisse und Filter für Ihre Brieftasche. Also ja, schwer. Um schneller und weniger schwer zu sein, verwenden Sie die 2 unten aufgeführten Filter.
Nun, es scheint, dass Blockchain vielleicht doch keine so großartige Architektur ist. Ich gehe zwar davon aus, dass Ihr Code die formal korrekte Antwort ist, erwäge jedoch ernsthaft die Verwendung einer Problemumgehung, z. B. das Lesen von einer Website, die meine Token-Salden bereits berechnet hat. Wie lange, glauben Sie, wird ein Programm brauchen, um alle Blöcke seit 4647513 zu durchlaufen, wie es Ihr Code tut? (Ich bin nicht zynisch, ich frage ernsthaft, um eine Entscheidung zu treffen)
Das würde einen beträchtlichen Bruchteil einer Stunde dauern, schätze ich. Dies muss jedoch nur einmal für alle Waagen durchgeführt werden. Sie haben Recht, Blockchain kann nicht alle Ihre DB-Anforderungen erfüllen, sie benötigt externe Aggregatoren. Der Vorteil, den Sie aus diesen TransferEreignissen ziehen, ist die Gewissheit, dass sie stattgefunden haben.

Ich habe erst kürzlich einen Smart Contract und eine Bibliothek dafür geschrieben und in ein NPM-Paket gepackt. Sie finden das Paket hier: https://www.npmjs.com/package/eth-balance-checker

Der Code würde so aussehen, aber Sie sollten die README-Datei für dieses Paket lesen, um sicherzustellen, dass Sie wissen, wie es funktioniert:

import { getAddressBalances } from 'eth-balance-checker/lib/web3';

const address = '<your_address_here>';
const tokens = ['<token>', '<addresses>', '<here>'];
getAddressBalances(web3, address, tokens).then(balances => {
  console.log(balances); // { "0x0": "100", "0x456...": "200" }
});

Listen mit Tokens, die Sie in Ihrem Projekt verwenden können, finden Sie an verschiedenen Stellen. MyCrypto hat eine ziemlich umfassende Liste: https://github.com/MyCryptoHQ/MyCrypto/blob/develop/common/config/tokens/eth.json

wartungsbedürftig, funktioniert aufgrund alter Bibliotheken nicht mehr.