Obtenga saldo de tokens sin usar nodejs

Estoy tratando de obtener Token Balance usando javascript simple, sin nodejs o web3.

Con web3 y nodejs puedo hacer:

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);
        }
    })
}

¿Alguna sugerencia?

Consulte github.com/ethereum/wiki/wiki/JSON-RPC#eth_call , pero deberá codificar el nombre y el parámetro de la función. Deben ser solo los primeros 4 bytes keccak256("balanceOf(address)") seguidos de la dirección, todos codificados en hexadecimal.

Respuestas (2)

usando 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)
);
¿No es necesario pasar ABI a getTokenBalance?
¿Qué es getTokenBalance?
esa es una función que escribí: D, lo siento, estaba tratando de preguntar si al obtener el saldo de un token ERC20, ¿no necesitamos enviar ABI también? Lo envío cuando uso web3
No estoy seguro de lo que quieres decir. El ABI le dice qué funciones están disponibles. Ya sabemos que balanceOfestá disponible, ya que es parte de la interfaz de un token ERC20.
Soy novato en esto, gracias por la explicación, eres genial!
La respuesta tiene 66 caracteres, en el ejemplo obtengo: 0x00000000000000000000000000000000000000000000006c6b935b8bbd400000, ¿tengo que cortar algún carácter?
Lo que copié/pegué de tu comentario en realidad tiene dos caracteres ocultos adicionales entre dy 4hacia el final. Pero asumiendo que es un artefacto extraño de copiar/pegar y que en realidad tienes 66 caracteres ( 0xy luego 64 caracteres después de eso), entonces tienes lo que quieres. Simplemente analícelo como un número hexadecimal. parseInt('0x00...', 16)Deberia trabajar.
Tenga en cuenta que, dependiendo de la biblioteca que utilice para realizar la función keccak, el resultado puede tener un 0xprefijo. En este caso, querrá usar keccak_256.hex('balanceOf(address)').substr(0, 10)para obtener el selector de función correcto, que es 0x70a08231.

¡También puedes usar la API de Etherscan!