Я получаю ошибку ограничения газа при вызове 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
интерфейс, и этот откат будет решен.
Обратите внимание, что это большой набор контрактов, поэтому, если он не был должным образом протестирован, вероятно, есть больше логических ошибок, которые могут вызвать другие откаты.