solana_central/pumpswap/
get_pumpswap_pool_from_accountinfo.rs

1use crate::constants::PUMP_CONSTANTS;
2use crate::constants::PUMP_SWAP_FEE_VAULTS;
3use crate::protocol_idls::pumpswap::PumpAmmPoolAccount;
4use crate::types::pool::Pool;
5use crate::types::pools::Pools;
6use crate::types::pumpswap_pool::PumpswapPool;
7use borsh::BorshDeserialize;
8use solana_sdk::pubkey::Pubkey;
9use spl_associated_token_account::get_associated_token_address;
10
11impl PumpswapPool {
12  /// Create a Pumpswap pool from on-chain account data
13  ///
14  /// Parses the account buffer and derives associated fee vault and creator vault addresses.
15  pub fn from_account_info(pubkey: Pubkey, account_buffer: &[u8]) -> Self {
16    let decoded_layout: PumpAmmPoolAccount =
17      PumpAmmPoolAccount::try_from_slice(&account_buffer[0..300])
18        .expect("Failed to deserialize PumpSwap pool account");
19
20    // Randomly pick one of the known fee vaults – same logic as the TS code.
21
22    /*
23    Compute the associated token account that will receive protocol fees. On pumpswap, all fees are
24    collected in the quote token, so we use the quote mint.
25    */
26    let fee_vault_token_account =
27      get_associated_token_address(&PUMP_SWAP_FEE_VAULTS[0], &decoded_layout.quote_mint);
28
29    let (coin_creator_vault_authority, _) = Pubkey::find_program_address(
30      &[b"creator_vault", decoded_layout.coin_creator.as_array()],
31      &PUMP_CONSTANTS.pump_swap_program,
32    );
33    let coin_creator_vault_authority_token_account =
34      get_associated_token_address(&coin_creator_vault_authority, &decoded_layout.quote_mint);
35
36    Self {
37      info: Pool {
38        pool_address: pubkey,
39        token_a_address: decoded_layout.base_mint,
40        token_b_address: decoded_layout.quote_mint,
41        pool_type: Pools::PumpswapAmm,
42        token_a_vault_address: decoded_layout.pool_base_token_account,
43        token_b_vault_address: decoded_layout.pool_quote_token_account,
44      },
45      pool_creator: decoded_layout.creator,
46      coin_creator: decoded_layout.coin_creator,
47      fee_vault: PUMP_SWAP_FEE_VAULTS[0],
48      fee_vault_token_account,
49      // These are fetched lazily later.
50      token_a_vault_amount: 0,
51      token_b_vault_amount: 0,
52      coin_creator_vault_authority,
53      coin_creator_vault_authority_token_account,
54    }
55  }
56}