diff --git a/src/streaming/event_parser/core/event_parser.rs b/src/streaming/event_parser/core/event_parser.rs index 93a5319..b7edb91 100644 --- a/src/streaming/event_parser/core/event_parser.rs +++ b/src/streaming/event_parser/core/event_parser.rs @@ -1,18 +1,14 @@ use crate::streaming::event_parser::{ - common::{ - filter::EventTypeFilter, high_performance_clock::elapsed_micros_since, - parse_swap_data_from_next_grpc_instructions, parse_swap_data_from_next_instructions, - EventMetadata, - }, - core::{ + DexEvent, Protocol, common::{ + EventMetadata, filter::EventTypeFilter, high_performance_clock::elapsed_micros_since, parse_swap_data_from_next_grpc_instructions, parse_swap_data_from_next_instructions + }, core::{ dispatcher::EventDispatcher, global_state::{ add_bonk_dev_address, add_dev_address, is_bonk_dev_address_in_signature, is_dev_address_in_signature, }, merger_event::merge, - }, - DexEvent, Protocol, + }, protocols::raydium_amm_v4::parser::RAYDIUM_AMM_V4_PROGRAM_ID }; use prost_types::Timestamp; use solana_sdk::{ @@ -327,11 +323,15 @@ impl EventParser { let is_cu_program = EventDispatcher::is_compute_budget_program(&program_id); - // 检查指令数据长度(至少需要 8 字节的 discriminator) - if !is_cu_program && instruction.data.len() < 8 { + let disc_len = match program_id { + RAYDIUM_AMM_V4_PROGRAM_ID => 1, + _ => 8, + }; + + // 检查指令数据长度(至少需要 disc_len 字节的 discriminator) + if !is_cu_program && instruction.data.len() < disc_len { return Ok(()); } - // 创建元数据 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; @@ -366,8 +366,8 @@ impl EventParser { }; // 提取 discriminator 和数据 - let instruction_discriminator = &instruction.data[..8]; - let instruction_data = &instruction.data[8..]; + let instruction_discriminator = &instruction.data[..disc_len]; + let instruction_data = &instruction.data[disc_len..]; // 构建账户公钥列表 let account_pubkeys: Vec = instruction @@ -497,8 +497,13 @@ impl EventParser { let is_cu_program = EventDispatcher::is_compute_budget_program(&program_id); + let disc_len = match program_id { + RAYDIUM_AMM_V4_PROGRAM_ID => 1, + _ => 8, + }; + // 检查指令数据长度(至少需要 8 字节的 discriminator) - if !is_cu_program && instruction.data.len() < 8 { + if !is_cu_program && instruction.data.len() < disc_len { return Ok(()); } @@ -536,8 +541,8 @@ impl EventParser { }; // 提取 discriminator 和数据 - let instruction_discriminator = &instruction.data[..8]; - let instruction_data = &instruction.data[8..]; + let instruction_discriminator = &instruction.data[..disc_len]; + let instruction_data = &instruction.data[disc_len..]; // 构建账户公钥列表 let account_pubkeys: Vec = instruction