Obtener el historial de saldo de la dirección

Al crear una aplicación IONIC, intento recuperar el saldo histórico de una sola dirección de Ethereum. Actualmente no estoy seguro de cuánto tiempo atrás tendré que ir. Sé que Etherscan.IO ofrece una herramienta web para obtener el saldo de una fecha determinada en https://etherscan.io/balancecheck-tool , sin embargo, no puedo encontrar ninguna API que me permita hacer esto mediante programación. Tampoco puedo hacer que web3 se instale en mi proyecto actual. Cualquier consejo sería apreciado.

Echa un vistazo a esta muestra que construí: ETH Balance Graph

Respuestas (4)

Si observa la herramienta de verificación de saldo, puede ver que hay dos opciones

  1. Fecha
  2. Número de bloque

Si conoce el número de bloque, puede usar la siguiente función para obtener el saldo histórico

web3.eth.getBalance(address, blockNumber).then(balance => `Balance at block number is ${balance}

Si no conoce el número de bloque, pero desea obtenerlo por fecha/hora. Primero debe encontrar el bloque que se extrae durante ese tiempo.

let blockNum = web3.eth.blockNumber;
const historicTimestamp = new Date(historicDate).getTime();
while(true) {
  const block = web3.eth.getBlock(blockNum);
  if(block.timestamp < historicTimestamp) break;
  --blockNum;
}

//The blockNumber here is your required block number
web3.eth.getBalance(address, blockNumber).then(balance => `Balance at block number is ${balance}`);
Realmente aprecio la ayuda en esto. Sin embargo, como dije, no puedo obtener web3 para usar en mi proyecto, ¿conoce otra forma que no sea web3?
¿Puede ser más específico sobre lo que no funciona con web3?
Hubo un problema con el paquete en sí. Pude hacer que se instalara. ¡Gracias!

Puede utilizar el defaultBlockparámetro para obtener el saldo histórico. Por ejemplo, usando web3.js v1.0:

web3.eth.getBalance(account, 10000).then(balance => {console.log(`balance for ${account} at block 10000 is ${balance}`)});

Con respecto al hecho de que no puede instalar web3 en su proyecto, debe crear otra pregunta, brindando más detalles con lo que intentó y los errores que encontró.

Tendrá que iterar la cadena para hacer esto, ya que solo tiene la marca de tiempo y la API de Etherscan solo tiene este servicio para usuarios PRO

Recientemente tuve que hacer esto y tuve que atravesar toda la cadena, para optimizarlo, implementé un algoritmo de búsqueda binaria que redujo significativamente la complejidad del tiempo.

async function getHistoricBlockByTimestamp(historicTimestamp, provider) {

let lowerBound = 0;
let upperBound = await provider.getBlockNumber();

let midPoint = 0;

while (lowerBound <= upperBound) {
    midPoint = Math.floor(lowerBound + ((upperBound - lowerBound) / 2));
    // Get the block details using midPoint
    let blockDetails = await provider.getBlock(midPoint);

    // Compare timestamp from block with given timestamp
    if (blockDetails.timestamp === historicTimestamp) {
        continue;
    } else if (blockDetails.timestamp > historicTimestamp) {
        upperBound = midPoint - 1;
    } else {
        lowerBound = midPoint + 1;
    }
}

return midPoint;

}

Luego puede usar el número de bloque del bloque más cercano que es su punto medio en este caso, de esta manera

let oldBlock = await provider.getBlock(blockAtTimestamp);

let balanceAtTimestampBigNumber = await provider.getBalance(address, blockAtTimestamp);
balanceAtTimestamp = balanceAtTimestampBigNumber.toString() / 10 ** 18;

Nota

Usé https://www.docs.ethers.io aquí, aprovechando la API de EtherscanProvider

Etherscan proporciona una API para lo que está solicitando, pero no es gratis https://docs.etherscan.io/api-endpoints/accounts#get-historical-ether-balance-for-a-single-address-by-blockno Como el otros dijeron, te recomendaré al usuario web3 o etherjs para obtener el saldo en un bloque particular de forma gratuita.

Este artículo da una buena idea sobre cómo obtener saldos históricos de una cuenta en Ethereum https://www.shawntabrizi.com/ethereum/graphing-eth-balance-history-of-an-ethereum-address-using-parallel-asynchronous -solicitudes-en-web3-js/

También recomendaré buscar alternativas como covalente https://www.covalenthq.com/docs/api/#/0/Get%20token%20balances%20for%20address/USD/1