API сканирования эфира, вычисление баланса на дату

Мне нужно рассчитать баланс на дату для учета, но баланс 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);

Ответы (2)

Несколько вещей, чтобы рассмотреть

  • txlist Из документации будут перечислены только транзакции с «обычных» аккаунтов, т.е. не будут перечислены «внутренние транзакции», также не будут перечислены добытые блоки.

  • txlist вернет только последние 10000 транзакций.

Существует несколько типов транзакций, которые могут повлиять на баланс учетной записи, возвращаемый функцией web3js.eth.getBalance(). Проверьте разные rpc в списке API etherscan https://etherscan.io/apis#accounts

внутренние транзакции (газ, используемый для взаимодействия с контрактами) и адрес, который вы ищете, также могли использоваться для майнинга, поэтому он должен был получать эфир из добытых блоков (которых не будет в списке обычных транзакций, возвращаемых первым API etherscan. Попробуйте Тот, что предназначен для этого)

как уже упоминал Исмаэль, вы также можете рассмотреть возможность пейджинга, поскольку в истории аккаунта может быть более 10000 транзакций.

Как только вы включите все это в свои расчеты, теоретически результаты должны совпадать с web3js :)

Дайте нам знать, если вы разрешили тайну