liquidity.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import { Commitment, Connection, PublicKey } from '@solana/web3.js';
  2. import {
  3. Liquidity,
  4. LIQUIDITY_STATE_LAYOUT_V4,
  5. LiquidityPoolKeys,
  6. Market,
  7. TokenAccount,
  8. SPL_ACCOUNT_LAYOUT,
  9. publicKey,
  10. struct,
  11. MAINNET_PROGRAM_ID,
  12. LiquidityStateV4,
  13. } from '@raydium-io/raydium-sdk';
  14. import { TOKEN_PROGRAM_ID } from '@solana/spl-token';
  15. import { MinimalMarketLayoutV3 } from '../market';
  16. import bs58 from 'bs58';
  17. export const RAYDIUM_LIQUIDITY_PROGRAM_ID_V4 = MAINNET_PROGRAM_ID.AmmV4;
  18. export const OPENBOOK_PROGRAM_ID = MAINNET_PROGRAM_ID.OPENBOOK_MARKET;
  19. export const MINIMAL_MARKET_STATE_LAYOUT_V3 = struct([
  20. publicKey('eventQueue'),
  21. publicKey('bids'),
  22. publicKey('asks'),
  23. ]);
  24. export type MinimalLiquidityAccountData = {
  25. id: PublicKey;
  26. version: 4;
  27. programId: PublicKey;
  28. };
  29. export async function getAllAccountsV4(
  30. connection: Connection,
  31. quoteMint: PublicKey,
  32. commitment?: Commitment,
  33. ): Promise<MinimalLiquidityAccountData[]> {
  34. const { span } = LIQUIDITY_STATE_LAYOUT_V4;
  35. const accounts = await connection.getProgramAccounts(
  36. RAYDIUM_LIQUIDITY_PROGRAM_ID_V4,
  37. {
  38. dataSlice: { offset: 0, length: 0 },
  39. commitment: commitment,
  40. filters: [
  41. { dataSize: span },
  42. {
  43. memcmp: {
  44. offset: LIQUIDITY_STATE_LAYOUT_V4.offsetOf('quoteMint'),
  45. bytes: quoteMint.toBase58(),
  46. },
  47. },
  48. {
  49. memcmp: {
  50. offset: LIQUIDITY_STATE_LAYOUT_V4.offsetOf('marketProgramId'),
  51. bytes: OPENBOOK_PROGRAM_ID.toBase58(),
  52. },
  53. },
  54. {
  55. memcmp: {
  56. offset: LIQUIDITY_STATE_LAYOUT_V4.offsetOf('status'),
  57. bytes: bs58.encode([6, 0, 0, 0, 0, 0, 0, 0]),
  58. },
  59. },
  60. ],
  61. },
  62. );
  63. return accounts.map(
  64. (info) =>
  65. <MinimalLiquidityAccountData>{
  66. id: info.pubkey,
  67. version: 4,
  68. programId: RAYDIUM_LIQUIDITY_PROGRAM_ID_V4,
  69. },
  70. );
  71. }
  72. export function createPoolKeys(
  73. id: PublicKey,
  74. accountData: LiquidityStateV4,
  75. minimalMarketLayoutV3: MinimalMarketLayoutV3,
  76. ): LiquidityPoolKeys {
  77. return {
  78. id,
  79. baseMint: accountData.baseMint,
  80. quoteMint: accountData.quoteMint,
  81. lpMint: accountData.lpMint,
  82. baseDecimals: accountData.baseDecimal.toNumber(),
  83. quoteDecimals: accountData.quoteDecimal.toNumber(),
  84. lpDecimals: 5,
  85. version: 4,
  86. programId: RAYDIUM_LIQUIDITY_PROGRAM_ID_V4,
  87. authority: Liquidity.getAssociatedAuthority({
  88. programId: RAYDIUM_LIQUIDITY_PROGRAM_ID_V4,
  89. }).publicKey,
  90. openOrders: accountData.openOrders,
  91. targetOrders: accountData.targetOrders,
  92. baseVault: accountData.baseVault,
  93. quoteVault: accountData.quoteVault,
  94. marketVersion: 3,
  95. marketProgramId: accountData.marketProgramId,
  96. marketId: accountData.marketId,
  97. marketAuthority: Market.getAssociatedAuthority({
  98. programId: accountData.marketProgramId,
  99. marketId: accountData.marketId,
  100. }).publicKey,
  101. marketBaseVault: accountData.baseVault,
  102. marketQuoteVault: accountData.quoteVault,
  103. marketBids: minimalMarketLayoutV3.bids,
  104. marketAsks: minimalMarketLayoutV3.asks,
  105. marketEventQueue: minimalMarketLayoutV3.eventQueue,
  106. withdrawQueue: accountData.withdrawQueue,
  107. lpVault: accountData.lpVault,
  108. lookupTableAccount: PublicKey.default,
  109. };
  110. }
  111. export async function getAccountPoolKeysFromAccountDataV4(
  112. connection: Connection,
  113. id: PublicKey,
  114. accountData: LiquidityStateV4,
  115. commitment?: Commitment,
  116. ): Promise<LiquidityPoolKeys> {
  117. const marketInfo = await connection.getAccountInfo(accountData.marketId, {
  118. commitment: commitment,
  119. dataSlice: {
  120. offset: 253, // eventQueue
  121. length: 32 * 3,
  122. },
  123. });
  124. const minimalMarketData = MINIMAL_MARKET_STATE_LAYOUT_V3.decode(
  125. marketInfo!.data,
  126. );
  127. return {
  128. id,
  129. baseMint: accountData.baseMint,
  130. quoteMint: accountData.quoteMint,
  131. lpMint: accountData.lpMint,
  132. baseDecimals: accountData.baseDecimal.toNumber(),
  133. quoteDecimals: accountData.quoteDecimal.toNumber(),
  134. lpDecimals: 5,
  135. version: 4,
  136. programId: RAYDIUM_LIQUIDITY_PROGRAM_ID_V4,
  137. authority: Liquidity.getAssociatedAuthority({
  138. programId: RAYDIUM_LIQUIDITY_PROGRAM_ID_V4,
  139. }).publicKey,
  140. openOrders: accountData.openOrders,
  141. targetOrders: accountData.targetOrders,
  142. baseVault: accountData.baseVault,
  143. quoteVault: accountData.quoteVault,
  144. marketVersion: 3,
  145. marketProgramId: accountData.marketProgramId,
  146. marketId: accountData.marketId,
  147. marketAuthority: Market.getAssociatedAuthority({
  148. programId: accountData.marketProgramId,
  149. marketId: accountData.marketId,
  150. }).publicKey,
  151. marketBaseVault: accountData.baseVault,
  152. marketQuoteVault: accountData.quoteVault,
  153. marketBids: minimalMarketData.bids,
  154. marketAsks: minimalMarketData.asks,
  155. marketEventQueue: minimalMarketData.eventQueue,
  156. withdrawQueue: accountData.withdrawQueue,
  157. lpVault: accountData.lpVault,
  158. lookupTableAccount: PublicKey.default,
  159. };
  160. }
  161. export async function getTokenAccounts(
  162. connection: Connection,
  163. owner: PublicKey,
  164. commitment?: Commitment,
  165. ) {
  166. const tokenResp = await connection.getTokenAccountsByOwner(
  167. owner,
  168. {
  169. programId: TOKEN_PROGRAM_ID,
  170. },
  171. commitment,
  172. );
  173. const accounts: TokenAccount[] = [];
  174. for (const { pubkey, account } of tokenResp.value) {
  175. accounts.push({
  176. pubkey,
  177. programId: account.owner,
  178. accountInfo: SPL_ACCOUNT_LAYOUT.decode(account.data),
  179. });
  180. }
  181. return accounts;
  182. }