Пакетный запрос Web3 всегда возвращает неопределенное значение, что я делаю не так?

#node.js #web3 #erc20 #ethers.js

Вопрос:

Я пытаюсь использовать пакет web3, чтобы вызывать балансы токенов все вместе. Когда я вызываю batch.execute(), он возвращает undefined вместо разрешенных запросов, которые были добавлены в пакет. Может кто-нибудь просветить меня, где я что-то путаю? Вот мой код.

 async generateContractFunctionList(
    address: Address,
    tokens: Token[],
    blockNumber: number
  ) {
    const batch = new this.web3.BatchRequest();

    for (let i = 0; i < tokens.length; i  ) {
      const contract = new this.web3.eth.Contract(balanceABI as AbiItem[]);
      contract.options.address = tokens[i].address;

      batch.add(
        contract.methods
          .balanceOf(address.address)
          .call.request({}, blockNumber)
      );
    }

    return batch;
  } 
  async updateBalances() {
    try {
      const addresses = await this.addressService.find();
      const tokens = await this.tokenService.find();
      const blockNumber = await this.web3.eth.getBlockNumber();

      for (let i = 0; i < addresses.length; i  ) {
        const address = addresses[i];
        const batch = this.generateContractFunctionList(address, tokens, blockNumber);

        const response = await (await batch).execute();
        console.log(response);  //returns undefined 
      } 
    } catch (error: unknown) {
      if (error instanceof Error) {
        console.log(`UpdateBalanceService updateBalances`, error.message);
      }
    }
  } 

почему batch.execute() ничего не возвращает и является недействительным? Я использовал этот пример из этой статьи и изменил его в соответствии со своими потребностями, но не изменил слишком много вещей, которые могли бы все испортить.

https://chainstack.com/the-ultimate-guide-to-getting-multiple-token-balances-on-ethereum/

когда я добавляю функцию обратного вызова в «batch.add» и журнал консоли, баланс регистрируется на консоли. Но я пытаюсь использовать async await для .execute(), так как я могу получить результат от вызовов метода с помощью await batch.execute() и получить все результаты обратного вызова, как написано в сообщении в блоге.

Ответ №1:

Столкнулся с той же проблемой. Быстрое и грязное решение — использовать устаревшую версию пакета.

package.json:

 ....
"dependencies": {
    ...
    "web3": "^2.0.0-alpha.1",
    ...
    }
....

 

Ответ №2:

batch.add() требуется функция обратного вызова в качестве последнего параметра. Вы можете либо изменить свой код для передачи обратного вызова, либо, как упоминалось выше, использовать версию 2.0.0-alpha, используемую в статье.

Мы скоро обновим статью, чтобы использовать последнюю версию 😉web3.js