solana_central/meteora/
get_meteora_ammpool_from_accountinfo.rs

1use crate::CentralContext;
2use crate::meteora::get_meteora_vault_from_token_address::get_meteora_vault_from_token_address;
3use crate::protocol_idls::meteora::MeteoraAmmPoolIdl;
4use crate::types::meteora_amm_pool::MeteoraAmmPool;
5use crate::types::pool::Pool;
6use crate::types::pools::Pools;
7use borsh::BorshDeserialize;
8use solana_sdk::pubkey::Pubkey;
9use std::sync::Arc;
10
11impl MeteoraAmmPool {
12  /// Create a Meteora AMM pool from on-chain account data
13  ///
14  /// Parses the account buffer using the Meteora AMM pool IDL structure and creates
15  /// vault references for both tokens. The vaults are looked up or created via the
16  /// central context cache.
17  pub fn from_account_info(
18    pubkey: Pubkey,
19    account_buffer: &Vec<u8>,
20    central_context: Arc<CentralContext>,
21  ) -> Self {
22    let decoded_layout: MeteoraAmmPoolIdl =
23      MeteoraAmmPoolIdl::try_from_slice(account_buffer).unwrap();
24    let token_a_address: Pubkey = decoded_layout.token_a_mint;
25    let token_b_address: Pubkey = decoded_layout.token_b_mint;
26    let token_a_vault =
27      get_meteora_vault_from_token_address(&token_a_address, central_context.clone());
28    let token_b_vault =
29      get_meteora_vault_from_token_address(&token_b_address, central_context.clone());
30    let token_a_vault_address = token_a_vault.read().unwrap().vault;
31    let token_b_vault_address = token_b_vault.read().unwrap().vault;
32
33    Self {
34      info: Pool {
35        pool_address: pubkey,
36        token_a_address,
37        token_b_address,
38        pool_type: Pools::MeteoraAmm,
39        token_a_vault_address,
40        token_b_vault_address,
41      },
42      enabled: decoded_layout.enabled,
43      token_a_vault,
44      token_b_vault,
45      token_a_fee_address: decoded_layout.protocol_token_a_fee,
46      token_b_fee_address: decoded_layout.protocol_token_b_fee,
47      token_a_lp_vault_address: decoded_layout.a_vault_lp,
48      token_b_lp_vault_address: decoded_layout.b_vault_lp,
49      trade_fee_numerator: decoded_layout.fees.trade_fee_numerator as u128,
50      trade_fee_denominator: decoded_layout.fees.trade_fee_denominator as u128,
51      protocol_trade_fee_numerator: decoded_layout.fees.protocol_trade_fee_numerator as u128,
52      protocol_trade_fee_denominator: decoded_layout.fees.protocol_trade_fee_denominator as u128,
53
54      /*
55      Going to leave these as dummy values for now, if we need to actually fetch them we will fetch
56      them.
57      */
58      token_a_lp_amount: 0,
59      token_b_lp_amount: 0,
60    }
61  }
62}