mirror of
https://github.com/0xfnzero/solana-streamer.git
synced 2026-08-25 23:08:05 +00:00
refactor: remove unused dispatcher methods and optimize imports
This commit is contained in:
@@ -9,13 +9,9 @@
|
|||||||
|
|
||||||
use crate::streaming::event_parser::{
|
use crate::streaming::event_parser::{
|
||||||
common::EventMetadata,
|
common::EventMetadata,
|
||||||
core::merger_event::merge,
|
|
||||||
protocols::{
|
protocols::{
|
||||||
bonk::parser as bonk,
|
bonk::parser as bonk, pumpfun::parser as pumpfun, pumpswap::parser as pumpswap,
|
||||||
pumpfun::parser as pumpfun,
|
raydium_amm_v4::parser as raydium_amm_v4, raydium_clmm::parser as raydium_clmm,
|
||||||
pumpswap::parser as pumpswap,
|
|
||||||
raydium_amm_v4::parser as raydium_amm_v4,
|
|
||||||
raydium_clmm::parser as raydium_clmm,
|
|
||||||
raydium_cpmm::parser as raydium_cpmm,
|
raydium_cpmm::parser as raydium_cpmm,
|
||||||
},
|
},
|
||||||
DexEvent, Protocol,
|
DexEvent, Protocol,
|
||||||
@@ -160,110 +156,6 @@ impl EventDispatcher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 解析并合并 instruction 和 inner instruction 事件(便捷方法)
|
|
||||||
///
|
|
||||||
/// # 参数
|
|
||||||
/// - `protocol`: 协议类型
|
|
||||||
/// - `instruction_discriminator`: 指令判别器 (8 bytes)
|
|
||||||
/// - `inner_instruction_discriminator`: 内联指令判别器 (16 bytes, 可选)
|
|
||||||
/// - `instruction_data`: 指令数据
|
|
||||||
/// - `inner_instruction_data`: 内联指令数据 (可选)
|
|
||||||
/// - `accounts`: 账户公钥列表
|
|
||||||
/// - `metadata`: 事件元数据
|
|
||||||
///
|
|
||||||
/// # 返回
|
|
||||||
/// 解析成功返回 `Some(DexEvent)`,否则返回 `None`
|
|
||||||
///
|
|
||||||
/// # 逻辑说明
|
|
||||||
/// 1. 解析 instruction 事件
|
|
||||||
/// 2. 解析 inner instruction 事件(如果有)
|
|
||||||
/// 3. 在外层合并两个事件
|
|
||||||
/// 4. 应用特殊处理逻辑(如 PumpFun MIGRATE)
|
|
||||||
#[inline]
|
|
||||||
pub fn dispatch(
|
|
||||||
protocol: Protocol,
|
|
||||||
instruction_discriminator: &[u8],
|
|
||||||
inner_instruction_discriminator: Option<&[u8]>,
|
|
||||||
instruction_data: &[u8],
|
|
||||||
inner_instruction_data: Option<&[u8]>,
|
|
||||||
accounts: &[Pubkey],
|
|
||||||
metadata: EventMetadata,
|
|
||||||
) -> Option<DexEvent> {
|
|
||||||
// 1. 解析 instruction 事件
|
|
||||||
let mut instruction_event = Self::dispatch_instruction(
|
|
||||||
protocol.clone(),
|
|
||||||
instruction_discriminator,
|
|
||||||
instruction_data,
|
|
||||||
accounts,
|
|
||||||
metadata.clone(),
|
|
||||||
);
|
|
||||||
|
|
||||||
// 2. 解析 inner instruction 事件(如果有)
|
|
||||||
if let Some(inner_disc) = inner_instruction_discriminator {
|
|
||||||
if let Some(inner_data) = inner_instruction_data {
|
|
||||||
let inner_event = Self::dispatch_inner_instruction(
|
|
||||||
protocol.clone(),
|
|
||||||
inner_disc,
|
|
||||||
inner_data,
|
|
||||||
metadata,
|
|
||||||
);
|
|
||||||
|
|
||||||
// 3. 在外层合并
|
|
||||||
if let Some(inner_event) = inner_event {
|
|
||||||
if let Some(ref mut inst_event) = instruction_event {
|
|
||||||
merge(inst_event, inner_event);
|
|
||||||
} else {
|
|
||||||
// 如果没有 instruction 事件,直接使用 inner 事件
|
|
||||||
instruction_event = Some(inner_event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. 特殊处理: PumpFun MIGRATE 指令需要 inner instruction data
|
|
||||||
// 如果没有 inner instruction data,应该返回 None(失败的迁移)
|
|
||||||
if matches!(&protocol, &Protocol::PumpFun) {
|
|
||||||
const PUMPFUN_MIGRATE_IX: &[u8] = &[155, 234, 231, 146, 236, 158, 162, 30];
|
|
||||||
if instruction_discriminator == PUMPFUN_MIGRATE_IX && inner_instruction_data.is_none() {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
instruction_event
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 遍历多个协议尝试解析 (用于不确定协议类型的场景)
|
|
||||||
///
|
|
||||||
/// 先通过 program_id 快速定位协议类型,再检查是否在请求的协议列表中
|
|
||||||
pub fn dispatch_multi(
|
|
||||||
protocols: &[Protocol],
|
|
||||||
program_id: &Pubkey,
|
|
||||||
instruction_discriminator: &[u8],
|
|
||||||
inner_instruction_discriminator: Option<&[u8]>,
|
|
||||||
instruction_data: &[u8],
|
|
||||||
inner_instruction_data: Option<&[u8]>,
|
|
||||||
accounts: &[Pubkey],
|
|
||||||
metadata: EventMetadata,
|
|
||||||
) -> Option<DexEvent> {
|
|
||||||
// 先通过 program_id 快速过滤协议
|
|
||||||
let target_protocol = Self::match_protocol_by_program_id(program_id)?;
|
|
||||||
|
|
||||||
// 如果目标协议在请求列表中,则解析
|
|
||||||
if protocols.contains(&target_protocol) {
|
|
||||||
Self::dispatch(
|
|
||||||
target_protocol,
|
|
||||||
instruction_discriminator,
|
|
||||||
inner_instruction_discriminator,
|
|
||||||
instruction_data,
|
|
||||||
inner_instruction_data,
|
|
||||||
accounts,
|
|
||||||
metadata,
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 通过 program_id 匹配协议类型
|
/// 通过 program_id 匹配协议类型
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn match_protocol_by_program_id(program_id: &Pubkey) -> Option<Protocol> {
|
pub fn match_protocol_by_program_id(program_id: &Pubkey) -> Option<Protocol> {
|
||||||
@@ -332,36 +224,22 @@ impl EventDispatcher {
|
|||||||
};
|
};
|
||||||
|
|
||||||
match protocol {
|
match protocol {
|
||||||
Protocol::PumpFun => pumpfun::parse_pumpfun_account_data(
|
Protocol::PumpFun => {
|
||||||
discriminator,
|
pumpfun::parse_pumpfun_account_data(discriminator, account, metadata)
|
||||||
account,
|
}
|
||||||
metadata,
|
Protocol::PumpSwap => {
|
||||||
),
|
pumpswap::parse_pumpswap_account_data(discriminator, account, metadata)
|
||||||
Protocol::PumpSwap => pumpswap::parse_pumpswap_account_data(
|
}
|
||||||
discriminator,
|
Protocol::Bonk => bonk::parse_bonk_account_data(discriminator, account, metadata),
|
||||||
account,
|
Protocol::RaydiumCpmm => {
|
||||||
metadata,
|
raydium_cpmm::parse_raydium_cpmm_account_data(discriminator, account, metadata)
|
||||||
),
|
}
|
||||||
Protocol::Bonk => bonk::parse_bonk_account_data(
|
Protocol::RaydiumClmm => {
|
||||||
discriminator,
|
raydium_clmm::parse_raydium_clmm_account_data(discriminator, account, metadata)
|
||||||
account,
|
}
|
||||||
metadata,
|
Protocol::RaydiumAmmV4 => {
|
||||||
),
|
raydium_amm_v4::parse_raydium_amm_v4_account_data(discriminator, account, metadata)
|
||||||
Protocol::RaydiumCpmm => raydium_cpmm::parse_raydium_cpmm_account_data(
|
}
|
||||||
discriminator,
|
|
||||||
account,
|
|
||||||
metadata,
|
|
||||||
),
|
|
||||||
Protocol::RaydiumClmm => raydium_clmm::parse_raydium_clmm_account_data(
|
|
||||||
discriminator,
|
|
||||||
account,
|
|
||||||
metadata,
|
|
||||||
),
|
|
||||||
Protocol::RaydiumAmmV4 => raydium_amm_v4::parse_raydium_amm_v4_account_data(
|
|
||||||
discriminator,
|
|
||||||
account,
|
|
||||||
metadata,
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user