liquidity.ts 5.2 KB

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