Raydiumまとめ

メジャーな🏢Solana DEX.

Basic Info

🪣Raydium CLMM

Raydiumの🔖CLMM.

  • かつてはAmmV3と呼ばれていたものがCLMMになった.
  • Liquidtyは v6なので, Raydium Liqidity Pool v6ともいえる.

dev

CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK

quote

https://github.com/raydium-io/raydium-sdk-V2/blob/master/src/raydium/tradeV2/trade.ts#L949

https://github.com/raydium-io/raydium-sdk-V2/blob/86d5b110c3d337af151f809cbeda70001b63f532/src/raydium/clmm/utils/pool.ts#L619

poollist

https://api.raydium.io/v2/ammV3/ammPools

https://github.com/jito-labs/mev-bot/tree/dadb442723e9c72a4f1bcfda55478403376f321f/src/markets/raydium-clmm

errors

https://github.com/raydium-io/raydium-clmm/blob/master/programs/amm/src/error.rs

No enough initialized tickArray

computeAmountOutの延長で発生. 板がスカスカで発生. inputを小さくすれば計算できる.

https://github.com/raydium-io/raydium-sdk/blob/3601f7f827aec90db49efaba3b1f1dcaec018d51/src/clmm/utils/tickarrayBitmap.ts#L86

Invalid tick array

computeAmountOutの延長で発生. 板がそもそもない, 誰も流動性を提供してない. No Token Locked.

https://github.com/raydium-io/raydium-sdk/blob/3601f7f827aec90db49efaba3b1f1dcaec018d51/src/clmm/utils/pool.ts#L39 https://github.com/jup-ag/raydium-clmm-sdk/blob/64e7b669fef817ae8b0e32420db1da25e1219cf7/src/utils/pool.ts#L31

new pool

createPool https://solscan.io/tx/2YzU2jkwVqWjNRndcLzfBjHQpAhJDm1bX7c79kdh2tN78yAqRCuSYsbPEiUiwWmVfcFV28g1FUY1Em2ShxeCnG6y

🪣Raydium CPMM

Raydium CP/CP-Swap. Standard AMM. 🪣Raydium OpenBook AMMのリバイバル.

dev

poolkeys

  • getPoolKeys: poolIdを指定してpoolkeysをapiv3で取得.

https://github.com/raydium-io/raydium-sdk-V2/blob/1f561635657033eee72a16b09b07b84e6f4b5cfa/src/raydium/cpmm/cpmm.ts#L45

PoolState

poolInfo

poolStateに状態(統計情報)を付与したもの. It encapsulates the details of the pool’s configuration, token vaults, LP mint, fees, and observations.

  • poolState: on chainから取得.
  • baseReserve: VaultA addressから取得
  • quoteReserve: vaultB addressから取得
  • price reservesから算出
  • configInfo: AmmConfig(option)

https://solscan.io/account/CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C?accountName=PoolState#acccountsData

https://github.com/raydium-io/raydium-sdk-V2/blob/1f561635657033eee72a16b09b07b84e6f4b5cfa/src/raydium/cpmm/cpmm.ts#L115


poolInfoのリストはapiとrpcの2つの手段がある. APIでないとTVLやvol24hはついてない?


pool ceation

fee accountの監視.

https://solscan.io/account/DNXgeM9EiiaAbaWvwjHj9fQQLAX5ZsfHyvmYUNRAdNC8

sdk

🪣Raydium OpenBook AMM

Raydium Liquidty Pool V4.

Program

PoolInfo

Raydium AMMのプールは圧倒的に他のDEXに比べて数が多いので, この統計情報で死んでるプールを除外してフィルタリングしないとデータ爆発する.

  • quoteMint: 決済通貨, swap in mint
  • baseMint: 主軸通貨, swap out mint
    • price: base価格.
  • liquidtyはTVLではなさそう.
  • poolStateはamm-idをgetAccountInfoで取得した情報をparseしたもののようだ. いいかえればpoolStateからpoolInfoを取り出す.

Poollist cache

  • endpoint: https://api.raydium.io/v2/sdk/liquidity/mainnet.json
  • サーバ上のファイルなのでhttp headリクエストで最終更新時刻が取得できる(api endpointではない).
    • <2024-03-22 Fri 11:40> できなくなった… api endpointになった?
  • 推測では5分間に5回でhttp error=429になる. 5分でアクセス制限解除(retry-after=300).
  • <2024-08-29 Thu 13:38> ここ1週間で新規poolが追加されなくなった. pools=403777, pairs=407603で3000くらい足りない.

Serum/OpenBookとの関係

🏢Serum, serumMarketKeysと呼ばれる6つの情報.

  • SerumMarket: これはOpenbookに振られてるPoolのIDに一致する.

🎴Raydium Amm 新規Pool監視


  • cacheは新規プールが乗ってないのでAPIか
  • cacheされたlistはリアルタイムではない. SolanaチェーンからgetProgramAccounts, websocketしたり, APIで取得したり.
  • openTimeがcreatePool時間.

🏢Raydium PERPs

Raydium Stable AMM

未調査.

🔧Raydium Program

CPI

IDLがみあたらない.

Accounts

typeとかがみつからない.

v4AMM

🔧Raydium SDK


Raydium Programとやり取りするための情報は, getAccountInfoで取得してからsdkをつかってformatするのがよい.

PoolKeys

PoolKeysはProgramのInputとなるMap情報.

たいていの場合はcacheされている情報をつかう.


チェーンからアカウント情報を取得してsdkでパースしてもできる.

PoolInfo

PoolKeysを元にオンチェーンからアカウント情報を取得して構築する情報. このpoolInfoの取得結果を元にローカルで価格計算が可能となる.

Raydium API

v3が最新. <2024-06-05 Wed>

v2

liquidity and pairs API 5 times per minute.

Raydium Quote

価格をローカル計算. computeAmountOut.

価格をローカル計算(AMM)

SDKをつかってLP情報から価格をローカルで計算する.

  1. PoolKeysを取得
  2. Liquidity.fetchInfoでメタ情報取得
  3. Liquidity.computeAmountOutで計算

;; https://abbylow.medium.com/learn-to-build-a-swap-application-with-solana-wallet-adapter-and-raydium-sdk-part-2-244705cb72a3

We almost got every information we need to make the swap transaction! But first, we have to calculate the minimum amount out. Refer to the calcAmountOut function, we use the Liquidity.fetchInfo from Raydium SDK to get the pool information. After that, we use Liquidity.computeAmountOut to get the price and minimum amount out.

https://github.com/raydium-io/raydium-sdk-V1-demo/blob/master/src/swapOnlyAmm.ts

serumMarketKeys

おそらく🏢Serumが破綻したことによるレガシー情報.

この情報はPoolKeysをfetchして加工してつくる.

🔧Jupiter market cache のparamsを参照してもいい. ただし, market.cacheは流動性がないと候補から外されるのでその場合はやはり自力作成が必要.

userKeys

swapする人のwalletとそのATA情報.

Liquidity.fetchInfo

poolInfoを取得する. 通信が発生するのはここ.

このプロシージャでbaseReserve/quoteResereが取得できるので, この情報からAMMの計算式によって価格を計算することが可能となる. 実際はLiquidity.computeAmountOutによって計算.

{"status" #object[BN 6],
 "baseDecimals" 6,
 "quoteDecimals" 9,
 "lpDecimals" 6,
 "baseReserve" #object[BN 344465],
 "quoteReserve" #object[BN 3002589],
 "lpSupply" #object[BN 1000000],
 "startTime" #object[BN 1703603239]}

Liquidity.computeAmountOut

def: https://github.com/raydium-io/raydium-sdk/blob/dfb0e4e8e047c17dd14651bdf6070372f9d8ee68/src/liquidity/liquidity.ts#L2276


価格をローカル計算(CLMM)

ネットに転がっているサンプルコードはほとんどv4でありCLMMでないことに気づいた.

raydium-sdkをつかう

frontendコードを分析する.

https://github.com/raydium-io/raydium-frontend

algolisms

CLMMの計算方法はsdkをみるとわかる. 自力計算は不可能そうな予感がした.

計算方法のPDFみつけた. 命かければ計算できそうだがとりあえずjup-ag/raydium-clmm-sdkが非公開になってつかえなくなるまではやめておこうか…

https://github.com/raydium-io/raydium-docs/blob/master/dev-resources/raydium-clmm-dev-doc.pdf

JupiterのRaydium SDKで計算

https://github.com/jup-ag/raydium-clmm-sdk

  • AMMもCLMMもraydium-clmm-sdk packageに含まれる.
  • pros: Jupiter SKDをつかうと統一IFで操作ができる.
  • cons: 🔧Jupiter market cacheにないPoolでswapできない(価格計算はできる).

raydium-sdkに頼らずに独自計算している, いや関数名が同じなのでコピペしているだけかも.

Raydium Swap

Raydium AMM Routingをつかう

sdk TradeV2 Class

v2Amm/CLMMの呼びわけ, 🎨ストラテジパターン Class.

Topics

🎴Raydium Amm v4/CLMM Cyclic Arb

Raydium AMM RouteのProgramを UIからつかっている人はたいてい高額fee(0.00002)を積んでいるのでsolscanからみて低額Feeならばmeverの可能性がある. Raydium v4/CLMMのDEX内Cyclic Arb.

https://solscan.io/account/routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS

とくにjupiterの🔧Jupiter market.cacheの流動性の基準から外れたCLMMプールのtx履歴はmeversしかいない. なぜならばJuptiterの経由でのswapができないので.

🎴DeFi-Cyclic MEV

🎴AMM/CLMMの Token Pairを求めるには?

https://github.com/raydium-io/raydium-ui-v3/blob/dd22cf7c770beb74edf215d4e234abe120da21c4/src/utils/pool/formatAmmKeys.ts

getProgramAccountsしてparse.

RaydiumはどうやってAddressLookupTableAccountを用意している?

おそらくALTを作成するアカウント.

https://solscan.io/account/RayZuc5vEK174xfgNFdD9YADqbbwbFjVjY4NM8itSF9

AmmIdとLoopupTableAccount addressの対応は不明. 現状poolkeysのcacheをみるしかない. APIでもわからない.

findLookupTableAddress

web UIのソースより.

https://github.com/raydium-io/raydium-ui-v3/blob/dd22cf7c770beb74edf215d4e234abe120da21c4/src/utils/pool/formatAmmKeys.ts#L143

const ltas = await connection.getProgramAccounts(new PublicKey('AddressLookupTab1e1111111111111111111111111'), {
  filters: [{ memcmp: { offset: 22, bytes: 'RayZuc5vEK174xfgNFdD9YADqbbwbFjVjY4NM8itSF9' } }]
})

getProgramAccountをつかうと’RayZuc5vEK174xfgNFdD9YADqbbwbFjVjY4NM8itSF9’の作成したALTをすべて取得することができる. ALTをデコードしてammidが含まれるALTを検索する.

ただし, これでもhitしない場合がある. http getで取得したlistにもALTが含まれてないのでこのケースはおそらくRaydiumはALTを作成してない.

CacheLTA

これはfetchしたデータをcacheしておく(CacheLTA)

https://github.com/raydium-io/raydium-sdk-V2/blob/master/src/common/txTool/lookupTable.ts

2immgwYNHBbyVQKVGCEkgWpi53bLwWNRMB5G2nbgYV17

2immgwYNHBbyVQKVGCEkgWpi53bLwWNRMB5G2nbgYV17はsdkにハードコードされている. default?

https://github.com/raydium-io/raydium-sdk-V2/blob/e51617aa6821c381bb1b418d33f522ba0e44b3bc/src/common/txTool/lookupTable.ts#L37

https://solscan.io/account/2immgwYNHBbyVQKVGCEkgWpi53bLwWNRMB5G2nbgYV17

entryは24個しかはいってないようだ.