Получить историю баланса адреса

При создании приложения IONIC я пытаюсь получить исторический баланс одного адреса Ethereum. В настоящее время я не уверен, как далеко мне нужно будет вернуться. Я знаю, что Etherscan.IO предлагает веб-инструмент для получения баланса с определенной даты по адресу https://etherscan.io/balancecheck-tool , однако я не могу найти никаких API, которые позволяют мне делать это программно. Я также не могу установить web3 в моем текущем проекте. Любые советы будут оценены.

Посмотрите этот образец, который я построил: График баланса ETH .

Ответы (4)

Если вы посмотрите на инструмент проверки баланса, вы увидите два варианта.

  1. Дата
  2. Номер блока

Если вы знаете номер блока, вы можете использовать следующую функцию, чтобы получить исторический баланс

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

Если вы не знаете номер блока, но хотите получить его по дате/времени. Сначала вам нужно найти блок, который добывается за это время.

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}`);
Я очень ценю помощь в этом. Однако, как я уже сказал, я не могу получить web3 для использования в моем проекте. Знаете ли вы другой способ, кроме web3?
Можете ли вы уточнить, что не работает с web3?
Возникла проблема с самим пакетом. Я смог заставить его установить. Спасибо!

Вы можете использовать defaultBlockпараметр, чтобы получить исторический баланс. Например, используя web3.js v1.0:

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

Что касается того факта, что вы не можете установить web3 в свой проект, вам следует создать еще один вопрос, предоставив более подробную информацию о том, что вы пробовали, и об ошибках, с которыми вы столкнулись.

Вам придется повторить цепочку, чтобы сделать это, так как у вас есть только метка времени, а Etherscan API имеет эту услугу только для пользователей PRO.

Недавно мне пришлось это сделать, и мне пришлось пройти всю цепочку, чтобы оптимизировать ее, я реализовал алгоритм бинарного поиска, который значительно уменьшил временную сложность.

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;

}

Затем вы можете использовать номер блока ближайшего блока, который в данном случае является вашей средней точкой, таким образом

let oldBlock = await provider.getBlock(blockAtTimestamp);

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

Примечание

Я использовал здесь https://www.docs.ethers.io , воспользовавшись API EtherscanProvider.

Etherscan предоставляет API для того, что вы просите, но это не бесплатно https://docs.etherscan.io/api-endpoints/accounts#get-historical-ether-balance-for-a-single-address-by-blockno другие ребята сказали, что я рекомендую вам использовать web3 или etherjs, чтобы получить баланс в конкретном блоке бесплатно.

Эта статья дает хорошее представление о том, как получить исторические балансы аккаунта в Ethereum https://www.shawntabrizi.com/ethereum/graphing-eth-balance-history-of-an-ethereum-address-using-parallel-asynchronous . -запросы-в-web3-js/

Я также рекомендую искать альтернативы, такие как ковалентные https://www.covalenthq.com/docs/api/#/0/Get%20token%20balances%20for%20address/USD/1.