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.
Si observa la herramienta de verificación de saldo, puede ver que hay dos opciones
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}`);
Puede utilizar el defaultBlock
pará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;
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
shawn tabrizi