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?
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)
);
getTokenBalance
?balanceOf
está disponible, ya que es parte de la interfaz de un token ERC20.d
y 4
hacia el final. Pero asumiendo que es un artefacto extraño de copiar/pegar y que en realidad tienes 66 caracteres ( 0x
y 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.0x
prefijo. 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!
usuario19510
keccak256("balanceOf(address)")
seguidos de la dirección, todos codificados en hexadecimal.