solana_central/central_context/
insert_pool.rs1use crate::central_context::central_context::CentralContext;
2use crate::constants::SOLANA_PROGRAMS;
3use crate::types::pool::PoolTrait;
4use std::collections::HashMap;
5use std::sync::{Arc, RwLock};
6
7impl CentralContext {
8 pub fn insert_pool(&self, pool: Arc<RwLock<dyn PoolTrait>>) {
14 let result_unlocked = pool.read().unwrap();
15 let token_a_address: &solana_sdk::pubkey::Pubkey = result_unlocked.token_a_address();
16 let token_b_address = result_unlocked.token_b_address();
17 if *token_a_address == SOLANA_PROGRAMS.system_program
19 || *token_b_address == SOLANA_PROGRAMS.system_program
20 {
21 return;
22 }
23 if token_a_address == token_b_address {
25 return;
26 }
27 let mut markets = self.markets.write().unwrap();
30
31 markets
33 .entry(token_a_address.clone())
34 .or_insert_with(|| HashMap::new());
35 markets
36 .entry(token_b_address.clone())
37 .or_insert_with(|| HashMap::new());
38
39 let markets_a = markets.get_mut(token_a_address).unwrap();
41
42 if let Some(existing_markets) = markets_a.get(token_b_address) {
44 existing_markets.write().unwrap().push(pool.clone());
45 } else {
46 let a_b_markets = Arc::new(RwLock::new(vec![pool.clone()]));
48 markets_a.insert(token_b_address.clone(), a_b_markets.clone());
50 let markets_b = markets.get_mut(token_b_address).unwrap();
51 markets_b.insert(token_a_address.clone(), a_b_markets);
52 }
53
54 let mut token_accounts_map = self.pools_map.write().unwrap();
56 token_accounts_map.insert(*result_unlocked.token_a_vault_address(), pool.clone());
57 token_accounts_map.insert(*result_unlocked.token_b_vault_address(), pool.clone());
58 token_accounts_map.insert(*result_unlocked.pool_address(), pool.clone());
59 }
60}