まじでわからない。
かなり苦労したけど、なんとかsolanaのonchainで動くProgramをデプロイしたり、アカウント内のamountをCPI前後で監視して、利益の出ないtxだったらfailさせたり、逆に利益が出るんだったらsuccessさせたり…
みたいな基本的な制御は実装できるようになっていて、そろそろ取引所対応か…となったところで、どうやるんだこれとなってた。
愚直に実際に動いているサービスからswapを行って、そのtxからアカウントを特定するというのは出来なくもないけど、これが対応取引所を増やしていったり、はたまた対応トークン数を増やしていったりしたときにベストな方法とは一ミリも思えない。
話を聞くに数万トークンに対応している人もいるようなので、どう考えても自動的にアカウントを特定する方法がなければそんな事はできないように思う。
持つ情報は取引したいトークンのmint addressとswapのProgram Addressまでで、あとはシステマチックに特定できるというのが最も良いように思う
ただやっぱいくら考えてもわかんないんだよなぁ……
例えば適当に引っ張ってきた上のようなtx
この部分を見るとOrca のswapプログラムを実行していることがわかるんだけど、input Accountsに並ぶアカウントの特定方法が不明
TokenSwapは調べた感じ、ペアアドレスなんだけどそもそもこれの特定方法も不明なんだよな……。
Authorityは割と謎アカウントで、特定ペアのプールを保持しているアカウントっぽい?
User Transfer Authorityはinstructionの署名者で、PDA使ったり、このtxの場合は大枠のtxがあって、そのinner instructionとして実行されているから、大本のtxのsignerでも問題ないっぽい。(なのでここは特定できる)
User Sourceは自分のfromのトークンアカウントなので特定可能(find_program_addressとかする)
Pool SourceはOrcaのfromのトークンアカウント(というかプール)で、特定できてない。
Pool DestinationはOrcaのtoのトークンアカウントで、特定できていない
User Destinationは自分のtoのトークンアカウントなので特定可能
Pool Mintもだいぶ謎。後のFee Accountを作るのに使われてる
Fee Accountは名前的にFee支払いそうだけど、別に払ってない。なんでか途中でMintToしてる。
TokenInstruction in spl_token::instruction - Rust
要は新たにトークンを作っているということ。イメージ的にはPool Mintに紐付くアカウントがFee AccountでPool Mintはトークンと捉えてもいいかも。そのトークンがFee Accountに生成される感じ。
つまり、謎のトークンがswapする際に生成されているわけなんだけど、まじで意味不明。キレそう
---
とまあこんな感じで謎が多い。ただこれでも愚直に扱いたいペアでswapを正規で行って、そのtxからプログラムに組み込むこと自体はやはり可能ではある。何度か実行したり、他botのtx見て確認したりもできるし。
ただやっぱその方法はプログラマーとは思えないスーパーデータ入力マンになってしまうのでできれば避けたいなという気持ち。
個人的にはどうしてオンチェーンで必要アカウントを特定していないかがポイントだと思っていて、もしかしたらsolana_client::rpc_client::RpcClientあたりをうまく使えば特定できるものがあるのかもしれないと思ったりしてた。
例えばget_program_accountsでswapプログラムを指定すれば、おそらくペアアドレスは特定できるはず。ただペアアドレスを特定できても画像でいうと、"9B9ZcYT8jDQ6XLe6gRLDCFv1zz3uHVKdbZT9DFhsYSQW"とかの時点で詰むんだよな…こいつsolscan見た限りだとowner持ってないし……
って上書いててふと思いついた方法で探してみたら特定できたわ…。やっぱoutput大事……。(find_program_addressでペアアドレスとorcaのswapプログラムを指定)
"9B9ZcYT8jDQ6XLe6gRLDCFv1zz3uHVKdbZT9DFhsYSQW"特定できたら、こいつがownerのアカウントを特定すればそれなりに行けそうな気もするな。あとはpool mintとfee accountか……。