refactor: rename UnifiedEvent to DexEvent

This commit is contained in:
ysq
2025-10-12 22:00:15 +08:00
parent e21f2cfd17
commit fd180935f8
38 changed files with 569 additions and 551 deletions
@@ -3,7 +3,7 @@ use crate::streaming::event_parser::common::filter::EventTypeFilter;
use crate::streaming::event_parser::common::high_performance_clock::elapsed_micros_since;
use crate::streaming::event_parser::common::EventMetadata;
use crate::streaming::event_parser::core::parser_cache::get_account_configs;
use crate::streaming::event_parser::core::traits::UnifiedEvent;
use crate::streaming::event_parser::core::traits::DexEvent;
use crate::streaming::event_parser::Protocol;
use crate::streaming::grpc::AccountPretty;
use serde::{Deserialize, Serialize};
@@ -62,7 +62,7 @@ impl AccountEventParser {
protocols: &[Protocol],
account: AccountPretty,
event_type_filter: Option<&EventTypeFilter>,
) -> Option<UnifiedEvent> {
) -> Option<DexEvent> {
// 直接从 parser_cache 获取配置
let configs = get_account_configs(
protocols,
@@ -102,7 +102,7 @@ impl AccountEventParser {
pub fn parse_token_account_event(
account: &AccountPretty,
metadata: EventMetadata,
) -> Option<UnifiedEvent> {
) -> Option<DexEvent> {
let pubkey = account.pubkey;
let executable = account.executable;
let lamports = account.lamports;
@@ -123,7 +123,7 @@ impl AccountEventParser {
};
let recv_delta = elapsed_micros_since(account.recv_us);
event.metadata.handle_us = recv_delta;
return Some(UnifiedEvent::TokenInfoEvent(event));
return Some(DexEvent::TokenInfoEvent(event));
}
}
// Spl Token2022 Mint
@@ -141,7 +141,7 @@ impl AccountEventParser {
};
let recv_delta = elapsed_micros_since(account.recv_us);
event.metadata.handle_us = recv_delta;
return Some(UnifiedEvent::TokenInfoEvent(event));
return Some(DexEvent::TokenInfoEvent(event));
}
}
let amount = if account.owner.to_bytes() == spl_token_2022::ID.to_bytes() {
@@ -164,13 +164,13 @@ impl AccountEventParser {
};
let recv_delta = elapsed_micros_since(account.recv_us);
event.metadata.handle_us = recv_delta;
Some(UnifiedEvent::TokenAccountEvent(event))
Some(DexEvent::TokenAccountEvent(event))
}
pub fn parse_nonce_account_event(
account: &AccountPretty,
metadata: EventMetadata,
) -> Option<UnifiedEvent> {
) -> Option<DexEvent> {
if let Ok(info) = parse_nonce(&account.data) {
match info {
solana_account_decoder::parse_nonce::UiNonceState::Initialized(details) => {
@@ -185,7 +185,7 @@ impl AccountEventParser {
authority: details.authority,
};
event.metadata.handle_us = elapsed_micros_since(account.recv_us);
return Some(UnifiedEvent::NonceAccountEvent(event));
return Some(DexEvent::NonceAccountEvent(event));
}
solana_account_decoder::parse_nonce::UiNonceState::Uninitialized => {}
}
@@ -1,5 +1,5 @@
use crate::streaming::event_parser::common::high_performance_clock::elapsed_micros_since;
use crate::streaming::event_parser::core::traits::UnifiedEvent;
use crate::streaming::event_parser::core::traits::DexEvent;
use crate::streaming::event_parser::protocols::block::block_meta_event::BlockMetaEvent;
pub struct CommonEventParser {}
@@ -10,9 +10,9 @@ impl CommonEventParser {
block_hash: String,
block_time_ms: i64,
recv_us: i64,
) -> UnifiedEvent {
) -> DexEvent {
let mut block_meta_event = BlockMetaEvent::new(slot, block_hash, block_time_ms, recv_us);
block_meta_event.metadata.handle_us = elapsed_micros_since(recv_us);
UnifiedEvent::BlockMetaEvent(block_meta_event)
DexEvent::BlockMetaEvent(block_meta_event)
}
}
+34 -33
View File
@@ -12,12 +12,13 @@ use crate::streaming::{
add_bonk_dev_address, add_dev_address, is_bonk_dev_address_in_signature,
is_dev_address_in_signature,
},
merger_event::merge,
parser_cache::{
build_account_pubkeys_with_cache, get_global_instruction_configs,
get_global_program_ids, GenericEventParseConfig,
},
},
Protocol, UnifiedEvent,
Protocol, DexEvent,
},
};
use prost_types::Timestamp;
@@ -47,7 +48,7 @@ impl EventParser {
inner_instructions: &[yellowstone_grpc_proto::prelude::InnerInstructions],
bot_wallet: Option<Pubkey>,
transaction_index: Option<u64>,
callback: Arc<dyn for<'a> Fn(&'a UnifiedEvent) + Send + Sync>,
callback: Arc<dyn for<'a> Fn(&'a DexEvent) + Send + Sync>,
) -> anyhow::Result<()> {
// 获取交易的指令和账户
let mut accounts = accounts.to_vec();
@@ -137,7 +138,7 @@ impl EventParser {
inner_instructions: &[InnerInstructions],
bot_wallet: Option<Pubkey>,
transaction_index: Option<u64>,
callback: Arc<dyn for<'a> Fn(&'a UnifiedEvent) + Send + Sync>,
callback: Arc<dyn for<'a> Fn(&'a DexEvent) + Send + Sync>,
) -> anyhow::Result<()> {
// 获取交易的指令和账户
let compiled_instructions = transaction.message.instructions();
@@ -217,10 +218,10 @@ impl EventParser {
bot_wallet: Option<Pubkey>,
transaction_index: Option<u64>,
inner_instructions: &[InnerInstructions],
callback: Arc<dyn Fn(UnifiedEvent) + Send + Sync>,
callback: Arc<dyn Fn(DexEvent) + Send + Sync>,
) -> anyhow::Result<()> {
// 创建适配器回调,将所有权回调转换为引用回调
let adapter_callback = Arc::new(move |event: &UnifiedEvent| {
let adapter_callback = Arc::new(move |event: &DexEvent| {
callback(event.clone());
});
Self::parse_versioned_transaction(
@@ -251,7 +252,7 @@ impl EventParser {
bot_wallet: Option<Pubkey>,
transaction_index: Option<u64>,
inner_instructions: &[InnerInstructions],
callback: Arc<dyn for<'a> Fn(&'a UnifiedEvent) + Send + Sync>,
callback: Arc<dyn for<'a> Fn(&'a DexEvent) + Send + Sync>,
) -> anyhow::Result<()> {
let accounts: Vec<Pubkey> = versioned_tx.message.static_account_keys().to_vec();
Self::parse_instruction_events_from_versioned_transaction(
@@ -282,10 +283,10 @@ impl EventParser {
recv_us: i64,
bot_wallet: Option<Pubkey>,
transaction_index: Option<u64>,
callback: Arc<dyn Fn(UnifiedEvent) + Send + Sync>,
callback: Arc<dyn Fn(DexEvent) + Send + Sync>,
) -> anyhow::Result<()> {
// 创建适配器回调,将所有权回调转换为引用回调
let adapter_callback = Arc::new(move |event: &UnifiedEvent| {
let adapter_callback = Arc::new(move |event: &DexEvent| {
callback(event.clone());
});
// 调用原始方法
@@ -314,7 +315,7 @@ impl EventParser {
recv_us: i64,
bot_wallet: Option<Pubkey>,
transaction_index: Option<u64>,
callback: Arc<dyn for<'a> Fn(&'a UnifiedEvent) + Send + Sync>,
callback: Arc<dyn for<'a> Fn(&'a DexEvent) + Send + Sync>,
) -> anyhow::Result<()> {
if let Some(transition) = grpc_tx.transaction {
if let Some(message) = &transition.message {
@@ -381,7 +382,7 @@ impl EventParser {
event_type_filter: Option<&EventTypeFilter>,
signature: Signature,
transaction: EncodedConfirmedTransactionWithStatusMeta,
callback: Arc<dyn for<'a> Fn(&'a UnifiedEvent) + Send + Sync>,
callback: Arc<dyn for<'a> Fn(&'a DexEvent) + Send + Sync>,
) -> anyhow::Result<()> {
let versioned_tx = match transaction.transaction.transaction.decode() {
Some(tx) => tx,
@@ -502,7 +503,7 @@ impl EventParser {
outer_index: i64,
inner_index: Option<i64>,
transaction_index: Option<u64>,
) -> Option<UnifiedEvent> {
) -> Option<DexEvent> {
if let Some(parser) = config.inner_instruction_parser {
let timestamp = block_time.unwrap_or(Timestamp { seconds: 0, nanos: 0 });
let block_time_ms = timestamp.seconds * 1000 + (timestamp.nanos as i64) / 1_000_000;
@@ -538,7 +539,7 @@ impl EventParser {
outer_index: i64,
inner_index: Option<i64>,
transaction_index: Option<u64>,
) -> Option<UnifiedEvent> {
) -> Option<DexEvent> {
if let Some(parser) = config.instruction_parser {
let timestamp = block_time.unwrap_or(Timestamp { seconds: 0, nanos: 0 });
let block_time_ms = timestamp.seconds * 1000 + (timestamp.nanos as i64) / 1_000_000;
@@ -573,7 +574,7 @@ impl EventParser {
inner_index: Option<i64>,
transaction_index: Option<u64>,
config: &GenericEventParseConfig,
) -> Vec<UnifiedEvent> {
) -> Vec<DexEvent> {
// Use SIMD-optimized data validation with correct discriminator length
let discriminator_len = config.inner_instruction_discriminator.len();
if !SimdUtils::validate_instruction_data_simd(
@@ -622,7 +623,7 @@ impl EventParser {
inner_index: Option<i64>,
transaction_index: Option<u64>,
config: &GenericEventParseConfig,
) -> Vec<UnifiedEvent> {
) -> Vec<DexEvent> {
// Use SIMD-optimized data validation with correct discriminator length
let discriminator_len = config.inner_instruction_discriminator.len();
if !SimdUtils::validate_instruction_data_simd(
@@ -675,7 +676,7 @@ impl EventParser {
bot_wallet: Option<Pubkey>,
transaction_index: Option<u64>,
inner_instructions: Option<&InnerInstructions>,
callback: Arc<dyn for<'a> Fn(&'a UnifiedEvent) + Send + Sync>,
callback: Arc<dyn for<'a> Fn(&'a DexEvent) + Send + Sync>,
) -> anyhow::Result<()> {
// 添加边界检查以防止越界访问
let program_id_index = instruction.program_id_index as usize;
@@ -734,7 +735,7 @@ impl EventParser {
for (_disc, config, mut event) in all_results {
// 阻塞处理:原有的同步逻辑
let mut inner_instruction_event: Option<UnifiedEvent> = None;
let mut inner_instruction_event: Option<DexEvent> = None;
if inner_instructions.is_some() {
let inner_instructions_ref = inner_instructions.unwrap();
@@ -790,7 +791,7 @@ impl EventParser {
// 合并事件
if let Some(inner_instruction_event) = inner_instruction_event {
// event.merge(&*inner_instruction_event);
merge(&mut event, inner_instruction_event);
}
// 设置处理时间(使用高性能时钟)
event.metadata_mut().handle_us = elapsed_micros_since(recv_us);
@@ -817,7 +818,7 @@ impl EventParser {
bot_wallet: Option<Pubkey>,
transaction_index: Option<u64>,
inner_instructions: Option<&yellowstone_grpc_proto::prelude::InnerInstructions>,
callback: Arc<dyn for<'a> Fn(&'a UnifiedEvent) + Send + Sync>,
callback: Arc<dyn for<'a> Fn(&'a DexEvent) + Send + Sync>,
) -> anyhow::Result<()> {
// 添加边界检查以防止越界访问
let program_id_index = instruction.program_id_index as usize;
@@ -876,7 +877,7 @@ impl EventParser {
for (_disc, config, mut event) in all_results {
// 阻塞处理:原有的同步逻辑
let mut inner_instruction_event: Option<UnifiedEvent> = None;
let mut inner_instruction_event: Option<DexEvent> = None;
if inner_instructions.is_some() {
let inner_instructions_ref = inner_instructions.unwrap();
@@ -932,7 +933,7 @@ impl EventParser {
// 合并事件
if let Some(inner_instruction_event) = inner_instruction_event {
// event.merge(&*inner_instruction_event);
merge(&mut event, inner_instruction_event);
}
// 设置处理时间(使用高性能时钟)
event.metadata_mut().handle_us = elapsed_micros_since(recv_us);
@@ -950,18 +951,18 @@ impl EventParser {
get_global_program_ids(protocols, event_type_filter).contains(program_id)
}
fn process_event(mut event: UnifiedEvent, bot_wallet: Option<Pubkey>) -> UnifiedEvent {
fn process_event(event: DexEvent, bot_wallet: Option<Pubkey>) -> DexEvent {
let signature = event.metadata().signature; // Copy the signature to avoid borrowing issues
match event {
UnifiedEvent::PumpFunCreateTokenEvent(token_info) => {
DexEvent::PumpFunCreateTokenEvent(token_info) => {
add_dev_address(&signature, token_info.user);
if token_info.creator != Pubkey::default() && token_info.creator != token_info.user
{
add_dev_address(&signature, token_info.creator);
}
UnifiedEvent::PumpFunCreateTokenEvent(token_info)
DexEvent::PumpFunCreateTokenEvent(token_info)
}
UnifiedEvent::PumpFunTradeEvent(mut trade_info) => {
DexEvent::PumpFunTradeEvent(mut trade_info) => {
if is_dev_address_in_signature(&signature, &trade_info.user)
|| is_dev_address_in_signature(&signature, &trade_info.creator)
{
@@ -985,31 +986,31 @@ impl EventParser {
trade_info.sol_amount
};
}
UnifiedEvent::PumpFunTradeEvent(trade_info)
DexEvent::PumpFunTradeEvent(trade_info)
}
UnifiedEvent::PumpSwapBuyEvent(mut trade_info) => {
DexEvent::PumpSwapBuyEvent(mut trade_info) => {
if trade_info.metadata.swap_data.is_some() {
trade_info.metadata.swap_data.as_mut().unwrap().from_amount =
trade_info.user_quote_amount_in;
trade_info.metadata.swap_data.as_mut().unwrap().to_amount =
trade_info.base_amount_out;
}
UnifiedEvent::PumpSwapBuyEvent(trade_info)
DexEvent::PumpSwapBuyEvent(trade_info)
}
UnifiedEvent::PumpSwapSellEvent(mut trade_info) => {
DexEvent::PumpSwapSellEvent(mut trade_info) => {
if trade_info.metadata.swap_data.is_some() {
trade_info.metadata.swap_data.as_mut().unwrap().from_amount =
trade_info.base_amount_in;
trade_info.metadata.swap_data.as_mut().unwrap().to_amount =
trade_info.user_quote_amount_out;
}
UnifiedEvent::PumpSwapSellEvent(trade_info)
DexEvent::PumpSwapSellEvent(trade_info)
}
UnifiedEvent::BonkPoolCreateEvent(pool_info) => {
DexEvent::BonkPoolCreateEvent(pool_info) => {
add_bonk_dev_address(&signature, pool_info.creator);
UnifiedEvent::BonkPoolCreateEvent(pool_info)
DexEvent::BonkPoolCreateEvent(pool_info)
}
UnifiedEvent::BonkTradeEvent(mut trade_info) => {
DexEvent::BonkTradeEvent(mut trade_info) => {
if is_bonk_dev_address_in_signature(&signature, &trade_info.payer) {
trade_info.is_dev_create_token_trade = true;
} else if Some(trade_info.payer) == bot_wallet {
@@ -1017,7 +1018,7 @@ impl EventParser {
} else {
trade_info.is_dev_create_token_trade = false;
}
UnifiedEvent::BonkTradeEvent(trade_info)
DexEvent::BonkTradeEvent(trade_info)
}
_ => event,
}
@@ -0,0 +1,226 @@
use crate::streaming::event_parser::DexEvent;
pub fn merge(instruction_event: &mut DexEvent, cpi_log_event: DexEvent) {
match instruction_event {
// PumpFun events
DexEvent::PumpFunTradeEvent(e) => match cpi_log_event {
DexEvent::PumpFunTradeEvent(cpie) => {
e.mint = cpie.mint;
e.sol_amount = cpie.sol_amount;
e.token_amount = cpie.token_amount;
e.is_buy = cpie.is_buy;
e.user = cpie.user;
e.timestamp = cpie.timestamp;
e.virtual_sol_reserves = cpie.virtual_sol_reserves;
e.virtual_token_reserves = cpie.virtual_token_reserves;
e.real_sol_reserves = cpie.real_sol_reserves;
e.real_token_reserves = cpie.real_token_reserves;
e.fee_recipient = cpie.fee_recipient;
e.fee_basis_points = cpie.fee_basis_points;
e.fee = cpie.fee;
e.creator = cpie.creator;
e.creator_fee_basis_points = cpie.creator_fee_basis_points;
e.creator_fee = cpie.creator_fee;
}
_ => {}
},
DexEvent::PumpFunCreateTokenEvent(e) => match cpi_log_event {
DexEvent::PumpFunCreateTokenEvent(cpie) => {
e.mint = cpie.mint;
e.bonding_curve = cpie.bonding_curve;
e.user = cpie.user;
e.creator = cpie.creator;
e.timestamp = cpie.timestamp;
e.virtual_token_reserves = cpie.virtual_token_reserves;
e.virtual_sol_reserves = cpie.virtual_sol_reserves;
e.real_token_reserves = cpie.real_token_reserves;
e.token_total_supply = cpie.token_total_supply;
}
_ => {}
},
DexEvent::PumpFunMigrateEvent(e) => match cpi_log_event {
DexEvent::PumpFunMigrateEvent(cpie) => {
e.user = cpie.user;
e.mint = cpie.mint;
e.mint_amount = cpie.mint_amount;
e.sol_amount = cpie.sol_amount;
e.pool_migration_fee = cpie.pool_migration_fee;
e.bonding_curve = cpie.bonding_curve;
e.timestamp = cpie.timestamp;
e.pool = cpie.pool;
}
_ => {}
},
// Bonk events
DexEvent::BonkTradeEvent(e) => match cpi_log_event {
DexEvent::BonkTradeEvent(cpie) => {
e.pool_state = cpie.pool_state;
e.total_base_sell = cpie.total_base_sell;
e.virtual_base = cpie.virtual_base;
e.virtual_quote = cpie.virtual_quote;
e.real_base_before = cpie.real_base_before;
e.real_quote_before = cpie.real_quote_before;
e.real_base_after = cpie.real_base_after;
e.real_quote_after = cpie.real_quote_after;
e.amount_in = cpie.amount_in;
e.amount_out = cpie.amount_out;
e.protocol_fee = cpie.protocol_fee;
e.platform_fee = cpie.platform_fee;
e.creator_fee = cpie.creator_fee;
e.share_fee = cpie.share_fee;
e.trade_direction = cpie.trade_direction;
e.pool_status = cpie.pool_status;
e.exact_in = cpie.exact_in;
}
_ => {}
},
DexEvent::BonkPoolCreateEvent(e) => match cpi_log_event {
DexEvent::BonkPoolCreateEvent(cpie) => {
e.pool_state = cpie.pool_state;
e.creator = cpie.creator;
e.config = cpie.config;
e.base_mint_param = cpie.base_mint_param;
e.curve_param = cpie.curve_param;
e.vesting_param = cpie.vesting_param;
e.amm_fee_on = cpie.amm_fee_on;
}
_ => {}
},
DexEvent::BonkMigrateToAmmEvent(e) => match cpi_log_event {
DexEvent::BonkMigrateToAmmEvent(cpie) => {
e.base_lot_size = cpie.base_lot_size;
e.quote_lot_size = cpie.quote_lot_size;
e.market_vault_signer_nonce = cpie.market_vault_signer_nonce;
}
_ => {}
},
// PumpSwap events
DexEvent::PumpSwapBuyEvent(e) => match cpi_log_event {
DexEvent::PumpSwapBuyEvent(cpie) => {
e.timestamp = cpie.timestamp;
e.base_amount_out = cpie.base_amount_out;
e.max_quote_amount_in = cpie.max_quote_amount_in;
e.user_base_token_reserves = cpie.user_base_token_reserves;
e.user_quote_token_reserves = cpie.user_quote_token_reserves;
e.pool_base_token_reserves = cpie.pool_base_token_reserves;
e.pool_quote_token_reserves = cpie.pool_quote_token_reserves;
e.quote_amount_in = cpie.quote_amount_in;
e.lp_fee_basis_points = cpie.lp_fee_basis_points;
e.lp_fee = cpie.lp_fee;
e.protocol_fee_basis_points = cpie.protocol_fee_basis_points;
e.protocol_fee = cpie.protocol_fee;
e.quote_amount_in_with_lp_fee = cpie.quote_amount_in_with_lp_fee;
e.user_quote_amount_in = cpie.user_quote_amount_in;
e.pool = cpie.pool;
e.user = cpie.user;
e.user_base_token_account = cpie.user_base_token_account;
e.user_quote_token_account = cpie.user_quote_token_account;
e.protocol_fee_recipient = cpie.protocol_fee_recipient;
e.protocol_fee_recipient_token_account = cpie.protocol_fee_recipient_token_account;
e.coin_creator = cpie.coin_creator;
e.coin_creator_fee_basis_points = cpie.coin_creator_fee_basis_points;
e.coin_creator_fee = cpie.coin_creator_fee;
}
_ => {}
},
DexEvent::PumpSwapSellEvent(e) => match cpi_log_event {
DexEvent::PumpSwapSellEvent(cpie) => {
e.timestamp = cpie.timestamp;
e.base_amount_in = cpie.base_amount_in;
e.min_quote_amount_out = cpie.min_quote_amount_out;
e.user_base_token_reserves = cpie.user_base_token_reserves;
e.user_quote_token_reserves = cpie.user_quote_token_reserves;
e.pool_base_token_reserves = cpie.pool_base_token_reserves;
e.pool_quote_token_reserves = cpie.pool_quote_token_reserves;
e.quote_amount_out = cpie.quote_amount_out;
e.lp_fee_basis_points = cpie.lp_fee_basis_points;
e.lp_fee = cpie.lp_fee;
e.protocol_fee_basis_points = cpie.protocol_fee_basis_points;
e.protocol_fee = cpie.protocol_fee;
e.quote_amount_out_without_lp_fee = cpie.quote_amount_out_without_lp_fee;
e.user_quote_amount_out = cpie.user_quote_amount_out;
e.pool = cpie.pool;
e.user = cpie.user;
e.user_base_token_account = cpie.user_base_token_account;
e.user_quote_token_account = cpie.user_quote_token_account;
e.protocol_fee_recipient = cpie.protocol_fee_recipient;
e.protocol_fee_recipient_token_account = cpie.protocol_fee_recipient_token_account;
e.coin_creator = cpie.coin_creator;
e.coin_creator_fee_basis_points = cpie.coin_creator_fee_basis_points;
e.coin_creator_fee = cpie.coin_creator_fee;
}
_ => {}
},
DexEvent::PumpSwapCreatePoolEvent(e) => match cpi_log_event {
DexEvent::PumpSwapCreatePoolEvent(cpie) => {
e.timestamp = cpie.timestamp;
e.index = cpie.index;
e.creator = cpie.creator;
e.base_mint = cpie.base_mint;
e.quote_mint = cpie.quote_mint;
e.base_mint_decimals = cpie.base_mint_decimals;
e.quote_mint_decimals = cpie.quote_mint_decimals;
e.base_amount_in = cpie.base_amount_in;
e.quote_amount_in = cpie.quote_amount_in;
e.pool_base_amount = cpie.pool_base_amount;
e.pool_quote_amount = cpie.pool_quote_amount;
e.minimum_liquidity = cpie.minimum_liquidity;
e.initial_liquidity = cpie.initial_liquidity;
e.lp_token_amount_out = cpie.lp_token_amount_out;
e.pool_bump = cpie.pool_bump;
e.pool = cpie.pool;
e.lp_mint = cpie.lp_mint;
e.user_base_token_account = cpie.user_base_token_account;
e.user_quote_token_account = cpie.user_quote_token_account;
e.coin_creator = cpie.coin_creator;
}
_ => {}
},
DexEvent::PumpSwapDepositEvent(e) => match cpi_log_event {
DexEvent::PumpSwapDepositEvent(cpie) => {
e.timestamp = cpie.timestamp;
e.lp_token_amount_out = cpie.lp_token_amount_out;
e.max_base_amount_in = cpie.max_base_amount_in;
e.max_quote_amount_in = cpie.max_quote_amount_in;
e.user_base_token_reserves = cpie.user_base_token_reserves;
e.user_quote_token_reserves = cpie.user_quote_token_reserves;
e.pool_base_token_reserves = cpie.pool_base_token_reserves;
e.pool_quote_token_reserves = cpie.pool_quote_token_reserves;
e.base_amount_in = cpie.base_amount_in;
e.quote_amount_in = cpie.quote_amount_in;
e.lp_mint_supply = cpie.lp_mint_supply;
e.pool = cpie.pool;
e.user = cpie.user;
e.user_base_token_account = cpie.user_base_token_account;
e.user_quote_token_account = cpie.user_quote_token_account;
e.user_pool_token_account = cpie.user_pool_token_account;
}
_ => {}
},
DexEvent::PumpSwapWithdrawEvent(e) => match cpi_log_event {
DexEvent::PumpSwapWithdrawEvent(cpie) => {
e.timestamp = cpie.timestamp;
e.lp_token_amount_in = cpie.lp_token_amount_in;
e.min_base_amount_out = cpie.min_base_amount_out;
e.min_quote_amount_out = cpie.min_quote_amount_out;
e.user_base_token_reserves = cpie.user_base_token_reserves;
e.user_quote_token_reserves = cpie.user_quote_token_reserves;
e.pool_base_token_reserves = cpie.pool_base_token_reserves;
e.pool_quote_token_reserves = cpie.pool_quote_token_reserves;
e.base_amount_out = cpie.base_amount_out;
e.quote_amount_out = cpie.quote_amount_out;
e.lp_mint_supply = cpie.lp_mint_supply;
e.pool = cpie.pool;
e.user = cpie.user;
e.user_base_token_account = cpie.user_base_token_account;
e.user_quote_token_account = cpie.user_quote_token_account;
e.user_pool_token_account = cpie.user_pool_token_account;
}
_ => {}
},
_ => {}
}
}
+2 -1
View File
@@ -3,10 +3,11 @@ pub mod common_event_parser;
pub mod global_state;
pub mod parser_cache;
pub mod traits;
pub use traits::UnifiedEvent;
pub use traits::DexEvent;
pub use parser_cache::{
AccountEventParseConfig, AccountEventParserFn, GenericEventParseConfig,
InnerInstructionEventParser, InstructionEventParser, get_account_configs,
};
pub mod event_parser;
pub mod merger_event;
@@ -21,7 +21,7 @@ use crate::streaming::{
raydium_clmm::parser::RAYDIUM_CLMM_PROGRAM_ID,
raydium_cpmm::parser::RAYDIUM_CPMM_PROGRAM_ID,
},
Protocol, UnifiedEvent,
Protocol, DexEvent,
},
grpc::AccountPretty,
};
@@ -39,13 +39,13 @@ use std::{
///
/// 用于解析内联指令(Inner Instruction)生成的事件
pub type InnerInstructionEventParser =
fn(data: &[u8], metadata: EventMetadata) -> Option<UnifiedEvent>;
fn(data: &[u8], metadata: EventMetadata) -> Option<DexEvent>;
/// 指令事件解析器函数类型
///
/// 用于解析普通指令(Instruction)生成的事件,需要账户信息
pub type InstructionEventParser =
fn(data: &[u8], accounts: &[Pubkey], metadata: EventMetadata) -> Option<UnifiedEvent>;
fn(data: &[u8], accounts: &[Pubkey], metadata: EventMetadata) -> Option<DexEvent>;
/// 指令事件解析器配置
///
@@ -327,9 +327,6 @@ impl Default for AccountPubkeyCache {
}
}
/// 线程局部账户公钥缓存
///
/// 每个线程独立维护一个缓存实例,避免锁竞争
thread_local! {
static THREAD_LOCAL_ACCOUNT_CACHE: std::cell::RefCell<AccountPubkeyCache> =
std::cell::RefCell::new(AccountPubkeyCache::new());
@@ -365,7 +362,7 @@ pub fn build_account_pubkeys_with_cache(
///
/// 用于解析账户状态变更生成的事件
pub type AccountEventParserFn =
fn(account: &AccountPretty, metadata: EventMetadata) -> Option<UnifiedEvent>;
fn(account: &AccountPretty, metadata: EventMetadata) -> Option<DexEvent>;
/// 账户事件解析器配置
///
+94 -94
View File
@@ -14,7 +14,7 @@ use std::fmt::Debug;
/// Unified Event Enum - Replaces the trait-based approach with a type-safe enum
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum UnifiedEvent {
pub enum DexEvent {
// Bonk events
BonkTradeEvent(BonkTradeEvent),
BonkPoolCreateEvent(BonkPoolCreateEvent),
@@ -76,106 +76,106 @@ pub enum UnifiedEvent {
BlockMetaEvent(BlockMetaEvent),
}
impl UnifiedEvent {
impl DexEvent {
pub fn metadata(&self) -> &EventMetadata {
match self {
UnifiedEvent::BonkTradeEvent(e) => &e.metadata,
UnifiedEvent::BonkPoolCreateEvent(e) => &e.metadata,
UnifiedEvent::BonkMigrateToAmmEvent(e) => &e.metadata,
UnifiedEvent::BonkMigrateToCpswapEvent(e) => &e.metadata,
UnifiedEvent::BonkPoolStateAccountEvent(e) => &e.metadata,
UnifiedEvent::BonkGlobalConfigAccountEvent(e) => &e.metadata,
UnifiedEvent::BonkPlatformConfigAccountEvent(e) => &e.metadata,
UnifiedEvent::PumpFunCreateTokenEvent(e) => &e.metadata,
UnifiedEvent::PumpFunTradeEvent(e) => &e.metadata,
UnifiedEvent::PumpFunMigrateEvent(e) => &e.metadata,
UnifiedEvent::PumpFunBondingCurveAccountEvent(e) => &e.metadata,
UnifiedEvent::PumpFunGlobalAccountEvent(e) => &e.metadata,
UnifiedEvent::PumpSwapBuyEvent(e) => &e.metadata,
UnifiedEvent::PumpSwapSellEvent(e) => &e.metadata,
UnifiedEvent::PumpSwapCreatePoolEvent(e) => &e.metadata,
UnifiedEvent::PumpSwapDepositEvent(e) => &e.metadata,
UnifiedEvent::PumpSwapWithdrawEvent(e) => &e.metadata,
UnifiedEvent::PumpSwapGlobalConfigAccountEvent(e) => &e.metadata,
UnifiedEvent::PumpSwapPoolAccountEvent(e) => &e.metadata,
UnifiedEvent::RaydiumAmmV4SwapEvent(e) => &e.metadata,
UnifiedEvent::RaydiumAmmV4DepositEvent(e) => &e.metadata,
UnifiedEvent::RaydiumAmmV4WithdrawEvent(e) => &e.metadata,
UnifiedEvent::RaydiumAmmV4WithdrawPnlEvent(e) => &e.metadata,
UnifiedEvent::RaydiumAmmV4Initialize2Event(e) => &e.metadata,
UnifiedEvent::RaydiumAmmV4AmmInfoAccountEvent(e) => &e.metadata,
UnifiedEvent::RaydiumClmmSwapEvent(e) => &e.metadata,
UnifiedEvent::RaydiumClmmSwapV2Event(e) => &e.metadata,
UnifiedEvent::RaydiumClmmClosePositionEvent(e) => &e.metadata,
UnifiedEvent::RaydiumClmmIncreaseLiquidityV2Event(e) => &e.metadata,
UnifiedEvent::RaydiumClmmDecreaseLiquidityV2Event(e) => &e.metadata,
UnifiedEvent::RaydiumClmmCreatePoolEvent(e) => &e.metadata,
UnifiedEvent::RaydiumClmmOpenPositionWithToken22NftEvent(e) => &e.metadata,
UnifiedEvent::RaydiumClmmOpenPositionV2Event(e) => &e.metadata,
UnifiedEvent::RaydiumClmmAmmConfigAccountEvent(e) => &e.metadata,
UnifiedEvent::RaydiumClmmPoolStateAccountEvent(e) => &e.metadata,
UnifiedEvent::RaydiumClmmTickArrayStateAccountEvent(e) => &e.metadata,
UnifiedEvent::RaydiumCpmmSwapEvent(e) => &e.metadata,
UnifiedEvent::RaydiumCpmmDepositEvent(e) => &e.metadata,
UnifiedEvent::RaydiumCpmmWithdrawEvent(e) => &e.metadata,
UnifiedEvent::RaydiumCpmmInitializeEvent(e) => &e.metadata,
UnifiedEvent::RaydiumCpmmAmmConfigAccountEvent(e) => &e.metadata,
UnifiedEvent::RaydiumCpmmPoolStateAccountEvent(e) => &e.metadata,
UnifiedEvent::TokenAccountEvent(e) => &e.metadata,
UnifiedEvent::NonceAccountEvent(e) => &e.metadata,
UnifiedEvent::TokenInfoEvent(e) => &e.metadata,
UnifiedEvent::BlockMetaEvent(e) => &e.metadata,
DexEvent::BonkTradeEvent(e) => &e.metadata,
DexEvent::BonkPoolCreateEvent(e) => &e.metadata,
DexEvent::BonkMigrateToAmmEvent(e) => &e.metadata,
DexEvent::BonkMigrateToCpswapEvent(e) => &e.metadata,
DexEvent::BonkPoolStateAccountEvent(e) => &e.metadata,
DexEvent::BonkGlobalConfigAccountEvent(e) => &e.metadata,
DexEvent::BonkPlatformConfigAccountEvent(e) => &e.metadata,
DexEvent::PumpFunCreateTokenEvent(e) => &e.metadata,
DexEvent::PumpFunTradeEvent(e) => &e.metadata,
DexEvent::PumpFunMigrateEvent(e) => &e.metadata,
DexEvent::PumpFunBondingCurveAccountEvent(e) => &e.metadata,
DexEvent::PumpFunGlobalAccountEvent(e) => &e.metadata,
DexEvent::PumpSwapBuyEvent(e) => &e.metadata,
DexEvent::PumpSwapSellEvent(e) => &e.metadata,
DexEvent::PumpSwapCreatePoolEvent(e) => &e.metadata,
DexEvent::PumpSwapDepositEvent(e) => &e.metadata,
DexEvent::PumpSwapWithdrawEvent(e) => &e.metadata,
DexEvent::PumpSwapGlobalConfigAccountEvent(e) => &e.metadata,
DexEvent::PumpSwapPoolAccountEvent(e) => &e.metadata,
DexEvent::RaydiumAmmV4SwapEvent(e) => &e.metadata,
DexEvent::RaydiumAmmV4DepositEvent(e) => &e.metadata,
DexEvent::RaydiumAmmV4WithdrawEvent(e) => &e.metadata,
DexEvent::RaydiumAmmV4WithdrawPnlEvent(e) => &e.metadata,
DexEvent::RaydiumAmmV4Initialize2Event(e) => &e.metadata,
DexEvent::RaydiumAmmV4AmmInfoAccountEvent(e) => &e.metadata,
DexEvent::RaydiumClmmSwapEvent(e) => &e.metadata,
DexEvent::RaydiumClmmSwapV2Event(e) => &e.metadata,
DexEvent::RaydiumClmmClosePositionEvent(e) => &e.metadata,
DexEvent::RaydiumClmmIncreaseLiquidityV2Event(e) => &e.metadata,
DexEvent::RaydiumClmmDecreaseLiquidityV2Event(e) => &e.metadata,
DexEvent::RaydiumClmmCreatePoolEvent(e) => &e.metadata,
DexEvent::RaydiumClmmOpenPositionWithToken22NftEvent(e) => &e.metadata,
DexEvent::RaydiumClmmOpenPositionV2Event(e) => &e.metadata,
DexEvent::RaydiumClmmAmmConfigAccountEvent(e) => &e.metadata,
DexEvent::RaydiumClmmPoolStateAccountEvent(e) => &e.metadata,
DexEvent::RaydiumClmmTickArrayStateAccountEvent(e) => &e.metadata,
DexEvent::RaydiumCpmmSwapEvent(e) => &e.metadata,
DexEvent::RaydiumCpmmDepositEvent(e) => &e.metadata,
DexEvent::RaydiumCpmmWithdrawEvent(e) => &e.metadata,
DexEvent::RaydiumCpmmInitializeEvent(e) => &e.metadata,
DexEvent::RaydiumCpmmAmmConfigAccountEvent(e) => &e.metadata,
DexEvent::RaydiumCpmmPoolStateAccountEvent(e) => &e.metadata,
DexEvent::TokenAccountEvent(e) => &e.metadata,
DexEvent::NonceAccountEvent(e) => &e.metadata,
DexEvent::TokenInfoEvent(e) => &e.metadata,
DexEvent::BlockMetaEvent(e) => &e.metadata,
}
}
pub fn metadata_mut(&mut self) -> &mut EventMetadata {
match self {
UnifiedEvent::BonkTradeEvent(e) => &mut e.metadata,
UnifiedEvent::BonkPoolCreateEvent(e) => &mut e.metadata,
UnifiedEvent::BonkMigrateToAmmEvent(e) => &mut e.metadata,
UnifiedEvent::BonkMigrateToCpswapEvent(e) => &mut e.metadata,
UnifiedEvent::BonkPoolStateAccountEvent(e) => &mut e.metadata,
UnifiedEvent::BonkGlobalConfigAccountEvent(e) => &mut e.metadata,
UnifiedEvent::BonkPlatformConfigAccountEvent(e) => &mut e.metadata,
UnifiedEvent::PumpFunCreateTokenEvent(e) => &mut e.metadata,
UnifiedEvent::PumpFunTradeEvent(e) => &mut e.metadata,
UnifiedEvent::PumpFunMigrateEvent(e) => &mut e.metadata,
UnifiedEvent::PumpFunBondingCurveAccountEvent(e) => &mut e.metadata,
UnifiedEvent::PumpFunGlobalAccountEvent(e) => &mut e.metadata,
UnifiedEvent::PumpSwapBuyEvent(e) => &mut e.metadata,
UnifiedEvent::PumpSwapSellEvent(e) => &mut e.metadata,
UnifiedEvent::PumpSwapCreatePoolEvent(e) => &mut e.metadata,
UnifiedEvent::PumpSwapDepositEvent(e) => &mut e.metadata,
UnifiedEvent::PumpSwapWithdrawEvent(e) => &mut e.metadata,
UnifiedEvent::PumpSwapGlobalConfigAccountEvent(e) => &mut e.metadata,
UnifiedEvent::PumpSwapPoolAccountEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumAmmV4SwapEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumAmmV4DepositEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumAmmV4WithdrawEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumAmmV4WithdrawPnlEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumAmmV4Initialize2Event(e) => &mut e.metadata,
UnifiedEvent::RaydiumAmmV4AmmInfoAccountEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumClmmSwapEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumClmmSwapV2Event(e) => &mut e.metadata,
UnifiedEvent::RaydiumClmmClosePositionEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumClmmIncreaseLiquidityV2Event(e) => &mut e.metadata,
UnifiedEvent::RaydiumClmmDecreaseLiquidityV2Event(e) => &mut e.metadata,
UnifiedEvent::RaydiumClmmCreatePoolEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumClmmOpenPositionWithToken22NftEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumClmmOpenPositionV2Event(e) => &mut e.metadata,
UnifiedEvent::RaydiumClmmAmmConfigAccountEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumClmmPoolStateAccountEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumClmmTickArrayStateAccountEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumCpmmSwapEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumCpmmDepositEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumCpmmWithdrawEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumCpmmInitializeEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumCpmmAmmConfigAccountEvent(e) => &mut e.metadata,
UnifiedEvent::RaydiumCpmmPoolStateAccountEvent(e) => &mut e.metadata,
UnifiedEvent::TokenAccountEvent(e) => &mut e.metadata,
UnifiedEvent::NonceAccountEvent(e) => &mut e.metadata,
UnifiedEvent::TokenInfoEvent(e) => &mut e.metadata,
UnifiedEvent::BlockMetaEvent(e) => &mut e.metadata,
DexEvent::BonkTradeEvent(e) => &mut e.metadata,
DexEvent::BonkPoolCreateEvent(e) => &mut e.metadata,
DexEvent::BonkMigrateToAmmEvent(e) => &mut e.metadata,
DexEvent::BonkMigrateToCpswapEvent(e) => &mut e.metadata,
DexEvent::BonkPoolStateAccountEvent(e) => &mut e.metadata,
DexEvent::BonkGlobalConfigAccountEvent(e) => &mut e.metadata,
DexEvent::BonkPlatformConfigAccountEvent(e) => &mut e.metadata,
DexEvent::PumpFunCreateTokenEvent(e) => &mut e.metadata,
DexEvent::PumpFunTradeEvent(e) => &mut e.metadata,
DexEvent::PumpFunMigrateEvent(e) => &mut e.metadata,
DexEvent::PumpFunBondingCurveAccountEvent(e) => &mut e.metadata,
DexEvent::PumpFunGlobalAccountEvent(e) => &mut e.metadata,
DexEvent::PumpSwapBuyEvent(e) => &mut e.metadata,
DexEvent::PumpSwapSellEvent(e) => &mut e.metadata,
DexEvent::PumpSwapCreatePoolEvent(e) => &mut e.metadata,
DexEvent::PumpSwapDepositEvent(e) => &mut e.metadata,
DexEvent::PumpSwapWithdrawEvent(e) => &mut e.metadata,
DexEvent::PumpSwapGlobalConfigAccountEvent(e) => &mut e.metadata,
DexEvent::PumpSwapPoolAccountEvent(e) => &mut e.metadata,
DexEvent::RaydiumAmmV4SwapEvent(e) => &mut e.metadata,
DexEvent::RaydiumAmmV4DepositEvent(e) => &mut e.metadata,
DexEvent::RaydiumAmmV4WithdrawEvent(e) => &mut e.metadata,
DexEvent::RaydiumAmmV4WithdrawPnlEvent(e) => &mut e.metadata,
DexEvent::RaydiumAmmV4Initialize2Event(e) => &mut e.metadata,
DexEvent::RaydiumAmmV4AmmInfoAccountEvent(e) => &mut e.metadata,
DexEvent::RaydiumClmmSwapEvent(e) => &mut e.metadata,
DexEvent::RaydiumClmmSwapV2Event(e) => &mut e.metadata,
DexEvent::RaydiumClmmClosePositionEvent(e) => &mut e.metadata,
DexEvent::RaydiumClmmIncreaseLiquidityV2Event(e) => &mut e.metadata,
DexEvent::RaydiumClmmDecreaseLiquidityV2Event(e) => &mut e.metadata,
DexEvent::RaydiumClmmCreatePoolEvent(e) => &mut e.metadata,
DexEvent::RaydiumClmmOpenPositionWithToken22NftEvent(e) => &mut e.metadata,
DexEvent::RaydiumClmmOpenPositionV2Event(e) => &mut e.metadata,
DexEvent::RaydiumClmmAmmConfigAccountEvent(e) => &mut e.metadata,
DexEvent::RaydiumClmmPoolStateAccountEvent(e) => &mut e.metadata,
DexEvent::RaydiumClmmTickArrayStateAccountEvent(e) => &mut e.metadata,
DexEvent::RaydiumCpmmSwapEvent(e) => &mut e.metadata,
DexEvent::RaydiumCpmmDepositEvent(e) => &mut e.metadata,
DexEvent::RaydiumCpmmWithdrawEvent(e) => &mut e.metadata,
DexEvent::RaydiumCpmmInitializeEvent(e) => &mut e.metadata,
DexEvent::RaydiumCpmmAmmConfigAccountEvent(e) => &mut e.metadata,
DexEvent::RaydiumCpmmPoolStateAccountEvent(e) => &mut e.metadata,
DexEvent::TokenAccountEvent(e) => &mut e.metadata,
DexEvent::NonceAccountEvent(e) => &mut e.metadata,
DexEvent::TokenInfoEvent(e) => &mut e.metadata,
DexEvent::BlockMetaEvent(e) => &mut e.metadata,
}
}
}