调用只读方法时,遇到 UNPREDICTABLE_GAS_LIMIT
开发以太坊应用时,调用只读方法时遇到类似以下内容的报错信息:
ERROR Error: Uncaught (in promise): Error: cannot estimate gas; transaction may fail or may require manual gas limit (error={"code":-32000,"message":"execution reverted"}, method="call", transaction={"to":"0xE6183d3094b9r360B121Ec1330afAE76A74d1cbF","data":"0xdb699765000000000000000000000000b2b7bedd7d7fc19804c7dd4a4e8174c4c73c220d0000000000000000000000000000000000000000000000000de0b6b3b7640000000000000000000000000000000000000000000000000000000000006c915aef"}, code=UNPREDICTABLE_GAS_LIMIT, version=providers/5.0.24)
at d.makeError (main.a577643548eb15e6832e.js:1)
at d.throwError (main.a577643548eb15e6832e.js:1)
at Z (main.a577643548eb15e6832e.js:1)
at $e.<anonymous> (main.a577643548eb15e6832e.js:1)
at Generator.throw (<anonymous>)
at a (main.a577643548eb15e6832e.js:1)
at l.invoke (polyfills.797d13e303959ed8dd77.js:1)
at Object.onInvoke (main.a577643548eb15e6832e.js:1)
at l.invoke (polyfills.797d13e303959ed8dd77.js:1)
at a.run (polyfills.797d13e303959ed8dd77.js:1)
at Z (polyfills.797d13e303959ed8dd77.js:1)
at polyfills.797d13e303959ed8dd77.js:1
at a (main.a577643548eb15e6832e.js:1)
at l.invoke (polyfills.797d13e303959ed8dd77.js:1)
at Object.onInvoke (main.a577643548eb15e6832e.js:1)
at l.invoke (polyfills.797d13e303959ed8dd77.js:1)
at a.run (polyfills.797d13e303959ed8dd77.js:1)
at polyfills.797d13e303959ed8dd77.js:1
at l.invokeTask (polyfills.797d13e303959ed8dd77.js:1)
at Object.onInvokeTask (main.a577643548eb15e6832e.js:1)
看到上面这样的信息,十有八九会让开发者摸不着头脑,但最可能的原因是:调用了合约中不存在的方法。这种情况在 ethers.js
搭配 Human-Readable ABI
时尤其容易出现:比如因手抖而导致的拼写错误。
检查调用地址(上文中的 to
)对应的合约中是否有要调用的方法并进行修改:
方法名是否错误,即调用地址和合约方法不匹配
方法参数是否错误
方法名最后是否带有分号等其他符号,注意:只需复制字符串内容即可,不要把其他符号复制进来。以下是对比:
function testMethod(uint256) public view returns (uint256)
function testMethod(uint256) public view returns (uint256);
若对 ethers.js
的 Human-Readable ABI
不熟,可以参见:
为何这里专门强调只读方法,这是因为一般情况下这个错误根本不应该发生:没有任何交易发送,怎么可能会需要有预估 gas limit
之类的东西。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!