solana_central/meteora/
get_meteora_dbc_from_accountinfo.rs1use crate::protocol_idls::meteora::{DbcPoolConfig, DbcVirtualPool};
2use crate::types::meteora_dbc::ActivationType;
3use crate::types::meteora_dbc::{BaseFeeMode, MeteoraDbc};
4use crate::types::pool::Pool;
5use crate::types::pools::Pools;
6use borsh::BorshDeserialize;
7use solana_sdk::pubkey::Pubkey;
8
9impl MeteoraDbc {
10 pub fn from_account_info(
11 pubkey: Pubkey,
12 account_buffer: &[u8],
13 dbc_pool_config: &DbcPoolConfig,
14 config_address: Pubkey,
15 ) -> Self {
16 let dbc_virtual_pool = DbcVirtualPool::try_from_slice(account_buffer).unwrap();
17 Self {
18 pool: Pool {
19 pool_address: pubkey,
20 token_a_address: dbc_virtual_pool.base_mint,
21 token_b_address: dbc_pool_config.quote_mint,
22 token_a_vault_address: dbc_virtual_pool.base_vault,
23 token_b_vault_address: dbc_virtual_pool.quote_vault,
24 pool_type: Pools::MeteoraDbc,
25 },
26
27 config: config_address,
28
29 sqrt_price: dbc_virtual_pool.sqrt_price,
30
31 base_reserve: dbc_virtual_pool.base_reserve,
33 quote_reserve: dbc_virtual_pool.quote_reserve,
34
35 cliff_fee_numerator: dbc_pool_config.pool_fees.base_fee.cliff_fee_numerator,
36 base_fee_number_of_periods: dbc_pool_config.pool_fees.base_fee.first_factor,
37 base_fee_period_frequency: dbc_pool_config.pool_fees.base_fee.second_factor,
38 base_fee_reduction_factor: dbc_pool_config.pool_fees.base_fee.third_factor,
39
40 base_fee_mode: if dbc_pool_config.pool_fees.base_fee.base_fee_mode == 0 {
41 BaseFeeMode::Linear
42 } else if dbc_pool_config.pool_fees.base_fee.base_fee_mode == 1 {
43 BaseFeeMode::Exponential
44 } else {
45 BaseFeeMode::Linear
46 },
47 activation_point: dbc_virtual_pool.activation_point,
48 volatility_accumulator: dbc_virtual_pool.volatility_tracker.volatility_accumulator,
49 variable_fee_control: dbc_pool_config.pool_fees.dynamic_fee.variable_fee_control,
50 activation_type: if dbc_pool_config.activation_type == 0 {
51 ActivationType::Slot
52 } else {
53 ActivationType::Time
54 },
55 }
56 }
57}