アビトラbotを稼働させていたところ、やけにsolが減少することがあった。
Done Analyticsでクエリを作成し、ウォレットのsol変動を確認してみたところ、なぜか0.00203928sol減少するケースが有ることがわかった。
また、-0.00203928solされたあとに+0.00203928solされていることもあり、より挙動の意図がわからなかった
solscanのトランザクションのログから調べてみたところCreateAccountでtransaction feeとして徴収されていることがわかった
「CreateAccountって何してるんだ?」と思って調べてみた。
これはwalletに紐付く特定トークンのアドレスを作成するもので、そのときにRentとして0.00203928sol徴収されるようだった。
RentはAccount(アドレス単位という捉え方でいい気がする)作成時に、そのデータを保持するためのコストとして徴収されるもの。2年間分まとめて払うのが基本らしい
そのコストがちょうど0.00203928solだった。
アビトラbotでは、現在walletと紐ついていないトークンを扱うこともあるので、その場合交換時にそのtokenを保持するためのAccountが作成される。このときにRentとして0.00203928solが徴収される。
この0.00203928solはCloseAccountすることで戻ってくるため、通過するだけの通貨であればcreate -> closeでコストはゼロとなる。
現在の仕様上、usdc -> x, x -> usdcとトランザクションを2つに分けている。そのため1つ目のusdc -> xのときにxのAccountがcloseされない(というかできない)
1つ目と2つ目のトランザクションは独立しているため、2つ目のトランザクションが不要となったトークンのAccountをクローズすることが出来ない。そのため永続的に-0.00203928solされてしまっている。
というのが-0.00203928の謎の答えだった。
当面は手動でクローズする他無いような気がした。この辺の最適化は自分でProgram(EVMでいうコントラクト)をかけるようになってからかなという気持ち。
おわり