liquidity.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import { Commitment, Connection, PublicKey } from '@solana/web3.js';
  2. import {
  3. Liquidity,
  4. LiquidityPoolKeys,
  5. Market,
  6. TokenAccount,
  7. SPL_ACCOUNT_LAYOUT,
  8. publicKey,
  9. struct,
  10. MAINNET_PROGRAM_ID,
  11. LiquidityStateV4,
  12. } from '@raydium-io/raydium-sdk';
  13. import { TOKEN_PROGRAM_ID } from '@solana/spl-token';
  14. import { MinimalMarketLayoutV3 } from '../market';
  15. import bs58 from 'bs58';
  16. import axios from 'axios';
  17. interface LiquidityPool {
  18. id: string;
  19. baseMint: string;
  20. quoteMint: string;
  21. // ... autres propriétés
  22. }
  23. interface LiquidityJsonResponse {
  24. official: LiquidityPool[];
  25. unOfficial: LiquidityPool[];
  26. }
  27. interface MinimalLiquidityAccountData {
  28. id: string;
  29. version: number;
  30. programId: string;
  31. }
  32. export const RAYDIUM_LIQUIDITY_PROGRAM_ID_V4 = MAINNET_PROGRAM_ID.AmmV4;
  33. export const OPENBOOK_PROGRAM_ID = MAINNET_PROGRAM_ID.OPENBOOK_MARKET;
  34. export const MINIMAL_MARKET_STATE_LAYOUT_V3 = struct([
  35. publicKey('eventQueue'),
  36. publicKey('bids'),
  37. publicKey('asks'),
  38. ]);
  39. export async function getAllAccountsV4(
  40. quoteMint: PublicKey,
  41. ): Promise<{ id: string; version: number; programId: PublicKey }[]> {
  42. const url = 'https://api.raydium.io/v2/sdk/liquidity/mainnet.json';
  43. try {
  44. const response = await axios.get<LiquidityJsonResponse>(url);
  45. // @ts-ignore
  46. const json = response.data;
  47. const filteredPools = json.official.concat(json.unOfficial)
  48. .filter(pool => {
  49. if (!pool) {
  50. console.log('Pool undefined:', pool);
  51. return false;
  52. }
  53. return pool.quoteMint && pool.quoteMint === quoteMint.toBase58();
  54. });
  55. return filteredPools.map(pool => ({
  56. id: pool.id,
  57. version: 4,
  58. programId: RAYDIUM_LIQUIDITY_PROGRAM_ID_V4, // Assurez-vous que cette constante est définie
  59. }));
  60. } catch (error) {
  61. console.error('Error during data retrieval:', error);
  62. return [];
  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. }