solana_central/meteora/
get_meteora_dbc_from_accountinfo.rs

1use 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      // Reserve amounts from the virtual pool
32      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}