Raydiumまとめ
メジャーな🏢Solana DEX.
Basic Info
- site: https://raydium.io/
- doc: https://docs.raydium.io/raydium/
- medium: https://medium.com/@raydium
- github: https://github.com/raydium-io
- dashboard: https://solscan.io/protocol/raydium
- $RAYがDAO Token
🪣Raydium CLMM
Raydiumの🔖CLMM.
- かつてはAmmV3と呼ばれていたものがCLMMになった.
- Liquidtyは v6なので, Raydium Liqidity Pool v6ともいえる.
- doc: https://docs.raydium.io/raydium/~/changes/RaVY5reeE9b0iaInst59/liquidity-providers/providing-concentrated-liquidity-clmm
- spec: https://github.com/raydium-io/raydium-docs/blob/master/dev-resources/raydium-clmm-dev-doc.pdf
- CLMMのLPはAMMの LPとは別. 言い換えればSOL-USDCの取引をするときに2つのLPがある.
dev
CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK
- github: https://github.com/raydium-io/raydium-clmm
- sdk: https://github.com/raydium-io/raydium-sdk/tree/master/src/clmm
- program: https://solscan.io/account/CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK
- program: https://github.com/raydium-io/raydium-amm/tree/master
- 2023/12年末に突如公開?!
quote
https://github.com/raydium-io/raydium-sdk-V2/blob/master/src/raydium/tradeV2/trade.ts#L949
poollist
https://api.raydium.io/v2/ammV3/ammPools
errors
https://github.com/raydium-io/raydium-clmm/blob/master/programs/amm/src/error.rs
No enough initialized tickArray
computeAmountOutの延長で発生. 板がスカスカで発生. inputを小さくすれば計算できる.
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
🪣Raydium CPMM
Raydium CP/CP-Swap. Standard AMM. 🪣Raydium OpenBook AMMのリバイバル.
dev
- prog: CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C
- PDAs
- ammConfig: D4FPEruKEHrG5TenZ2mpDGEfu1iUvTiqBxvpU8HLBvC2
- observationState
- poolState
poolkeys
- getPoolKeys: poolIdを指定してpoolkeysをapiv3で取得.
PoolState
- poolState:
- programからのPDA.
- poolId: programId, ammconfig, mintA/mintBからのPDA address?
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)
poolInfoのリストはapiとrpcの2つの手段がある. APIでないとTVLやvol24hはついてない?
- api:
- /pools/info/ids: id指定
- /pools/info/list: 一括取得 https://api-v3.raydium.io/pools/info/list?poolType=standard
- poolType=standardだとOpenbook/CPが混ざっているのでprogramIDでフィルタが必要.
- 一回のpage size=1000にして10page取得すれば両方を取得できそう.
- sdk: https://github.com/raydium-io/raydium-sdk-V2/blob/1f561635657033eee72a16b09b07b84e6f4b5cfa/src/raydium/cpmm/cpmm.ts#L62
- layout: https://github.com/raydium-io/raydium-sdk-V2/blob/1f561635657033eee72a16b09b07b84e6f4b5cfa/src/raydium/cpmm/layout.ts#L18
pool ceation
fee accountの監視.
https://solscan.io/account/DNXgeM9EiiaAbaWvwjHj9fQQLAX5ZsfHyvmYUNRAdNC8
sdk
- https://github.com/raydium-io/raydium-cp-swap
- https://github.com/raydium-io/raydium-sdk-V2/tree/master/src/raydium/cpmm
- examples:
🪣Raydium OpenBook AMM
Raydium Liquidty Pool V4.
- doc: https://docs.raydium.io/raydium/
- SOL-USDC: https://solscan.io/account/58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2
<2024-05-18 Sat 10:41>
あたらしいCP-Swapに対して”OpenBook AMM”というように区別されてよばれるようになった. むかしはstandard AMM Poolと呼ばれていたけど, 今はCPのほうがStandard AMMになってる.
Program
- Liquidity Pool AMM(Raydium Liquidity Pool V4): https://solscan.io/account/675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8
- AmmId: Pool Keys Id
PoolInfo
- endpoint: https://api.raydium.io/v2/main/pairs
- format: sdkのREADMEにある. https://github.com/raydium-io/raydium-sdk/
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
- poolinfo ui: https://api.raydium.io/v2/sdk/liquidity/mainnet.ui.json
- 死んでるプールをまびいてるのかも?
- poolinfo ui: https://api.raydium.io/v2/sdk/liquidity/mainnet.ui.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くらい足りない.
- layout https://github.com/raydium-io/raydium-sdk-V2/blob/125b060927a21294ea001ab95ea06c34e662ee1e/src/raydium/liquidity/layout.ts#L9
- この方式でgetProgramAccountをたたくとammIdのみを全部取得できる? https://github.com/raydium-io/raydium-sdk-V2/blob/931214f2fbc9faf900695aef933552b240712761/src/raydium/tradeV2/trade.ts#L326
Serum/OpenBookとの関係
🏢Serum, serumMarketKeysと呼ばれる6つの情報.
- SerumMarket: これはOpenbookに振られてるPoolのIDに一致する.
- marketIdをgetAccountInfoで取得してderive, MARKET_STATE_LAYOUT_V3
- serumBids: marketBids:
- serumAsks: marketAsks
- serumEventQueue: marketEventQueue
- serumCoinVaultAccount: marketBaseVault
- serumPcVaultAccount: marketQuoteVault
- https://github.com/raydium-io/raydium-sdk-V2/blob/931214f2fbc9faf900695aef933552b240712761/src/raydium/tradeV2/trade.ts#L1146
- serumVaultSigner: marketAuthority
- marketid, marketProgramIdからderive
- ammIdをgetAccountInfoで取得して marketid, marketProgramIdは取得可能.
- getAssociatedPoolKeys, https://github.com/raydium-io/raydium-sdk-V2/blob/931214f2fbc9faf900695aef933552b240712761/src/raydium/liquidity/utils.ts#L95
- getSerumAssociatedAuthority, https://github.com/raydium-io/raydium-sdk-V2/blob/931214f2fbc9faf900695aef933552b240712761/src/raydium/liquidity/serum.ts#L15
- marketid, marketProgramIdからderive
🎴Raydium Amm 新規Pool監視
- websoccket: https://github.com/raydium-io/raydium-sdk-V1-demo/blob/master/src/subNewAmmPool.ts
- Raydium documentページにココ観てねとかいてあった.
- onchain:
- python - Fetch newly listed created pairs on Raydium - Solana Stack Exchange
- examples
- https://github.com/niluke/raydium_sniper_rs
- shit coinをとりあえず最速でsnipeするbot.
- https://github.com/niluke/raydium_sniper_rs
- https://github.com/danbayk/solana-spl-token-sniper/blob/master/strategy1/start1.js
- quicknode: geyserでデータを受信してinitialize2のログを検出.
- bitqueryからデータ受信, https://ide.bitquery.io/Latest-Radiyum-V4-pools-created_1
- enoify: https://www.eonify.space/eonstream
- Pool Temp Lpのトランザクション履歴解析
- https://solscan.io/account/7YttLkHDoNj9wyDur5pM1ejNaAvT9X4eqaYcHQqtj2G5, 250123で賞味期限きれた. Tempということか?!
- cacheは新規プールが乗ってないのでAPIか
- cacheされたlistはリアルタイムではない. SolanaチェーンからgetProgramAccounts, websocketしたり, APIで取得したり.
- openTimeがcreatePool時間.
🏢Raydium PERPs
- 25/01/10 Launched.
- 🏢Orderly Network/ORDERのPoolをつかう.
- 🏢CLOB DEX
- 🏢PERP DEX
- doc: https://docs.raydium.io/raydium/raydium-perps/perp-trading
- そもそも国の法律でアクセス制限が多いことに驚く.
Raydium Stable AMM
未調査.
- Raydium Stable AMM(Raydium doc)
- Raydium liquidity popl AMM(solscan)
🔧Raydium Program
- address list: Raydium - Addresses
- Liquidity Pool AMM(Raydium Liquidity Pool V4): https://solscan.io/account/675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8
- AmmId: Pool Keys Id
- Raydium Concentrated Liquidity: https://solscan.io/account/CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK
- Raydium AMM Routing: routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS
- https://solscan.io/account/routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS
- これを低額Feeでつかっているのはbotとかmever. UIからつかってない.
- Raydium Authority v4: https://solscan.io/account/5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1
- これはなんの機能なんだ?最近できた?
CPI
IDLがみあたらない.
Accounts
typeとかがみつからない.
v4AMM
- program: https://solscan.io/account/675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8
- accounts
🔧Raydium SDK
- typescript: https://github.com/raydium-io/raydium-sdk
- documentけっこう雑.
- demo: https://github.com/raydium-io/raydium-sdk-V1-demo/
- pdf spec: https://github.com/raydium-io/raydium-docs/tree/master/dev-resources
- How to Use Raydium SDK to Build a Swap — Part 1 | by Abby Low | Medium
- How to Use Raydium SDK to Build a Swap — Part 2 | by Abby Low | Medium
- ver4=amm/ver6=clmm/ver7=cpmm
Raydium Programとやり取りするための情報は, getAccountInfoで取得してからsdkをつかってformatするのがよい.
PoolKeys
PoolKeysはProgramのInputとなるMap情報.
たいていの場合はcacheされている情報をつかう.
- amm v4: https://api.raydium.io/v2/sdk/liquidity/mainnet.json
- clmm: https://api.raydium.io/v2/ammV3/ammPools
チェーンからアカウント情報を取得してsdkでパースしてもできる.
- amm v4: https://github.com/raydium-io/raydium-sdk-V1-demo/tree/master/src/formatAmmKeys.ts
- clmm: https://github.com/raydium-io/raydium-sdk-V1-demo/blob/master/src/formatClmmKeys.ts
PoolInfo
PoolKeysを元にオンチェーンからアカウント情報を取得して構築する情報. このpoolInfoの取得結果を元にローカルで価格計算が可能となる.
- amm/cpmm: https://api.raydium.io/v2/main/pairs
- clmm: https://github.com/raydium-io/raydium-sdk-V1-demo/blob/master/src/getClmmPoolInfo.ts
Raydium API
v3が最新. <2024-06-05 Wed>
- endpoint: https://api-v3.raydium.io/
- doc: https://api-v3.raydium.io/docs/
- src: https://github.com/raydium-io/raydium-ui-v3/
- https://github.com/raydium-io/raydium-sdk-V2/blob/1f561635657033eee72a16b09b07b84e6f4b5cfa/src/api/url.ts#L75
- sdkからのapi叩き方例: https://github.com/raydium-io/raydium-sdk-V2/blob/1f561635657033eee72a16b09b07b84e6f4b5cfa/src/api/api.ts
v2
liquidity and pairs API 5 times per minute.
Raydium Quote
価格をローカル計算. computeAmountOut.
価格をローカル計算(AMM)
SDKをつかってLP情報から価格をローカルで計算する.
- PoolKeysを取得
- Liquidity.fetchInfoでメタ情報取得
- Liquidity.computeAmountOutで計算
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]}
- LP Lists: https://api.raydium.io/v2/sdk/liquidity/mainnet.json
- official
- unofficial
- lpMintでtypeごとにfilterする
- refs
- https://github.com/abbylow/raydium-swap/blob/8223909aa57e4034dccfd06e98b63710811044dc/src/utils/index.ts#L35
- https://github.com/b9b4ymiN/wtBot/blob/2cc6d1e661ff4ae93676b525c747daa44b33cb8a/ts/getProgramAccounts.ts#L69
- https://github.com/venusgalstar/SolanaBot/blob/d3744f9f266bc5d42725a600446ac6e9cac62321/modules/pool_keys.ts#L7
Liquidity.computeAmountOut
- https://github.com/venusgalstar/SolanaBot/blob/master/modules/compute.ts
- https://github.com/solarbitrage/solarbitrage/blob/3684f54186dde4cd5c2509be47854bfd85a291ea/common/src/raydium-utils/raydium-rate-funcs.ts
- https://github.com/b9b4ymiN/wtBot/blob/2cc6d1e661ff4ae93676b525c747daa44b33cb8a/ts/compute.ts#L56
- https://github.com/marcellinamichie291/CryptoBot/blob/42ce7edc972be6c9db9badb4e96eee7bb2d8597b/src/Main/DexClients/RaydiumSwaps/RaydiumSwap.ts#L48
価格をローカル計算(CLMM)
ネットに転がっているサンプルコードはほとんどv4でありCLMMでないことに気づいた.
raydium-sdkをつかう
- demoのコードをみるのがいい, https://github.com/raydium-io/raydium-sdk-V1-demo
- https://github.com/raydium-io/raydium-sdk/blob/dfb0e4e8e047c17dd14651bdf6070372f9d8ee68/src/clmm/clmm.ts#L3692
- https://github.com/raydium-io/raydium-sdk/blob/master/src/clmm/utils/pool.ts#L16
- https://github.com/raydium-io/raydium-sdk/blob/master/src/clmm/utils/math.ts#L442
- https://github.com/kokiez/raydium-convert-SOLorTokens/tree/main
- pythonは珍しい.
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に頼らずに独自計算している, いや関数名が同じなのでコピペしているだけかも.
- https://www.npmjs.com/package/@jup-ag/raydium-clmm-sdk
- https://github.com/jup-ag/raydium-clmm-sdk/blob/main/src/amm.ts
- https://github.com/jup-ag/raydium-clmm-sdk/blob/main/src/utils/math.ts#L605
Raydium Swap
- ui: https://github.com/raydium-io/raydium-ui/blob/master/src/utils/swap.ts
- sdk: https://github.com/raydium-io/raydium-sdk-V1-demo/blob/master/src/swapRoute.ts
Raydium AMM Routingをつかう
sdk TradeV2 Class
v2Amm/CLMMの呼びわけ, 🎨ストラテジパターン Class.
- ComputeAmountAoutAmmLayout: https://github.com/raydium-io/raydium-sdk/blob/3601f7f827aec90db49efaba3b1f1dcaec018d51/src/tradeV2/trade.ts#L54
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ができないので.
🎴AMM/CLMMの Token Pairを求めるには?
getProgramAccountsしてparse.
RaydiumはどうやってAddressLookupTableAccountを用意している?
おそらくALTを作成するアカウント.
https://solscan.io/account/RayZuc5vEK174xfgNFdD9YADqbbwbFjVjY4NM8itSF9
AmmIdとLoopupTableAccount addressの対応は不明. 現状poolkeysのcacheをみるしかない. APIでもわからない.
findLookupTableAddress
web UIのソースより.
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://solscan.io/account/2immgwYNHBbyVQKVGCEkgWpi53bLwWNRMB5G2nbgYV17
entryは24個しかはいってないようだ.