PythonでDifiのBotを作ったときにWeb3関連で出たエラーと自分用メモ。
エラーと対応
1
Traceback (most recent call last): File "DifibotMethodtest_Matic.py", line 38, in <module> balance = contract.functions.balanceOf(metamaskaddress2).call() File "/Users/user/Library/Mobile Documents/com~apple~TextEdit/Documents/python/BitconBotTest/BitconBotTest/lib/python3.7/site-packages/web3/contract.py", line 196, in __getattr__ "Are you sure you provided the correct contract abi?" web3.exceptions.ABIFunctionNotFound: ("The function 'balanceOf' was not found in this contract's abi. ", 'Are you sure you provided the correct contract abi?')
USDCの残高表示をしようとした場合に出力。
ABIファイルの内容に該当の関数がない。ABIファイルが間違っている。
↓の「Read as Proxy」から書かれているアドレスへ移動。
↓これ
2
web3.exceptions.ExtraDataLengthError: The field extraData is 97 bytes, but should be 32. It is quite likely that you are connected to a POA chain. Refer to http://web3py.readthedocs.io/en/stable/middleware.html#geth-style-proof-of-authority for more details. The full extraData is: HexBytes〜
通貨の残高を紹介しようとした際に発生。
通貨のコントラクトアドレスを指定できていなかった。
3
web3.exceptions.TimeExhausted: Transaction HexBytes('トランザクション') is not in the chain, after 120 seconds
購入、売却処理で発生。原因は様々だと思われる。トランザクションが規定時間内に通らなかった。
私の場合、
①売却しようとしている通貨がウォレットに残高が不足している
②対象通貨をApproveできていない。
③Approve済みの通貨に対して再度Approveしようとしたとき。
などだったと思う。処理の内容を改善するしか無い。
③ではApprove済みかどうかを事前確認できればいいが、方法がわからない…。
4
web3.exceptions.InvalidAddress: ('Web3.py only accepts checksum addresses. The software that gave you this non-checksum address should be considered unsafe, please file it as a bug on their platform. Try using an ENS name instead. Or, if you must accept lower safety, use Web3.toChecksumAddress(lower_case_address).', '0xdd9185db084f5c4fff3b4f70e7ba62123b812226')
以下を参照した。
https://github.com/ethereum/web3.py/issues/740
https://stackoverflow.com/questions/57335994/trying-to-call-balanceof-function-in-ethereum-using-web3-py-library-but-getting
次のように、いつもtoChecksumAddress関数を利用して格納したほうが良さそう。
「dbAddress = web3.toChecksumAddress(‘アドレス’)」
21/10/17追記 toChecksumAddress関数を使っていても以下のLPアドレスを取得するところでエラーとなることがあった。
仕方が無いのでちょくにアドレスを入力することでエラーを回避。
5
ValueError: {'code': -32000, 'message': 'replacement transaction underpriced'}
アプローブ時や売買時の関数でガス代を安く指定しすぎ?
ガス代を増やしたところ、うまくいくようになった。
適切なガス代を調べる方法は、わからない…。
6
トランザクションが失敗し、トランザクションを確認すると、「Status:」が
「Fail with error ‘TransferHelper: TRANSFER_FROM_FAILED’」になっている。
スクリプト上は異常終了せず、トランザクションの結果として異常終了のステータスが返される。
でトランザクションを確認したところ、上図のような状態。正直何もわからない。
今回の場合、
①Matic(ガス代)がウオレットにない
②スワップしようとしている通貨残高がウォレットに無い。
③スワップする通貨の数量指定が間違っている
④指定の通貨がアプローブできていない
があったのではと思われる。
今回原因はわかったものの、明示的にどこかに書いてほしい。
トランザクションのステータスコードから判別ができるかもしれないが、
今のところはわからない…。
③について補足すると、
取引所のルーターコントラクトアドレスの「swapExactTokensForTokens」ファンクションに指定する「amountIn」引数に指定する数量については、通貨により桁数が決められている。
すべて「Wei」の数で指定するものと思っていたので、小数点以下の非常に小さな数を指定してしまっていた。
Ethereumについての記事だが、以下が参考になった。残高取得の項にて小数点以下の桁数を取得して計算している。
④について補足すると、
以下のURLに記載があった。
別のtokenではありますが、
Check if you have been approve your wbnb
wbnbを承認したかどうかを確認します
僕の事例にも合致していました。
2021/10/21 追記
tokenのコントラクトアドレスをみてアプローブのファンクションがない場合、Web3からアプローブできなかった。サイトから一度スワップしてみてアプローブされているか確認してみたほうが良さそう。該当トークンを主にしてスワップしようとすると、アプローブを求められる。
7
ValueError: {'code': -32000, 'message': 'nonce too low'}
アプローブ処理時に発生。原因不明。
すでにアプローブされていたから?かもしれない。
GUIから対象通貨をスワップしてみたが、アプローブするかきかれなかった。
ネットで検索すると、nonce値をひとつづつ上げていくとあったが、
試してみても状況変わらず。
→よくよく確認したところ、指定した秘密鍵が間違っていた。馬鹿なのか?馬鹿なんですね。
8
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='rpc-mainnet.matic.quiknode.pro', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x103e847f0>: Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known'))
インターネットにつながっていなくて、RPCサーバに接続できなかったときに発生。当然接続して再実施。
9
Transaction HexBytes(‘0xf5554e1ad39850cf35eb3d94c908bbdd67475cf8ae5bd1df8fc2fae2dde3a772’) is not in the chain, after 120 seconds
10
ValueError: {‘code’: -32000, ‘message’: ‘already known’}
11
ValueError: {‘code’: -32000, ‘message’: ‘replacement transaction underpriced’}
原因について以下が参考になった
コメント