solana_central/raydium/
get_raydium_cpmm_pool_from_accountinfo.rs

1use crate::protocol_idls::raydium::CpmmPoolInfoIdl;
2use crate::raydium::get_cpmm_fee_amount_from_config_account::get_cpmm_fee_amount_from_config_account;
3use crate::types::pool::Pool;
4use crate::types::pools::Pools;
5use crate::types::raydium_cpmm_pool::RaydiumCpmmPool;
6use borsh::BorshDeserialize;
7use solana_sdk::pubkey::Pubkey;
8
9impl RaydiumCpmmPool {
10  /// Create a Raydium CPMM pool from on-chain account data
11  ///
12  /// Parses the account buffer and looks up the fee rate from the config account.
13  pub fn from_account_info(pubkey: Pubkey, account_buffer: &[u8]) -> Self {
14    let decoded_layout: CpmmPoolInfoIdl = CpmmPoolInfoIdl::try_from_slice(account_buffer).unwrap();
15    let fee_fraction_lp = get_cpmm_fee_amount_from_config_account(decoded_layout.amm_config, &pubkey);
16    Self {
17      info: Pool {
18        pool_address: pubkey,
19        token_a_address: decoded_layout.token_0_mint,
20        token_b_address: decoded_layout.token_1_mint,
21        pool_type: Pools::RaydiumCpmm,
22        token_a_vault_address: decoded_layout.token_0_vault,
23        token_b_vault_address: decoded_layout.token_1_vault,
24      },
25      pool_config_account: decoded_layout.amm_config,
26      observation_state_account: decoded_layout.observation_key,
27      // Account layout doesn't contain vault balances, so we set them to 0
28      token_a_vault_amount: 0,
29      token_b_vault_amount: 0,
30      // Initialize accumulated fees from the decoded pool state
31      protocol_fees_token_a: decoded_layout.protocol_fees_token_0,
32      protocol_fees_token_b: decoded_layout.protocol_fees_token_1,
33      fund_fees_token_a: decoded_layout.fund_fees_token_0,
34      fund_fees_token_b: decoded_layout.fund_fees_token_1,
35      creator_fees_token_a: decoded_layout.creator_fees_token_0,
36      creator_fees_token_b: decoded_layout.creator_fees_token_1,
37      fee_fraction_lp,
38    }
39  }
40}