EVMならなんとかできる気がした
※コードとか適当に書いてるので細かいとこ抜けてたりすると思います、例えばs抜けてたり、リンク貼っとくので詳しくはそっち読んでください
詰まったところ
情報探すの割りとムズい気がしたのでこの初歩レベルですら優位性な気がするけど、まあこれぐらいならいいやの精神
ABI
Contract Application Binary Interface(ABI)とは - アルゴリズムとかオーダーとか
俺もあんまり良くわかってないので雑にしか説明できないんだけど、DEXの特定の通貨ペアは特定のcontract addressから情報を取得できる
そのcontractを叩くためには上のABIが必要という感じ
ABIは通貨ペアのcontract addressから取得可能。具体的には例えばuniswapのeth usdtペアなら
https://etherscan.io/address/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852#code
こっからになる。(Contract ABIってやつ)
web3.pyで書くならabi.jsonで保存して、json.loadで読み込むのが早いかなーと思った。
1contractに1ABIある感じなのかはちょっとわかんない。何となくだけどchain単位とか何かしらの枠組み単位では同じな気がしている(未検証)
通貨ペアの価格取得
なにげに詰まった
web3pyからcontract叩いたら、getReserves()で取るのが正解な気がした(ほかもっといいやり方あったらよければコメントください)
その後reserve0とreserve1を割ってペア価格求める感じ
で、getReserves()で出てくる値は小数点取り除いた値らしく、それぞれのtoken addressに表記されてるdecimal分で割る必要がある。例えばusdcだったらdecimalが6なので、10**6で割ったりしてた。なんか他のやり方あるかも
あとその辺のcontractに対して用意されてるメソッドは
https://etherscan.io/address/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852#readContract
でチェックできる
スマートコントラクトとは何か? Smart Contractの定義 | block-chain.jp by コンセンサス・ベイス
ちなみにスマコンを叩くとかもこのcontractに対してのメソッドを使うこと言ってるのかなーと思った。わからんけど、スマコンとコントラクトの違い正直わからん、教えて
decimalはtoken0とかでtoken address引っ張れるから、それでcontract叩いて、decimal 引っ張ってくるのがスマートな気もした。abi別途用意必要ならちょっとめんどいけど
あと一個分かんなかったのはペアのアドレスもdecimals持ってる点かな。あれはtotal supplyとかペアが持ってる値を調整するための値なのかな。getReserves()とかでとれるtokenそれぞれの価格はまた別なのかもしれない
通貨ペアの価格取得で困ってること
あるDEXのペア価格の取得作ったら、なんか最新ではないっぽくて、例えば今だと23:30ぐらいなんだけど23:00のペア価格が取れちゃってるっぽいんだよね。厳密に言えば若干更新されてるっぽいけど、DEXに表記されてる価格と若干ずれがある感じ
getReserve()はリストで返ってきて、3つ目の値でブロック(データのこと)のタイムスタンプ(確認したデータの時間のこと、最新かどうかとかわかる)が入ってるんだけど、一応最新ブロックをチェックできるコード実行したら、タイムスタンプ同じだったんだよね
だから計算がおかしいかDEXがおかしいあたりかなーとは思うんだけど、よくわからないというね
その辺詳しい人コードください(嘘です、コメントでいいので一言ください)
---
まあとりあえずDEXの通貨ペア価格取れるようにはなったので、あとは複数DEXの複数通貨ペアのデータ拾っていけば価格乖離の検知botぐらいは作れそう
わかるまではムッズって感じだけど、出来るようになると何に悩んでいたんだって感じですわ
具体的にどんな感じでアビトラするかは伏せておきますが、多少行けそうなところは見つけたのでそれようにコード整形していく感じです
ただ現状コントラクト叩くとそこそこ重いんだよな、そこどーしよ(開発用に使ってるノートPCがおじいちゃんだからかもしれないけど)
とりあえずループで定期的に雑に価格情報取得するような仕組みだけ作ってみて、お試ししてみようかなーという感じです