Web3.py使っていて出たエラー

スポンサーリンク

PythonでDifiのBotを作ったときにWeb3関連で出たエラーと自分用メモ。

 

スポンサーリンク

エラーと対応

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」から書かれているアドレスへ移動。

Just a moment...

↓これ

Just a moment...

 

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〜

通貨の残高を紹介しようとした際に発生。

通貨のコントラクトアドレスを指定できていなかった。

 

web3.exceptions.TimeExhausted: Transaction HexBytes('トランザクション') is not in the chain, after 120 seconds

購入、売却処理で発生。原因は様々だと思われる。トランザクションが規定時間内に通らなかった。

私の場合、

①売却しようとしている通貨がウォレットに残高が不足している

②対象通貨をApproveできていない。

③Approve済みの通貨に対して再度Approveしようとしたとき。

などだったと思う。処理の内容を改善するしか無い。

③ではApprove済みかどうかを事前確認できればいいが、方法がわからない…。

 

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アドレスを取得するところでエラーとなることがあった。

lpAddr = QuickSwapFactoryContract.functions.getPair( USDC, JPYC ).call()

仕方が無いのでちょくにアドレスを入力することでエラーを回避。

lpAddr=web3.toChecksumAddress(“0x205995421C72Dc223F36BbFad78B66EEa72d2677”)

ValueError: {'code': -32000, 'message': 'replacement transaction underpriced'}

アプローブ時や売買時の関数でガス代を安く指定しすぎ?

error: replacement transaction underpriced
Im trying to send a raw transaction using web3 to ropsten testnet and Im getting this error: replacement transaction und...

ガス代を増やしたところ、うまくいくようになった。

適切なガス代を調べる方法は、わからない…。

 

トランザクションが失敗し、トランザクションを確認すると、「Status:」が

「Fail with error ‘TransferHelper: TRANSFER_FROM_FAILED’」になっている。

 

スクリプト上は異常終了せず、トランザクションの結果として異常終了のステータスが返される。

Just a moment...

でトランザクションを確認したところ、上図のような状態。正直何もわからない。

今回の場合、

①Matic(ガス代)がウオレットにない

②スワップしようとしている通貨残高がウォレットに無い。

③スワップする通貨の数量指定が間違っている

④指定の通貨がアプローブできていない

があったのではと思われる。

今回原因はわかったものの、明示的にどこかに書いてほしい。

トランザクションのステータスコードから判別ができるかもしれないが、

今のところはわからない…。

③について補足すると、

取引所のルーターコントラクトアドレスの「swapExactTokensForTokens」ファンクションに指定する「amountIn」引数に指定する数量については、通貨により桁数が決められている。

すべて「Wei」の数で指定するものと思っていたので、小数点以下の非常に小さな数を指定してしまっていた。

Ethereumについての記事だが、以下が参考になった。残高取得の項にて小数点以下の桁数を取得して計算している。

[ERC20トークン]web3の使い方とサンプルコード - Qiita
はじめにethereumやそのトークンにアクセスするためのWebAPIライブラリといえばweb3ですよね。最近だいぶこいつと仲良くなったので、備忘録として使い方をメモしておきます。イーサリアム…

④について補足すると、

以下のURLに記載があった。

Fail with error 'TransferHelper: TRANSFER_FROM_FAILED' · Issue #46 · Nafidinara/bot-pancakeswap
Hi there. getting "Fail with error 'TransferHelper: TRANSFER_FROM_FAILED'" error while sending transactions along with m...

別の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’}

原因について以下が参考になった

トランザクションの nonce は from アカウントの sequence である - Qiita
問題web3.js の sendSignedTransaction を使って同じアカウントから連続で複数回他のアカウントに送金しようとしたら、2目以降のトランザクションはどうしてもエラーでした。…
スポンサーリンク
Python仮想通貨技術的なこと雑記帳
Heywaをフォローする

コメント

タイトルとURLをコピーしました