はじめに
EVMチェーンにトランザクションを送ろうとした時、
謎の cannot estimate gas
エラーに遭遇したこと
あなたもありませんか?
具体的なエラー理由も特に出てこないし、どう直していいかわからない。。
そんな経験でデスクを濡らしたことのある人も多いかと思います。
もうそんな思いをしなくてもいいために、解決法をまとめました。
チェック項目一覧
コントラクトアドレスとABIは正しいか
そもそも存在しないアドレスを指定してました、とかよくあります。
特にプロキシ利用時は下記注意です。
- Implementationでは無く、Proxyコントラクトを指定しているか
- ABIが最新のImplementationのものになっているか
関数セレクタは正しいか
hoge(uint256)
とhoge(uint256,uint256)
は違う関数です。
同じ関数名でも、引数の型が完全に一致していないと呼び出せません。
特に引数に構造体を指定する時は完全一致しているか念入りに確認しましょう。
RPC Nodeサービスを利用しているか
ChainListとかにのってるパブリックRPC URLを使用すると繋がらないことがよくあります。これ知らなくてQA前に徹夜した
無料でも一定回数は使えるRPCノードサービスがあるので、基本はそれ使ってください。
個人的には ChainStack がコスパよくておすすめ。
あと、wss://
ではじまるURLを使ってる場合はhttps://
のものに直すと安定したりします。
チェーン指定は正しいか
メインネットとテストネットでIDが違います。
ChainListで確認してください。
RPC URLもチェーン毎に異なるので注意。
GasLimitを一旦30000000にしてみる
call時のgasLimitはデフォルトで 21000 が指定されていますが、
割と簡単にオーバーしがちです。
開発中であれば、{ GasLimit: 30000000 }
に変更して通るか試し、
その後適切に調整していくと楽です。
Gasが十分にあるか
Gasを支払うための残高が不足している可能性もあります。
エラートランザクションのトレースを見てRevert理由を確認
トランザクションの途中でRevertしている可能性もあります。
Foundryを利用している場合は、
cast run
コマンドを利用するとトランザクションのトレースが見れます。
トレースのエラー箇所に0xa1b2c3d4
のようなエラーセレクタが出てくるので、
先頭の 0x
を除いた英数字をABI内で検索すれば
エラー内容を特定することができます。
参考:
まとめ
Dapps開発はどんどん便利になっていっています。
これからも情報を出し合って、日本に風穴を開けるWeb3をどんどん盛り上げていけたら嬉しいです!
それでは良い開発ライフを⭐︎