Skip to main content

sol_parser_sdk/accounts/
mod.rs

1pub mod nonce;
2pub mod program_ids;
3pub mod pumpswap;
4pub mod token;
5pub mod utils;
6use crate::core::events::EventMetadata;
7use crate::grpc::EventTypeFilter;
8use crate::DexEvent;
9pub use nonce::parse_nonce_account;
10use program_ids::*;
11pub use pumpswap::{
12    parse_global_config as parse_pumpswap_global_config, parse_pool as parse_pumpswap_pool,
13};
14pub use token::parse_token_account;
15pub use token::AccountData;
16pub use utils::*;
17
18pub fn parse_account_unified(
19    account: &AccountData,
20    metadata: EventMetadata,
21    event_type_filter: Option<&EventTypeFilter>,
22) -> Option<DexEvent> {
23    if account.data.is_empty() {
24        return None;
25    }
26
27    // Early filtering based on event type filter
28    if let Some(filter) = event_type_filter {
29        if let Some(ref include_only) = filter.include_only {
30            // Check if any of the account event types are in the include list
31            let should_parse = include_only.iter().any(|t| {
32                use crate::grpc::EventType;
33                matches!(
34                    t,
35                    EventType::TokenAccount
36                        | EventType::NonceAccount
37                        | EventType::AccountPumpSwapGlobalConfig
38                        | EventType::AccountPumpSwapPool
39                )
40            });
41            if !should_parse {
42                return None;
43            }
44        }
45    }
46
47    if account.owner == PUMPSWAP_PROGRAM_ID {
48        if let Some(filter) = event_type_filter {
49            if filter.should_include(crate::grpc::EventType::AccountPumpSwapGlobalConfig)
50                || filter.should_include(crate::grpc::EventType::AccountPumpSwapPool)
51            {
52                let event = parse_pumpswap_account(account, metadata.clone());
53                if event.is_some() {
54                    return event;
55                }
56            }
57        }
58    }
59    if nonce::is_nonce_account(&account.data) {
60        // Check filter for NonceAccount specifically
61        if let Some(filter) = event_type_filter {
62            if !filter.should_include(crate::grpc::EventType::NonceAccount) {
63                return None;
64            }
65        }
66        return parse_nonce_account(account, metadata);
67    }
68    // Parse token account (includes both TokenAccount and TokenInfo)
69    if let Some(filter) = event_type_filter {
70        let includes_token = filter.should_include(crate::grpc::EventType::TokenAccount);
71        if !includes_token {
72            return None;
73        }
74    }
75    return parse_token_account(account, metadata);
76}
77
78fn parse_pumpswap_account(account: &AccountData, metadata: EventMetadata) -> Option<DexEvent> {
79    // 检查 discriminator 以确定账户类型
80    if pumpswap::is_global_config_account(&account.data) {
81        return pumpswap::parse_global_config(account, metadata);
82    }
83    if pumpswap::is_pool_account(&account.data) {
84        return pumpswap::parse_pool(account, metadata);
85    }
86    None
87}