Я получаю ошибку ограничения газа при вызове ethers web3js в функции блокчейна только для просмотра / чтения

Непойманная (в обещании) Ошибка: невозможно оценить газ; транзакция может завершиться неудачно или может потребоваться ручное ограничение газа (error={"code":-32000,"message": "выполнение отменено"}, method="call" code=UNPREDICTABLE_GAS_LIMIT) ошибка.

Я определенно вызываю функцию только для чтения. Функция такая:

      function vaultSize(uint256 vaultId) public view virtual returns (uint256) {
    return
        store.isD2Vault(vaultId)
            ? store.d2Holdings(vaultId)
            : store.holdingsLength(vaultId).add(
                store.reservesLength(vaultId)
            );
}

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

Вот как я это называю в javascript.

      await contract.vaultSize(0)

Я не понимаю, почему это происходит. Это публичный код в контракте, который, очевидно, работает с тысячами транзакций в день.

Адрес: «0xdaa17a5f60E94d5f97968aa1E790c164e65c97Be».

2 ответа

Я столкнулся с этой проблемой и решил ее, удалив свойство из ABI контракта.

Например, часть моего ABI выглядела так:

      {
  "name": "get_virtual_price",
  "outputs": [
    {
      "type": "uint256",
      "name": ""
    }
  ],
  "inputs": [],
  "stateMutability": "view",
  "type": "function",
  "gas": 1011891
}

И я изменил его, чтобы он выглядел так, просто удалилgas:

      {
  "name": "get_virtual_price",
  "outputs": [
    {
      "type": "uint256",
      "name": ""
    }
  ],
  "inputs": [],
  "stateMutability": "view",
  "type": "function"
}

Удивительно, ноethersбыл счастлив и не жаловался на то, что у него закончился бензин после этого.

Мне удалось воспроизвести проблему с web3.js, что означает, что ошибка возникает из-за контракта (а не из вашей реализации JS).

      const contract = new web3.eth.Contract(jsonAbi, '0xdaa17a5f60E94d5f97968aa1E790c164e65c97Be');
const result = await contract.methods.vaultSize(0).call(); // throws "execution reverted"

Код Solidity ожидает, что адрес будет реализовывать, но значение равно 0x0. Нет контракта на нулевой адрес.

Итак, когда контракт требует store.isD2Vault(vauldId), он ожидает boolответ, но он его не получает. Итак, звонок не удался.

Решение: установите store ценность для реализации IXStore интерфейс, и этот откат будет решен.

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

Другие вопросы по тегам