見出し画像

0.01 SOL で始める Atomic Arbitrage

これはなに?

Atomic Arbitrage には興味あるけど、何をしていいかわからない...
そんな人のためのコンテンツです。

想定読者

pe さんの記事を読んで「デプロイだけで8SOL!!!???」になった人

まだ読んでない人はこの機会に読みましょう

儲かるのか

発展性◎(儲かるならそもそも記事にしない)

なぜ 0.01 SOL なのか

スワップの際に必要なトークンアカウントを作るのに、最低 0.00203928 SOL デポジットする必要があるから

補足: Rent

The fee deposited into every Solana Account to keep its associated data available on-chain is called "rent".

https://solana.com/ja/docs/core/fees#rent

Solana のアカウントモデルではオンチェーンにデータを置いておくために "rent" が必要になる
つまり「プログラムのバイナリ」や「トークンアカウントの残高」を保持しておくのにも幾らかの SOL が必要になる

例1)Jupiter Aggregator v6 の Executable Data (バイナリ)は 2,892,224 Bytes で、Rent は 20.13 SOL

例2)USDC などのトークンアカウントのサイズは 165 Bytes で、Rent は0.00203928 SOL

余談:バジルさんの記事が面白かったので貼っておきます

免責 (by ChatGPT)

本記事で紹介している Atomic Arbitrage の手法は、あくまで情報提供を目的としており、特定の投資アドバイスを行うものではありません。暗号通貨取引には市場変動や技術的リスクが伴うため、実行には十分な調査と準備が必要です。

取引の結果に関しては、全てご自身の責任で行っていただくようお願いいたします。万が一、損失や不具合が発生した場合でも、筆者は一切の責任を負いかねますことをご了承ください。

さらに、本記事の内容は執筆時点の情報に基づいており、将来的な市場状況や技術の進展により内容が変更される可能性があることを予めご理解ください。


本質

お手本を探して真似する

solscan を眺めていると流れてくる tx の例

方針

「ルート探索フェーズ」と「tx 作成フェーズ」の二段階

オンチェーンからデータを持ってきて価格を計算するのは大変
→ 価格を比較して一番良いものを教えてくれる API を使う(Jupiter API )

プログラムを自前でデプロイすると初期投資が重くなる
→ 逆に言えば「誰かがデプロイしてくれたもの」を使えば rent は不要
→ Jupiter のプログラム(Aggregator v6)を使う

https://solana.com/ja/docs/intro/dev#high-level-developer-overview から引用

上の図における Client 側(左)を実装することになる
(Solana Network 側(右)は誰か(=今回は Jupiter の運営)がデプロイしてくれたものを使う)

Jupiter

ルート探索

Jupiter API を使う

適当なトークンを選んで wSOL → token と token → wSOL の二回に分けてクエリを投げる
一つ目のクエリの outAmount を二つ目のクエリの amount に渡して、二つ目のクエリの outAmount がもともとの amount より大きくなれば OK
(実際にはガス代以上増えてないと赤字)

余談:Atomic Arbitrage をしたいからといって inputMint と outputMint の両方に同じトークンを指定するとエラーになる

すみません

Instruction 作成

これはクエリを投げるだけ

/swap と /swap-instructions があるが後者のほう

Instruction 合成

wSOL → token と token → wSOL を合成して一つにする(どうやって?)

Solana の Instruction は Program ID, Accounts, Data の三要素からなる

Program ID

どちらも Jupiter Aggregator v6 なのでそのまま

Accounts

まず適当な tx を solscan で探してくる

グッと睨むと、実は先頭九個のアカウントの下に Cross Program Invocation (CPI) で使うアカウントが並べられていることがわかる

「#4 - Jupiter Aggregator v6: route」の Input Accounts(の一部)
「#4.1 - Meteora DLMM Program: swap」の Interact With と Input Accounts

最初の九個の部分は solscan を見ながらいい感じにして、その後ろに「一つ目のアカウントから先頭九個を取り除いたもの」と「二つ目のアカウントから先頭九個を取り除いたもの」を順に並べればいい。

Data

命令に渡す引数をシリアライズしたもの(バイト列)

https://explorer.solana.com より

solscan で表示されるものは solscan 側でデシリアライズしている
(右上の <> Raw ボタンでデシリアライズ前と切り替えられる)

#4 - Jupiter Aggregator v6: route のデシリアライズされた Instruction Data の一部
これだけ見てもなんとなく Atomic Arbitrage みがある

以下の手順で wSOL → token と token → wSOL を一つの命令に合成する

  1. /swap-instructions で取ってきた data をデシリアライズする

  2. くっつける

  3. inputIndex やら outputIndex やらをいい感じにする

  4. シリアライズし直す

シリアライズ/デシリアライズに必要な IDL(後述)は solscan からダウンロードするなり Anchor を使って fetch するなりする

Jupiter Aggregator v6 の IDL の一部

注意:anchor の 0.30.0 に破壊的変更が入って互換性がなくなっている
(そんなことしたらダメだろ(v0 だからセーフか?(Solana はいつまで beta を名乗るつもりなんだ?)))

(2025/1/27 追記) solscan から取れるものは 0.30.1 に更新されている

補足: Interface Description Language (IDL)

クライアント側とオンチェーン側の間を繋ぐための言語
Solana でのデータのシリアライズ/デシリアライズに広く使われている

まとめ

Jupiter 最高!

有料部分

俺もクリプトインフルエンサーを目指して有料 Note を売ろうかなって

内容

  • コード (NodeJS + TypeScript)

    • 実際に tx を送るところまで(170 行)

    • 環境構築パートがあるので動かすのに多少手間取るかも

      • solana-cli と ts-node を使う

  • おまけ

    • トークンの選び方

    • この記事の次にやること

「環境の違いで動かない」等があってもサポートはしません
お金と時間が余ってる人だけ買ってください(+僕に寄付したい人)

(2025/1/27 追記) Jupiter の IDL のバージョンが上がった影響で動かなくなっている可能性があります(更新予定はありません)

solana-cli と ts-node の環境構築パートは yugure さんの記事が参考になります(丸投げ)

ここから先は

11,435字 / 1画像

¥ 500

この記事が参加している募集

この記事が気に入ったらチップで応援してみませんか?