¿Puedo obtener un saldo ERC20 n bloques atrás en el tiempo?

Al llamar a un nodo de Ethereum en ejecución a través de la API getBalance, puede recuperar los N bloques de saldo de Ethereum como se explica aquí . Esto es útil si solo desea confiar en un saldo que ha sido suficientemente confirmado por la red.

¿Es lo mismo posible para los tokens ERC20? ¿Existe un servicio que pueda mostrarme cuál era el saldo de tokens para una dirección determinada hace 5 cuadras?

Respuestas (2)

Sí, usted puede hacer esto. Con web3.js 0.2xx, observe en https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-methods que todas las llamadas a contratos toman un número de bloque opcional.

Entonces, lo siguiente obtendrá el saldo de una cuenta en un número de bloque específico:

tokenContract.balanceOf(account, {}, blockNumber);

Creo que la sintaxis de web3.js 1.0.0-beta es algo así, pero revisa la documentación:

tokenContract.methods.balanceOf(account).call({}, blockNumber);

Si está utilizando llamadas JSON-RPC sin procesar, eth_calltambién toma un número de bloque como segundo parámetro.

Esto funcionó para mí. En Nethereum (para C#) tuve que usar: balanceInBaseUnits = await function.CallAsync<BigInteger>(new BlockParameter(relevantBlockNumber), _owner);
Para poder leer todos los datos históricos, creo que necesita tener el nodo de paridad ejecutándose con el modo de poda configurado en "archivo".
Para ver una comparación de cómo geth y Parity manejan esto, consulte ethereum.stackexchange.com/questions/3332/…

Como mencionó, para obtener el saldo ETH de una dirección, debe hacer esto:

eth.getBalance("<ADDRESS_HERE>", <BLOCK_NUMBER>);

Si desea obtener el saldo de un token ERC20, debe realizar una llamada al contrato de ese token. Para ello necesitarás tres cosas:

  • La dirección del contrato del token.
  • Dirección de su cuenta.
  • El ABI del contrato de token.

Entonces, necesita instanciar el contrato ABI haciendo:

> var tokenContract = eth.contract([{
     "type":"function",
     "name":"balanceOf",
     "constant":true,
     "payable":false,
     "inputs":[{"name":"","type":"address"}],
     "outputs":[{"name":"","type":"uint256","value":"0"}]
}]);

Y luego puedes hacer:

> var erc20ContractAddress = "<ADSRESS_OF_TOKEN'S_CONTRACT>";
> var account = "YOUR_ADDRESS";
> tokenContract.at(erc20ContractAddress).balanceOf(account);

Esto genera el saldo de fichas en fichas simples, es decir, sin mostrar un punto decimal.

Gracias. Pero creo que planteé mal la pregunta. Estoy preguntando sobre el saldo ERC20 hace N bloques, no el actual. He editado mi pregunta.