Skip to main content

sol_parser_sdk/accounts/
mod.rs

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