Skip to main content

sol_parser_sdk/core/events/
enum_impl.rs

1use once_cell::sync::Lazy;
2use serde::{Deserialize, Serialize};
3use solana_sdk::signature::Signature;
4use super::types::*;
5
6// ====================== 统一的 DEX 事件枚举 ======================
7
8/// 统一的 DEX 事件枚举 - 参考 sol-dex-shreds 的做法
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub enum DexEvent {
11    // PumpFun 事件
12    PumpFunCreate(PumpFunCreateTokenEvent),     // - 已对接
13    PumpFunCreateV2(PumpFunCreateV2TokenEvent), // - 已对接 (CreateV2 / Mayhem)
14    PumpFunTrade(PumpFunTradeEvent),            // - 已对接 (统一交易事件,包含所有交易类型)
15    PumpFunBuy(PumpFunTradeEvent),              // - 已对接 (仅买入事件,用于过滤)
16    PumpFunSell(PumpFunTradeEvent),             // - 已对接 (仅卖出事件,用于过滤)
17    PumpFunBuyExactSolIn(PumpFunTradeEvent),    // - 已对接 (精确SOL买入事件,用于过滤)
18    PumpFunMigrate(PumpFunMigrateEvent),        // - 已对接
19
20    // PumpSwap 事件
21    PumpSwapTrade(PumpSwapTradeEvent), // - 已对接 (buy/sell/buy_exact_sol_in)
22    PumpSwapBuy(PumpSwapBuyEvent),     // - 已对接 (legacy)
23    PumpSwapSell(PumpSwapSellEvent),   // - 已对接 (legacy)
24    PumpSwapCreatePool(PumpSwapCreatePoolEvent), // - 已对接
25    PumpSwapLiquidityAdded(PumpSwapLiquidityAdded), // - 已对接
26    PumpSwapLiquidityRemoved(PumpSwapLiquidityRemoved), // - 已对接
27
28    // Meteora DAMM V2 事件
29    MeteoraDammV2Swap(MeteoraDammV2SwapEvent), // - 已对接
30    MeteoraDammV2CreatePosition(MeteoraDammV2CreatePositionEvent), // - 已对接
31    MeteoraDammV2ClosePosition(MeteoraDammV2ClosePositionEvent), // - 已对接
32    MeteoraDammV2AddLiquidity(MeteoraDammV2AddLiquidityEvent), // - 已对接
33    MeteoraDammV2RemoveLiquidity(MeteoraDammV2RemoveLiquidityEvent), // - 已对接
34
35    // Bonk 事件
36    BonkTrade(BonkTradeEvent),
37    BonkPoolCreate(BonkPoolCreateEvent),
38    BonkMigrateAmm(BonkMigrateAmmEvent),
39
40    // Raydium CLMM 事件
41    RaydiumClmmSwap(RaydiumClmmSwapEvent),
42    RaydiumClmmCreatePool(RaydiumClmmCreatePoolEvent),
43    RaydiumClmmOpenPosition(RaydiumClmmOpenPositionEvent),
44    RaydiumClmmOpenPositionWithTokenExtNft(RaydiumClmmOpenPositionWithTokenExtNftEvent),
45    RaydiumClmmClosePosition(RaydiumClmmClosePositionEvent),
46    RaydiumClmmIncreaseLiquidity(RaydiumClmmIncreaseLiquidityEvent),
47    RaydiumClmmDecreaseLiquidity(RaydiumClmmDecreaseLiquidityEvent),
48    RaydiumClmmCollectFee(RaydiumClmmCollectFeeEvent),
49
50    // Raydium CPMM 事件
51    RaydiumCpmmSwap(RaydiumCpmmSwapEvent),
52    RaydiumCpmmDeposit(RaydiumCpmmDepositEvent),
53    RaydiumCpmmWithdraw(RaydiumCpmmWithdrawEvent),
54    RaydiumCpmmInitialize(RaydiumCpmmInitializeEvent),
55
56    // Raydium AMM V4 事件
57    RaydiumAmmV4Swap(RaydiumAmmV4SwapEvent),
58    RaydiumAmmV4Deposit(RaydiumAmmV4DepositEvent),
59    RaydiumAmmV4Initialize2(RaydiumAmmV4Initialize2Event),
60    RaydiumAmmV4Withdraw(RaydiumAmmV4WithdrawEvent),
61    RaydiumAmmV4WithdrawPnl(RaydiumAmmV4WithdrawPnlEvent),
62
63    // Orca Whirlpool 事件
64    OrcaWhirlpoolSwap(OrcaWhirlpoolSwapEvent),
65    OrcaWhirlpoolLiquidityIncreased(OrcaWhirlpoolLiquidityIncreasedEvent),
66    OrcaWhirlpoolLiquidityDecreased(OrcaWhirlpoolLiquidityDecreasedEvent),
67    OrcaWhirlpoolPoolInitialized(OrcaWhirlpoolPoolInitializedEvent),
68
69    // Meteora Pools 事件
70    MeteoraPoolsSwap(MeteoraPoolsSwapEvent),
71    MeteoraPoolsAddLiquidity(MeteoraPoolsAddLiquidityEvent),
72    MeteoraPoolsRemoveLiquidity(MeteoraPoolsRemoveLiquidityEvent),
73    MeteoraPoolsBootstrapLiquidity(MeteoraPoolsBootstrapLiquidityEvent),
74    MeteoraPoolsPoolCreated(MeteoraPoolsPoolCreatedEvent),
75    MeteoraPoolsSetPoolFees(MeteoraPoolsSetPoolFeesEvent),
76
77    // Meteora DLMM 事件
78    MeteoraDlmmSwap(MeteoraDlmmSwapEvent),
79    MeteoraDlmmAddLiquidity(MeteoraDlmmAddLiquidityEvent),
80    MeteoraDlmmRemoveLiquidity(MeteoraDlmmRemoveLiquidityEvent),
81    MeteoraDlmmInitializePool(MeteoraDlmmInitializePoolEvent),
82    MeteoraDlmmInitializeBinArray(MeteoraDlmmInitializeBinArrayEvent),
83    MeteoraDlmmCreatePosition(MeteoraDlmmCreatePositionEvent),
84    MeteoraDlmmClosePosition(MeteoraDlmmClosePositionEvent),
85    MeteoraDlmmClaimFee(MeteoraDlmmClaimFeeEvent),
86
87    // 账户事件
88    TokenInfo(TokenInfoEvent),       // - 已对接
89    TokenAccount(TokenAccountEvent), // - 已对接
90    NonceAccount(NonceAccountEvent), // - 已对接
91    PumpSwapGlobalConfigAccount(PumpSwapGlobalConfigAccountEvent), // - 已对接
92    PumpSwapPoolAccount(PumpSwapPoolAccountEvent), // - 已对接
93
94    // 区块元数据事件
95    BlockMeta(BlockMetaEvent),
96
97    // 错误事件
98    Error(String),
99}
100
101// 静态默认 EventMetadata,用于 Error 事件
102static DEFAULT_METADATA: Lazy<EventMetadata> = Lazy::new(|| EventMetadata {
103    signature: Signature::from([0u8; 64]),
104    slot: 0,
105    tx_index: 0,
106    block_time_us: 0,
107    grpc_recv_us: 0,
108    recent_blockhash: None,
109});
110
111impl DexEvent {
112    /// 获取事件的元数据
113    pub fn metadata(&self) -> &EventMetadata {
114        match self {
115            // PumpFun 事件
116            DexEvent::PumpFunCreate(e) => &e.metadata,
117            DexEvent::PumpFunCreateV2(e) => &e.metadata,
118            DexEvent::PumpFunTrade(e) => &e.metadata,
119            DexEvent::PumpFunBuy(e) => &e.metadata,
120            DexEvent::PumpFunSell(e) => &e.metadata,
121            DexEvent::PumpFunBuyExactSolIn(e) => &e.metadata,
122            DexEvent::PumpFunMigrate(e) => &e.metadata,
123
124            // PumpSwap 事件
125            DexEvent::PumpSwapTrade(e) => &e.metadata,
126            DexEvent::PumpSwapBuy(e) => &e.metadata,
127            DexEvent::PumpSwapSell(e) => &e.metadata,
128            DexEvent::PumpSwapCreatePool(e) => &e.metadata,
129            DexEvent::PumpSwapLiquidityAdded(e) => &e.metadata,
130            DexEvent::PumpSwapLiquidityRemoved(e) => &e.metadata,
131
132            // Meteora DAMM V2 事件
133            DexEvent::MeteoraDammV2Swap(e) => &e.metadata,
134            DexEvent::MeteoraDammV2CreatePosition(e) => &e.metadata,
135            DexEvent::MeteoraDammV2ClosePosition(e) => &e.metadata,
136            DexEvent::MeteoraDammV2AddLiquidity(e) => &e.metadata,
137            DexEvent::MeteoraDammV2RemoveLiquidity(e) => &e.metadata,
138
139            // Bonk 事件
140            DexEvent::BonkTrade(e) => &e.metadata,
141            DexEvent::BonkPoolCreate(e) => &e.metadata,
142            DexEvent::BonkMigrateAmm(e) => &e.metadata,
143
144            // Raydium CLMM 事件
145            DexEvent::RaydiumClmmSwap(e) => &e.metadata,
146            DexEvent::RaydiumClmmCreatePool(e) => &e.metadata,
147            DexEvent::RaydiumClmmOpenPosition(e) => &e.metadata,
148            DexEvent::RaydiumClmmOpenPositionWithTokenExtNft(e) => &e.metadata,
149            DexEvent::RaydiumClmmClosePosition(e) => &e.metadata,
150            DexEvent::RaydiumClmmIncreaseLiquidity(e) => &e.metadata,
151            DexEvent::RaydiumClmmDecreaseLiquidity(e) => &e.metadata,
152            DexEvent::RaydiumClmmCollectFee(e) => &e.metadata,
153
154            // Raydium CPMM 事件
155            DexEvent::RaydiumCpmmSwap(e) => &e.metadata,
156            DexEvent::RaydiumCpmmDeposit(e) => &e.metadata,
157            DexEvent::RaydiumCpmmWithdraw(e) => &e.metadata,
158            DexEvent::RaydiumCpmmInitialize(e) => &e.metadata,
159
160            // Raydium AMM V4 事件
161            DexEvent::RaydiumAmmV4Swap(e) => &e.metadata,
162            DexEvent::RaydiumAmmV4Deposit(e) => &e.metadata,
163            DexEvent::RaydiumAmmV4Initialize2(e) => &e.metadata,
164            DexEvent::RaydiumAmmV4Withdraw(e) => &e.metadata,
165            DexEvent::RaydiumAmmV4WithdrawPnl(e) => &e.metadata,
166
167            // Orca Whirlpool 事件
168            DexEvent::OrcaWhirlpoolSwap(e) => &e.metadata,
169            DexEvent::OrcaWhirlpoolLiquidityIncreased(e) => &e.metadata,
170            DexEvent::OrcaWhirlpoolLiquidityDecreased(e) => &e.metadata,
171            DexEvent::OrcaWhirlpoolPoolInitialized(e) => &e.metadata,
172
173            // Meteora Pools 事件
174            DexEvent::MeteoraPoolsSwap(e) => &e.metadata,
175            DexEvent::MeteoraPoolsAddLiquidity(e) => &e.metadata,
176            DexEvent::MeteoraPoolsRemoveLiquidity(e) => &e.metadata,
177            DexEvent::MeteoraPoolsBootstrapLiquidity(e) => &e.metadata,
178            DexEvent::MeteoraPoolsPoolCreated(e) => &e.metadata,
179            DexEvent::MeteoraPoolsSetPoolFees(e) => &e.metadata,
180
181            // Meteora DLMM 事件
182            DexEvent::MeteoraDlmmSwap(e) => &e.metadata,
183            DexEvent::MeteoraDlmmAddLiquidity(e) => &e.metadata,
184            DexEvent::MeteoraDlmmRemoveLiquidity(e) => &e.metadata,
185            DexEvent::MeteoraDlmmInitializePool(e) => &e.metadata,
186            DexEvent::MeteoraDlmmInitializeBinArray(e) => &e.metadata,
187            DexEvent::MeteoraDlmmCreatePosition(e) => &e.metadata,
188            DexEvent::MeteoraDlmmClosePosition(e) => &e.metadata,
189            DexEvent::MeteoraDlmmClaimFee(e) => &e.metadata,
190
191            // 账户事件
192            DexEvent::TokenInfo(e) => &e.metadata,
193            DexEvent::TokenAccount(e) => &e.metadata,
194            DexEvent::NonceAccount(e) => &e.metadata,
195            DexEvent::PumpSwapGlobalConfigAccount(e) => &e.metadata,
196            DexEvent::PumpSwapPoolAccount(e) => &e.metadata,
197
198            // 区块元数据事件
199            DexEvent::BlockMeta(e) => &e.metadata,
200
201            // 错误事件 - 返回默认元数据
202            DexEvent::Error(_) => &DEFAULT_METADATA,
203        }
204    }
205
206    /// Mutable metadata for filling shared fields (e.g. recent_blockhash). Returns None for Error variant.
207    pub fn metadata_mut(&mut self) -> Option<&mut EventMetadata> {
208        match self {
209            DexEvent::PumpFunCreate(e) => Some(&mut e.metadata),
210            DexEvent::PumpFunCreateV2(e) => Some(&mut e.metadata),
211            DexEvent::PumpFunTrade(e) => Some(&mut e.metadata),
212            DexEvent::PumpFunBuy(e) => Some(&mut e.metadata),
213            DexEvent::PumpFunSell(e) => Some(&mut e.metadata),
214            DexEvent::PumpFunBuyExactSolIn(e) => Some(&mut e.metadata),
215            DexEvent::PumpFunMigrate(e) => Some(&mut e.metadata),
216            DexEvent::PumpSwapTrade(e) => Some(&mut e.metadata),
217            DexEvent::PumpSwapBuy(e) => Some(&mut e.metadata),
218            DexEvent::PumpSwapSell(e) => Some(&mut e.metadata),
219            DexEvent::PumpSwapCreatePool(e) => Some(&mut e.metadata),
220            DexEvent::PumpSwapLiquidityAdded(e) => Some(&mut e.metadata),
221            DexEvent::PumpSwapLiquidityRemoved(e) => Some(&mut e.metadata),
222            DexEvent::MeteoraDammV2Swap(e) => Some(&mut e.metadata),
223            DexEvent::MeteoraDammV2CreatePosition(e) => Some(&mut e.metadata),
224            DexEvent::MeteoraDammV2ClosePosition(e) => Some(&mut e.metadata),
225            DexEvent::MeteoraDammV2AddLiquidity(e) => Some(&mut e.metadata),
226            DexEvent::MeteoraDammV2RemoveLiquidity(e) => Some(&mut e.metadata),
227            DexEvent::BonkTrade(e) => Some(&mut e.metadata),
228            DexEvent::BonkPoolCreate(e) => Some(&mut e.metadata),
229            DexEvent::BonkMigrateAmm(e) => Some(&mut e.metadata),
230            DexEvent::RaydiumClmmSwap(e) => Some(&mut e.metadata),
231            DexEvent::RaydiumClmmCreatePool(e) => Some(&mut e.metadata),
232            DexEvent::RaydiumClmmOpenPosition(e) => Some(&mut e.metadata),
233            DexEvent::RaydiumClmmOpenPositionWithTokenExtNft(e) => Some(&mut e.metadata),
234            DexEvent::RaydiumClmmClosePosition(e) => Some(&mut e.metadata),
235            DexEvent::RaydiumClmmIncreaseLiquidity(e) => Some(&mut e.metadata),
236            DexEvent::RaydiumClmmDecreaseLiquidity(e) => Some(&mut e.metadata),
237            DexEvent::RaydiumClmmCollectFee(e) => Some(&mut e.metadata),
238            DexEvent::RaydiumCpmmSwap(e) => Some(&mut e.metadata),
239            DexEvent::RaydiumCpmmDeposit(e) => Some(&mut e.metadata),
240            DexEvent::RaydiumCpmmWithdraw(e) => Some(&mut e.metadata),
241            DexEvent::RaydiumCpmmInitialize(e) => Some(&mut e.metadata),
242            DexEvent::RaydiumAmmV4Swap(e) => Some(&mut e.metadata),
243            DexEvent::RaydiumAmmV4Deposit(e) => Some(&mut e.metadata),
244            DexEvent::RaydiumAmmV4Initialize2(e) => Some(&mut e.metadata),
245            DexEvent::RaydiumAmmV4Withdraw(e) => Some(&mut e.metadata),
246            DexEvent::RaydiumAmmV4WithdrawPnl(e) => Some(&mut e.metadata),
247            DexEvent::OrcaWhirlpoolSwap(e) => Some(&mut e.metadata),
248            DexEvent::OrcaWhirlpoolLiquidityIncreased(e) => Some(&mut e.metadata),
249            DexEvent::OrcaWhirlpoolLiquidityDecreased(e) => Some(&mut e.metadata),
250            DexEvent::OrcaWhirlpoolPoolInitialized(e) => Some(&mut e.metadata),
251            DexEvent::MeteoraPoolsSwap(e) => Some(&mut e.metadata),
252            DexEvent::MeteoraPoolsAddLiquidity(e) => Some(&mut e.metadata),
253            DexEvent::MeteoraPoolsRemoveLiquidity(e) => Some(&mut e.metadata),
254            DexEvent::MeteoraPoolsBootstrapLiquidity(e) => Some(&mut e.metadata),
255            DexEvent::MeteoraPoolsPoolCreated(e) => Some(&mut e.metadata),
256            DexEvent::MeteoraPoolsSetPoolFees(e) => Some(&mut e.metadata),
257            DexEvent::MeteoraDlmmSwap(e) => Some(&mut e.metadata),
258            DexEvent::MeteoraDlmmAddLiquidity(e) => Some(&mut e.metadata),
259            DexEvent::MeteoraDlmmRemoveLiquidity(e) => Some(&mut e.metadata),
260            DexEvent::MeteoraDlmmInitializePool(e) => Some(&mut e.metadata),
261            DexEvent::MeteoraDlmmInitializeBinArray(e) => Some(&mut e.metadata),
262            DexEvent::MeteoraDlmmCreatePosition(e) => Some(&mut e.metadata),
263            DexEvent::MeteoraDlmmClosePosition(e) => Some(&mut e.metadata),
264            DexEvent::MeteoraDlmmClaimFee(e) => Some(&mut e.metadata),
265            DexEvent::TokenInfo(e) => Some(&mut e.metadata),
266            DexEvent::TokenAccount(e) => Some(&mut e.metadata),
267            DexEvent::NonceAccount(e) => Some(&mut e.metadata),
268            DexEvent::PumpSwapGlobalConfigAccount(e) => Some(&mut e.metadata),
269            DexEvent::PumpSwapPoolAccount(e) => Some(&mut e.metadata),
270            DexEvent::BlockMeta(e) => Some(&mut e.metadata),
271            DexEvent::Error(_) => None,
272        }
273    }
274}