mirror of
https://github.com/0xfnzero/solana-streamer.git
synced 2026-08-20 04:18:06 +00:00
refactor: restructure event handling from trait objects to enum pattern
- Convert UnifiedEvent from trait object (Box<dyn UnifiedEvent>) to concrete enum type - Remove match_event! macro in favor of native match expressions - Simplify event metadata access: event.event_type() -> event.metadata().event_type - Unify event callback signatures: Fn(Box<dyn UnifiedEvent>) -> Fn(UnifiedEvent) - Update all example code to use the new enum-based event system - Optimize type system to reduce runtime overhead and improve type safety Affected scope: - Core event parser and processor - All protocol event definitions (PumpFun, PumpSwap, Bonk, Raydium series, etc.) - gRPC and Shred streaming modules - All example code
This commit is contained in:
@@ -1,59 +1,181 @@
|
||||
use crate::streaming::event_parser::common::EventType;
|
||||
use crate::streaming::event_parser::common::SwapData;
|
||||
use solana_sdk::signature::Signature;
|
||||
use crate::streaming::event_parser::common::EventMetadata;
|
||||
use crate::streaming::event_parser::core::account_event_parser::{
|
||||
NonceAccountEvent, TokenAccountEvent, TokenInfoEvent,
|
||||
};
|
||||
use crate::streaming::event_parser::protocols::block::block_meta_event::BlockMetaEvent;
|
||||
use crate::streaming::event_parser::protocols::bonk::events::*;
|
||||
use crate::streaming::event_parser::protocols::pumpfun::events::*;
|
||||
use crate::streaming::event_parser::protocols::pumpswap::events::*;
|
||||
use crate::streaming::event_parser::protocols::raydium_amm_v4::events::*;
|
||||
use crate::streaming::event_parser::protocols::raydium_clmm::events::*;
|
||||
use crate::streaming::event_parser::protocols::raydium_cpmm::events::*;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::fmt::Debug;
|
||||
|
||||
/// Unified Event Interface - All protocol events must implement this trait
|
||||
pub trait UnifiedEvent: Debug + Send + Sync {
|
||||
/// Get event type
|
||||
fn event_type(&self) -> EventType;
|
||||
/// Unified Event Enum - Replaces the trait-based approach with a type-safe enum
|
||||
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub enum UnifiedEvent {
|
||||
// Bonk events
|
||||
BonkTradeEvent(BonkTradeEvent),
|
||||
BonkPoolCreateEvent(BonkPoolCreateEvent),
|
||||
BonkMigrateToAmmEvent(BonkMigrateToAmmEvent),
|
||||
BonkMigrateToCpswapEvent(BonkMigrateToCpswapEvent),
|
||||
BonkPoolStateAccountEvent(BonkPoolStateAccountEvent),
|
||||
BonkGlobalConfigAccountEvent(BonkGlobalConfigAccountEvent),
|
||||
BonkPlatformConfigAccountEvent(BonkPlatformConfigAccountEvent),
|
||||
|
||||
/// Get transaction signature
|
||||
fn signature(&self) -> &Signature;
|
||||
// PumpFun events
|
||||
PumpFunCreateTokenEvent(PumpFunCreateTokenEvent),
|
||||
PumpFunTradeEvent(PumpFunTradeEvent),
|
||||
PumpFunMigrateEvent(PumpFunMigrateEvent),
|
||||
PumpFunBondingCurveAccountEvent(PumpFunBondingCurveAccountEvent),
|
||||
PumpFunGlobalAccountEvent(PumpFunGlobalAccountEvent),
|
||||
|
||||
/// Get slot number
|
||||
fn slot(&self) -> u64;
|
||||
// PumpSwap events
|
||||
PumpSwapBuyEvent(PumpSwapBuyEvent),
|
||||
PumpSwapSellEvent(PumpSwapSellEvent),
|
||||
PumpSwapCreatePoolEvent(PumpSwapCreatePoolEvent),
|
||||
PumpSwapDepositEvent(PumpSwapDepositEvent),
|
||||
PumpSwapWithdrawEvent(PumpSwapWithdrawEvent),
|
||||
PumpSwapGlobalConfigAccountEvent(PumpSwapGlobalConfigAccountEvent),
|
||||
PumpSwapPoolAccountEvent(PumpSwapPoolAccountEvent),
|
||||
|
||||
/// Get program received timestamp (milliseconds)
|
||||
fn recv_us(&self) -> i64;
|
||||
// Raydium AMM V4 events
|
||||
RaydiumAmmV4SwapEvent(RaydiumAmmV4SwapEvent),
|
||||
RaydiumAmmV4DepositEvent(RaydiumAmmV4DepositEvent),
|
||||
RaydiumAmmV4WithdrawEvent(RaydiumAmmV4WithdrawEvent),
|
||||
RaydiumAmmV4WithdrawPnlEvent(RaydiumAmmV4WithdrawPnlEvent),
|
||||
RaydiumAmmV4Initialize2Event(RaydiumAmmV4Initialize2Event),
|
||||
RaydiumAmmV4AmmInfoAccountEvent(RaydiumAmmV4AmmInfoAccountEvent),
|
||||
|
||||
/// Processing time consumption (milliseconds)
|
||||
fn handle_us(&self) -> i64;
|
||||
// Raydium CLMM events
|
||||
RaydiumClmmSwapEvent(RaydiumClmmSwapEvent),
|
||||
RaydiumClmmSwapV2Event(RaydiumClmmSwapV2Event),
|
||||
RaydiumClmmClosePositionEvent(RaydiumClmmClosePositionEvent),
|
||||
RaydiumClmmIncreaseLiquidityV2Event(RaydiumClmmIncreaseLiquidityV2Event),
|
||||
RaydiumClmmDecreaseLiquidityV2Event(RaydiumClmmDecreaseLiquidityV2Event),
|
||||
RaydiumClmmCreatePoolEvent(RaydiumClmmCreatePoolEvent),
|
||||
RaydiumClmmOpenPositionWithToken22NftEvent(RaydiumClmmOpenPositionWithToken22NftEvent),
|
||||
RaydiumClmmOpenPositionV2Event(RaydiumClmmOpenPositionV2Event),
|
||||
RaydiumClmmAmmConfigAccountEvent(RaydiumClmmAmmConfigAccountEvent),
|
||||
RaydiumClmmPoolStateAccountEvent(RaydiumClmmPoolStateAccountEvent),
|
||||
RaydiumClmmTickArrayStateAccountEvent(RaydiumClmmTickArrayStateAccountEvent),
|
||||
|
||||
/// Set processing time consumption (milliseconds)
|
||||
fn set_handle_us(&mut self, handle_us: i64);
|
||||
// Raydium CPMM events
|
||||
RaydiumCpmmSwapEvent(RaydiumCpmmSwapEvent),
|
||||
RaydiumCpmmDepositEvent(RaydiumCpmmDepositEvent),
|
||||
RaydiumCpmmWithdrawEvent(RaydiumCpmmWithdrawEvent),
|
||||
RaydiumCpmmInitializeEvent(RaydiumCpmmInitializeEvent),
|
||||
RaydiumCpmmAmmConfigAccountEvent(RaydiumCpmmAmmConfigAccountEvent),
|
||||
RaydiumCpmmPoolStateAccountEvent(RaydiumCpmmPoolStateAccountEvent),
|
||||
|
||||
/// Convert event to Any for downcasting
|
||||
fn as_any(&self) -> &dyn std::any::Any;
|
||||
|
||||
/// Convert event to mutable Any for downcasting
|
||||
fn as_any_mut(&mut self) -> &mut dyn std::any::Any;
|
||||
|
||||
/// Clone the event
|
||||
fn clone_boxed(&self) -> Box<dyn UnifiedEvent>;
|
||||
|
||||
/// Merge events (optional implementation)
|
||||
fn merge(&mut self, _other: &dyn UnifiedEvent) {
|
||||
// Default implementation: no merging operation
|
||||
}
|
||||
|
||||
/// Set swap data
|
||||
fn set_swap_data(&mut self, swap_data: SwapData);
|
||||
|
||||
/// swap_data is parsed
|
||||
fn swap_data_is_parsed(&self) -> bool;
|
||||
|
||||
/// Get index
|
||||
fn outer_index(&self) -> i64;
|
||||
fn inner_index(&self) -> Option<i64>;
|
||||
|
||||
/// Get transaction index in slot
|
||||
fn transaction_index(&self) -> Option<u64>;
|
||||
// Common events
|
||||
TokenAccountEvent(TokenAccountEvent),
|
||||
NonceAccountEvent(NonceAccountEvent),
|
||||
TokenInfoEvent(TokenInfoEvent),
|
||||
BlockMetaEvent(BlockMetaEvent),
|
||||
}
|
||||
|
||||
// 为Box<dyn UnifiedEvent>实现Clone
|
||||
impl Clone for Box<dyn UnifiedEvent> {
|
||||
fn clone(&self) -> Self {
|
||||
self.clone_boxed()
|
||||
impl UnifiedEvent {
|
||||
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,
|
||||
}
|
||||
}
|
||||
|
||||
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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user