Solana MEV botまとめ

⛓Solana(SOL)でなんかやる🤖MEVbot.

Index

DApp specific bot

🤖Solana Arbitrage MEV

Solanaにおける🤖Arbitrage MEVまとめ. Solana Atomic Arb.

💡Solana Atomic Swap構築

📝Atomic Swapをつくるには? 複数Txをひとつにまとめたい.

Solanaの仕様に基づいていろいろ苦労する

  • バイナリをdeserializeしてmessageを取り出す.
  • messageをdecompileしてinstructionsを取り出す.
  • instructionsをまとめる
  • messageにコンパイル.
  • txをserializeしてバイナリ変換.

Jito Bundleをつかう

🔧Jito BundlesはJito-solanaの機能のひとつ.

❓Solana Atomic Arbではスマコンを記述する必要はある?

TBD, 調査中. こういうやつ.

Building an arbitrage bot: Automated Market Makers and Uniswap V2 (article 1/n) | by Emile Amajar | Jun, 2023 | Block Magnates

ChatGPTによると, 場合によるらしい.

ただし、特定のビジネスロジックや条件(例: 「実行中に利益が出なかったらトランザクションを失敗させる」)を実装したい場合は、カスタムのSolanaプログラム(スマートコントラクトに相当)を作成することが必要になります。このカスタムプログラム内で、アービトラージの条件やロジックをチェックし、それに基づいてトランザクションの成功または失敗を決定することができます。

具体的には、アービトラージの利益を計算し、所定のしきい値以上の利益が得られるかどうかを確認するロジックをプログラム内に実装することになります。利益が期待値を下回る場合や、その他の失敗条件が満たされる場合には、プログラムはエラーを返し、トランザクションはロールバックされます。

要するに、Solana の基本的なトランザクション機能だけでアトミック・アービトラージの基本はカバーできますが、特定の条件やロジックを組み込みたい場合はカスタムプログラムの作成が必要です。

自前Programの例

Solanaarbitrage.com

手動アビトラ x 監視bot

botは開発に時間かかるので事件系は手動.

🤖Solana Liquidations MEV

🤖Liquidation MEV

Drift Protocol

marginfi

Mango Markets

Solend Liquidators

🏢Solend

🤖Solana Sniper MEV

Solana 🎴Liquidity Sniping

Solanaトークン上場戦bot. New listing sniper bot.

;; https://github.com/vobruno/Solana-Raydium-Token-Sniper-Bot

snipe tokens listed in the DEX Raydium, in the Solana network.

SolanaはアーキテクチャがEVMと違い独立国家なので競争が少ない?!

Raydium Pool監視

Solanaチェーンだと🏢Raydiumを監視することになる.

Birdeye監視

birdeyesでみて急激に価格が上がっている(>100%)のが新トークン. たいていはSOLとswapされる, USDCではない.

Jupiter Token Listに登録されるには時間がかかる(数日). token listに登録さないとUIからのswapができない. それなのにbirdeyesでJupiter Platformをつかってswapをしているaddressがbot.

new listing listの24H volでソートしてみつける.

https://birdeye.so/new-pairs?chain=solana


birdeye apiがもうすぐdeplicatedになるかも, DEXScreenerがいいかも.

telegram bot

なんか同じような名前のサービスが多すぎないか?!

🔍Sniperを探せ

BONKBotを使っている人

BONKBotはログに残る.

bloXroute Solana Trader APIを使っている人

🔌bloXroute Solana Trader API

<2025-01-08 Wed 12:05> なんかみんなこれつかってるな…

Solana NFT Mints MEV

Solana NFT Snipter bot.

Examples/OSS

🤖Solana mmbot

🏢Solana CLOB DEXにおけるmarket maker bot.


🎴価格計算/quote取得

AMM DEXからの価格取得は取引所のSDKを使う方法とチェーンからLP情報を取得して算出する方法がある.

❓AMM DEXにおいてswapの価格を取得するとは?

ことSolanaの場合, LP情報がバイナリなのでパースして解析するところがイーサリアムよりも難易度が高い. SDKを使えればそれがよいものの, そうでない場合は自前での解析が必要となる.

  • もし公開されていれば UI のソースコードからトランザクションの構築方法を読み取る
  • ウェブサイトの JavaScript を解読してトランザクションの構築方法を分析
  • トランザクションを実行してみて、Solana Explorer や solscan で内容を精査する

ref. Solana での BOT 開発の概要

http get

LP Poolsからの価格ローカル計算

🔖AMM Curvesの仕様にもとづいて自力計算.


🎴新規トークン検出/新規LP監視

Raydium Pool監視

結局Solanaでは新規トークンはRaydiumに上場する.

🎴Raydium 新規Pool監視

Jupiter Market監視/token list(all)より先に仕掛ける

JupiterのMarket Cacheに追加されると, 自動でそれはJuipterのall token listにも追加されてみんなが取引し始める. MEV的にはそれに追加される前に仕掛けたいところ.

裁定 パスに対応するLPを取得するには?

どうやってMarket(LP)を調べる?

🤖Solana Sniper BotのOSSをみるといろんなチャネルから情報収集している.

Explores

Helius Webhook活用

🎴Route構築

🎨Solana Atomic Arb Patterns

  • 基本はSOL or USDCからはじめる. たまにUSDTを使っている人はいる.
    • token: USDC/SOL
      • sub: USDT/USDH - ニッチだからありか?
  • hop: 2hop/3hop/4hop/5hop/6hop

2hop: SOL->X->SOl/USDC->X->USDC

もっとも基本的なパターン. たいていのトークンは必ずSOL/Xのペアで流動性プールをもつ.

  • SOL->X->SOl
  • USDC->X->USDC

2hop: DEX内閉路

DEX内Cyclic というパターンもある. たとえばRadiumにはSOL->RAYが複数あったりする. それらをうまく接続すると閉路になる.

3hop: USDC->SOL->X->USDC

あるDEXはSOL-Xのペアがあって別のDEXはX-USDCがある場合は, 3hopのrouteを構築しないとtxを通すことができない.

USDC->SOL->X->USDCのrouteをひっくり返して逆にたどるとSOL baseも探索していることになる. SOL->X->USDC->SOL.

ただしSOLよりもUSDCのほうがstableなのでUSDCを基軸にしたほうがいいかも.

3hop: USDT route

ほとんどのトークンはUSDC/SOLとのペアがおおいが, 3番目としてUSDTがある. ここを狙う.

3hop: 両端がUSDC/SOLではない流動性プール route

X-YがどちらもSOL/USDCでないケース.

  • USDC->X->Y->USDC
  • SOL->X->Y->USDC

こういう流動性プールで取引量がそこそこあるのはたいていJupiter SwapかAtomic Arbをしている人のどちらか.

4hop: 両端がUSDC/SOLではないLP x 2

X-YがどちらもSOL/USDCでなくかつ, あるDEXではSOL-X, 別のDEXではY-USDCの場合. このケースでは4hopしないとサヤがとれない.

  • USDC->SOL->X->Y->USDC

4hop: 両端がUSDC/SOLではないLP x 3

ここまでくるとスピード勝負ではない. 計算が大変なので. ゆっくり網羅的に探す.

  • USDC->X->Y->Z->USDC
  • SOL->X->Y->Z->SOL

5hop

<2025-01-09 Thu 12:16> 推論では5hopをする必要がないんだけど、実際に構築してみると、たまに大きなサヤがとれる(しばしば独占して大きな利益!)のでなぜか考えている. 計算コストが大きくて普段は動かせない. どうもwrapped tokenを経由するrouteがとれる気がするが気のせいか?また、5hop/6hopは競合が極端に少ないのも事実. しかし、5hopでないととれないサヤがわからないな. 研究中.

Jupiter market.cacheに乗らないLPを探す

🔧cache.jup.ag/markets

Raydium CLMM Pool

Meteora Valut

SolscanにRaydiumしか表示されてないのにMeteoraでswapできる?

PLZという新規トークンがSolscanからみるとRaydiumにのみ表示される. JupiterからもRaydiumのpathのみがでる. しかし, Raydium-MeteoraのpathでAtomic Arbをしているアカウントがいた. これはいったいどういうことだろう?

https://solscan.io/token/JAmcJfhcJXrAP2neAHwBhajjmqUqPQt8Nyc42WH4LpUx#markets


MeteoraのサイトからPLZを検索するとLPがでてきる. これはどういうこと?

https://app.meteora.ag/pools/CnwdHuakpVBsesuUAWxhBdX9rTi6nXp6AxP5GMJcdThc

さらにしばらくするとJupiterでSwap可能になった.

🏢Meteora

SOL/USDC/USDTから外れたLPを探す

たいていのプールはSOL/USDC/USDTとのペアだ. しかし, たまにへんなpairのPoolがある. それらは大抵の場合はTVLが小さい謎のPoolなのだが, そこのpathがよくarbで通過することがおおい.

Jupiter quoteでUSDCをinputにすると奇妙なpathがみつかることはある.

BUMBLE-USDB: https://solscan.io/account/8C4LAMW1Ut3fnwkT5NN3PJeFrNxsAAJZwBga8bGe5BYY

24h volumeはないがTVLはあるLPを探す

24時間以内に取引がないとそのまま誰も取引されずに放置されるプール. ただしTVLがあるというこは, ここにトークンが預けられているということで, swapは可能.

たまに忘れらされたとんでもない宝があったりする. ただし大抵の場合はそんなことはなく単なる徒労に終わる.

🎴AddressLookupTables調達

📝Address Lookup Tables/ALT

VersionedTransactionつかうことは当然の前提として, txのサイズを1232 bytesに収めるためにどうするべきか? みんなALTをどこから調達しているの?

Txサイズ調査方法

  • JSの場合, オブジェクトサイズはlength関数で調べる.
  • simulateTransactiondでサイズオーバーはtxを通してくれない.

Jupiter Cacheから調達

🔧Jupiter market.cacheから調達. params->addressLookupTableにある.

各Marketのpoollistから調達

たとえばRaydium系はPoolKeysにlookupTableAccountsにアドレスがある場合がある(ない場合もある). AuthorityはこれRayZuc5vEK174xfgNFdD9YADqbbwbFjVjY4NM8itSF9.

各Marketの片ペアを調査

2つのPairの片方のtokenを含む別LPのALTがわかっているならばそれを利用する. mint keyやvault keyが被っているので.

各MarketのSOL/USDCで代替

最後の手段. event authoryとかが被っているので.

自前で準備

  • createAddressLookupTable
  • extendAddressLookupTable

🎴Swap実行/tx送信

🔌bloXroute Solana Trader API

CEXでトレードするようにAPIを叩いてトレード. これならSolanaの複雑な仕組みをしらなくてもトレード可能.

🤖Solana Cross-Chain MEV

💡Multihop SwapsのためにJupiter APIを利用

🔌Jupiter Swap APIを利用すると, multihop swapが構築できる. Solscanをみると Jupiter Aggregator v4でSwapしている人がとても多いが, 理由はおそらくこれ.

ref. https://github.com/jito-labs/mev-bot/blob/master/src/build-bundle.ts

The Jupiter program is used because it supports multi-hop swaps, which are necessary for executing the arbitrage route.

🔧jito-labs/mev-botはv4を利用していたがv6でもできた.

Solana MEVで最適なCommitment Levelは?

JitoやDriftのBotサンプルはtx送信でprocessed

どうもprocessedをつかっているな… ログをとるときはconfirmed.

5%程度のdropは仕方ないという判断か?

transaction process statusはfinalizedが先に処理される?

transaction process statusはprocessed/confirmed/finalizedがある. defaultがfinalized. どれがいいのか検討中.

ChatGPT的にはprocesse->finalizedの順に処理されるのでprocessed/confirmedをおすすめされたが, solscanで確認するとfinalized->processedの順に処理が並ぶところが直感に反する. ChatGPTに相談すると表示はSolscanの仕様かもとのこと.

processedを指定すると5%くらいがtx消失するらしいのでconfirmedあたりが無難か?

🎴入力量最適化

amountは大きければ大きいほど利益が大きいが, それは線形ではない. ただ小さい単位, たとえば1ドルを2ドルにする程度ならば線形.

  • 最適化しない.
  • AMM方式ならば自力計算は難しくない.

Topics

💡Solana Bot開発の流れ

強botterの研究してみた, magito氏がsolana mmbotをつくる軌跡の観察.

;; https://twitter.com/regolith1223/status/1459167224758140929

①Solanaチェーンの基本仕様を理解する(→Solana/Web3.jsを使いこなせるようになる)

②SerumDEXや各AMM等の基本仕様を理解する(→各DappのClientを実装できるようになる)

③Rustを学びつつ②を追求する(→各Dappに対応した独自コントラクトを開発できるようになる)

みたいな流れでした。

💡SOLを直接ipnutTokenにつかうとSolscanでbalanceがわからない

SOLをAtomic arbに利用すると, Solscanでは損益計算でSPL Transfersではなく, SOL Transfersに表示される. 他のトークンと違い, SOLだけ管理が別なのである.

すると, SolscanではSOL balanceの変更履歴が表示されない. SOLではなくWSOLがいいのかも.

どうもクリプタクトからSolana walletに接続する機能がそもそもない.

🔦Solana MEVは取引手数料が安いからSpam botなりがち

<2024-07-01 Mon 12:16> あまりにDDoS spam botがSolanaネットワーク 全体の問題となり, 最近はほぼ全滅させられれたようにみえる. Priority feeをちゃんと支払うかJito をつかうか.


Solana tx発行コストが0.000005 SOL (= 1銭くらい)なので, atomic arbを行うspam botが多い.

🤔tx送信からconfirmedまで数十秒かかるので自分の先のtxであとのtxが失敗することもある

サヤを検出してTxを送信してarbitrageが成功するまで数十秒(30秒くらい)かかる. その間に再び価格取得をしてtxを送信しても, 先に送信した自分のtxであとの自分のtxが失敗することもある.

🤔Solana Txの裁定執行コストと裁定tx成功確率を考慮する

Solana Txの執行コストは0.000005 SOL. これは, SOL/USDC = 20程度のrateを仮定すると, 0.0001 USDC程度となる.

SOL/USDCでCyclic Arbをしようとしたとき, 0.0001 USDC程度の鞘は常に発生しているのだが, これを取りに行くとコスパ負けする. txは必ず通るとは限らない.

Solanaは執行コスト, いいかえればガス代がEVMに比べてとても安いとはいえ, それでもコスパを考えてTxを発行しないと気づいたら損をしている.

Solana LPの評価方法

  • TVL: Token locked:
    • 保有している2つのトークンをドル換算して足したもの.
  • TVL pair比率
    • 正常ならば1:1になる.
  • 流動性はあるか?
    • Volume24h
    • Last trade

TVLがあればお金がLockされているということ

TVLがあればそこにはお金がlockされているということ. たとえ24時間のVolumeがない場合でも, まれに他のpoolと比較したときに大きな乖離があることがある.

PoolInfoの中でTVLの文字がない場合は,

  • liquidity
  • current_price x 基軸通貨のresered Volume x 2 で概算.

Issues

未解決, 調査中の課題.

CoingeckoとJupiterの関係は?

JupiterでよくWarningでCoingeckoと乖離があります!と表示がある.

coingeckoのpublic APIで取得しているようだ.

https://api.coingecko.com/api/v3/simple/price?ids=wrapped-solana,dogwifcoin&vs_currencies=usd

Raydium v4とOpenBookは同一の流動性プール?

Solscanをみると大抵の場合Raydium/OpenBookの2つが並んでいるが取引 PlatformはRaydiumでしかされてないようにみえる. これはどういうこと?

🏢OpenBook


おそらく同一pool. 本物のPoolの流動性はTVLで表示されていて, solscanだとsortをつかうと見える.

VaultでSwapするとはどういうこと?

JupiterがMeteoraでSwapしている, これはなにをしているのだ? KaminoはJupiterに対応していないが同じことは可能なのか?

Insights

🤔SkipPreflightはfalseがいいのか?

Txを送信するときのオプションとしてskipPreflightがある. これは言い換えるとトランザクションシミュレーションであり, 事前にTxが失敗しないかどうかチェックする機能.

これを有効にすると, もしTxがオンチェーンにのってから失敗した場合のコスト0.000005 SOLを払う必要がない. 一方, チェーンに乗るまでにdelayが生じる.

とくに速度が必要なsniper/arbはfalseがいいかも. 他の戦略はわからない.

🤔Atomic ArbではsendTransactionのmaxRetriesは0が推奨か?

たとえばAtomic Arbitrageだと, 鞘がなくなってslippageのエラー終了でtxが通らない場合, その後にリトライしても無駄なことが多い.この場合は手数料がかかる.

ProgramのエラーでもNodeはリトライをする仕様のようだ. そのため, retryを無効にしたほうがいいかも.

何も設定しないと, blockhashがfinalied or expiresされるまでNode でリトライされる仕様.

ref. https://docs.solana.com/api/http#sendtransaction

🔗References


🏢ARB Protocol(ARB)

Atomic ArbのOSSプロジェクト.


  • <2024-06-06 Thu 13:00> 若干胡散臭いものの1年前から継続的にコードはupdateされている. 中の人のやる気はみえる. コードはなんかあまりきれいじゃないけど.

🔍Explores/Dashborad

Trading Pairの24H Volumeが重要指標.

🤖BONKbot

🤖Telegram Trading Bot for Solana.

BONKbotは内部でJitoをつかってる?

https://solscan.io/tx/2bAoGy7QigDhrzrFruKP7WvXpJxv5DCqF2rhpGCXReDDd5bkXAngagWwEWHuesQdfqBNQmHCL11zaPQAZ1XBhreX

Program log: Memo (len 137): “BONKbot MEV-Protect transaction priority tip for 2488HSfXczcJB6k9VMYwudCjJxPLSLi1Q2Zbz5fGTSvuPPWoAzP7G64r4grUvgM48XvfCdAcpSWLHfZyEXwx1LhM”

ChorusOne: Solana-MEV

ChorusOneというdAppsの中の人のSolana MEVのPOC.

sample codes

atomic arb.

with JavaScript

with Rust

with Jupiter SDK

🏢Jupiter Aggregator

jup-ag/core はdeplicatedなので注意.