Мне нужно рассчитать баланс на дату для учета, но баланс web3 и API etherscan.com не соответствуют математике. Как правильно рассчитать баланс по имеющимся данным апи.
const web3 = new Web3("https://ropsten.infura.io/erKFM1jCovzvFHE1wBah");
BigNumber.config({ ERRORS: false });
const url = "http://ropsten.etherscan.io/api?";
const key = "apikey=HJ583R13XWNWUZVYB1H8J7XVGRDKEPJK9U";
const address = "0x5360486ef76c4c857675c8212f885f7757510d9f";
axios.get(`${url}module=account&action=txlist&address=${address}&startblock=0&endblock=99999999&sort=asc&${key}`)
.then(res => {
const result = res.data.result;
const input = [];
const output = [];
let balance = new BigNumber(0);
result.forEach(item => {
const value = new BigNumber(item.value);
const gasUsed = +item.gasUsed;
const gasPrice = +item.gasPrice;
const cumGasUsed = +item.cumulativeGasUsed;
if(item.isError === "0" && item.txreceipt_status !== "0") {
if(item.to === address) {
input.push({
value: value,
gasUsed: 0,
time: moment.unix(item.timeStamp).format("DD-MM-YYYY").toString(),
});
balance = balance.plus(value);
}
if(item.from === address) {
output.push({
value: value,
gasUsed: gasUsed,
time: moment.unix(item.timeStamp).format("DD-MM-YYYY").toString(),
});
balance = balance.minus(value);
balance = balance.minus(gasUsed * gasPrice)
}
if(item.from === item.to) {
console.log("self", item.value);
}
}
});
console.log("api balance", web3.utils.fromWei(balance.toString(), "ether"));
web3.eth.getBalance(address)
.then(balance => console.log("web3 balance", web3.utils.fromWei(balance, "ether")));
})
.catch(console.log);
Несколько вещей, чтобы рассмотреть
txlist Из документации будут перечислены только транзакции с «обычных» аккаунтов, т.е. не будут перечислены «внутренние транзакции», также не будут перечислены добытые блоки.
txlist вернет только последние 10000 транзакций.
Существует несколько типов транзакций, которые могут повлиять на баланс учетной записи, возвращаемый функцией web3js.eth.getBalance(). Проверьте разные rpc в списке API etherscan https://etherscan.io/apis#accounts
внутренние транзакции (газ, используемый для взаимодействия с контрактами) и адрес, который вы ищете, также могли использоваться для майнинга, поэтому он должен был получать эфир из добытых блоков (которых не будет в списке обычных транзакций, возвращаемых первым API etherscan. Попробуйте Тот, что предназначен для этого)
как уже упоминал Исмаэль, вы также можете рассмотреть возможность пейджинга, поскольку в истории аккаунта может быть более 10000 транзакций.
Как только вы включите все это в свои расчеты, теоретически результаты должны совпадать с web3js :)
Дайте нам знать, если вы разрешили тайну