Erhalten Sie Token-Guthaben, ohne nodejs zu verwenden

Ich versuche, Token Balance mit einfachem Javascript zu erhalten, ohne nodejs oder web3.

Mit web3 und nodejs kann ich tun:

exports.getTokenConfirmedBalance = function(node, query, abi) {
    return new Promise((resolve, reject) => {
        try {
            var provider = new web3.providers.HttpProvider(node.url);
            var w3 = new web3(provider);

            var tokenContract = new w3.eth.Contract(abi, query.token_address, {from: query.pub_address});

            tokenContract.methods.balanceOf(query.pub_address).call().then(function (balance) {
                resolve(balance);

            }).catch(function(error) {
                reject(error)
            })

        } catch(error) {
            console.log(error);
            reject(error.message);
        }
    })
}

Irgendwelche Vorschläge?

Siehe github.com/ethereum/wiki/wiki/JSON-RPC#eth_call , aber Sie müssen den Funktionsnamen und Parameter codieren. Sollte nur die ersten 4 Bytes keccak256("balanceOf(address)") gefolgt von der Adresse sein, alles hex-kodiert.

Antworten (2)

Verwendung eth_call:

const tokenAddress = "0x123abc";
const account = "0x456def";

// Hex encoding needs to start with 0x.
// First comes the function selector, which is the first 4 bytes of the
//   keccak256 hash of the function signature.
// ABI-encoded arguments follow. The address must be left-padded to 32 bytes.
const data = '0x' +
  keccak_256.hex('balanceOf(address)').substr(0, 8) +
  '000000000000000000000000' + account.substr(2);     // chop off the 0x

// You can send this to any node.
fetch('https://mainnet.infura.io/APIKeyGoesHere', {
  method: 'POST',
  body: JSON.stringify({
    jsonrpc: "2.0",
    id: 1,
    method: "eth_call",
    params: [{
      to: tokenAddress,
      data: data,
    }, 'latest'],
  }),
  headers: new Headers({
    'Content-Type': 'application/json'
  }),
}).then(response =>
  response.json()
).then(json =>
  console.log(json.result)
);
wird nicht benötigt, um ABI an getTokenBalance weiterzugeben?
Was ist getTokenBalance?
Das ist eine Funktion, die ich geschrieben habe: D, Entschuldigung, ich habe versucht zu fragen, ob wir beim Abrufen des Guthabens eines ERC20-Tokens nicht auch ABI senden müssen? Ich sende es, wenn ich web3 verwende
Ich bin mir nicht sicher was du meinst. Die ABI sagt Ihnen, welche Funktionen zur Verfügung stehen. Wir wissen bereits, dass balanceOfdas verfügbar ist, da es Teil der Schnittstelle eines ERC20-Tokens ist.
Ich bin Neuling auf diesem Gebiet, danke für die Erklärung, du rockst!
Die Antwort ist 66 Zeichen lang, im Beispiel bekomme ich: 0x00000000000000000000000000000000000000000006c6b935b8bbd400000, muss ich irgendwelche Zeichen ausschneiden?
Was ich aus Ihrem Kommentar kopiert/eingefügt habe, hat tatsächlich zwei zusätzliche versteckte Zeichen zwischen dund 4gegen Ende. Aber vorausgesetzt, das ist ein seltsames Artefakt des Kopierens / Einfügens und Sie haben tatsächlich 66 Zeichen ( 0xund dann 64 Zeichen danach), dann haben Sie, was Sie wollen. Analysieren Sie es einfach als Hexadezimalzahl. parseInt('0x00...', 16)sollte arbeiten.
Beachten Sie, dass abhängig von der Bibliothek, die Sie zum Ausführen der Keccak-Funktion verwenden, das Ergebnis möglicherweise ein 0xPräfix hat. In diesem Fall möchten Sie verwenden keccak_256.hex('balanceOf(address)').substr(0, 10), um den richtigen Funktionsselektor zu erhalten, nämlich 0x70a08231.

Sie können auch die Etherscan-API verwenden!