Skip to main content

sol_parser_sdk/core/events/
enum_impl.rs

1use super::types::*;
2use once_cell::sync::Lazy;
3use serde::{Deserialize, Serialize};
4use solana_sdk::signature::Signature;
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    /// Pump fees:`CreateFeeSharingConfigEvent`(`pfeeUx...`,见 `idls/pump_fees.json`)
20    PumpFeesCreateFeeSharingConfig(PumpFeesCreateFeeSharingConfigEvent),
21    PumpFeesInitializeFeeConfig(PumpFeesInitializeFeeConfigEvent),
22    PumpFeesResetFeeSharingConfig(PumpFeesResetFeeSharingConfigEvent),
23    PumpFeesRevokeFeeSharingAuthority(PumpFeesRevokeFeeSharingAuthorityEvent),
24    PumpFeesTransferFeeSharingAuthority(PumpFeesTransferFeeSharingAuthorityEvent),
25    PumpFeesUpdateAdmin(PumpFeesUpdateAdminEvent),
26    PumpFeesUpdateFeeConfig(PumpFeesUpdateFeeConfigEvent),
27    PumpFeesUpdateFeeShares(PumpFeesUpdateFeeSharesEvent),
28    PumpFeesUpsertFeeTiers(PumpFeesUpsertFeeTiersEvent),
29    /// Pump.fun:曲线 creator 迁移(`migrateBondingCurveCreatorEvent`)
30    PumpFunMigrateBondingCurveCreator(PumpFunMigrateBondingCurveCreatorEvent),
31    PumpFunGlobalAccount(PumpFunGlobalAccountEvent), // - 已对接
32    PumpSwapTrade(PumpSwapTradeEvent),               // - 已对接 (buy/sell/buy_exact_sol_in)
33    PumpSwapBuy(PumpSwapBuyEvent),                   // - 已对接 (legacy)
34    PumpSwapSell(PumpSwapSellEvent),                 // - 已对接 (legacy)
35    PumpSwapCreatePool(PumpSwapCreatePoolEvent),     // - 已对接
36    PumpSwapLiquidityAdded(PumpSwapLiquidityAdded),  // - 已对接
37    PumpSwapLiquidityRemoved(PumpSwapLiquidityRemoved), // - 已对接
38
39    // Meteora DAMM V2 事件
40    MeteoraDammV2Swap(MeteoraDammV2SwapEvent), // - 已对接
41    MeteoraDammV2CreatePosition(MeteoraDammV2CreatePositionEvent), // - 已对接
42    MeteoraDammV2ClosePosition(MeteoraDammV2ClosePositionEvent), // - 已对接
43    MeteoraDammV2AddLiquidity(MeteoraDammV2AddLiquidityEvent), // - 已对接
44    MeteoraDammV2RemoveLiquidity(MeteoraDammV2RemoveLiquidityEvent), // - 已对接
45
46    // Bonk 事件
47    BonkTrade(BonkTradeEvent),
48    BonkPoolCreate(BonkPoolCreateEvent),
49    BonkMigrateAmm(BonkMigrateAmmEvent),
50
51    // Raydium CLMM 事件
52    RaydiumClmmSwap(RaydiumClmmSwapEvent),
53    RaydiumClmmCreatePool(RaydiumClmmCreatePoolEvent),
54    RaydiumClmmOpenPosition(RaydiumClmmOpenPositionEvent),
55    RaydiumClmmOpenPositionWithTokenExtNft(RaydiumClmmOpenPositionWithTokenExtNftEvent),
56    RaydiumClmmClosePosition(RaydiumClmmClosePositionEvent),
57    RaydiumClmmIncreaseLiquidity(RaydiumClmmIncreaseLiquidityEvent),
58    RaydiumClmmDecreaseLiquidity(RaydiumClmmDecreaseLiquidityEvent),
59    RaydiumClmmCollectFee(RaydiumClmmCollectFeeEvent),
60
61    // Raydium CPMM 事件
62    RaydiumCpmmSwap(RaydiumCpmmSwapEvent),
63    RaydiumCpmmDeposit(RaydiumCpmmDepositEvent),
64    RaydiumCpmmWithdraw(RaydiumCpmmWithdrawEvent),
65    RaydiumCpmmInitialize(RaydiumCpmmInitializeEvent),
66
67    // Raydium AMM V4 事件
68    RaydiumAmmV4Swap(RaydiumAmmV4SwapEvent),
69    RaydiumAmmV4Deposit(RaydiumAmmV4DepositEvent),
70    RaydiumAmmV4Initialize2(RaydiumAmmV4Initialize2Event),
71    RaydiumAmmV4Withdraw(RaydiumAmmV4WithdrawEvent),
72    RaydiumAmmV4WithdrawPnl(RaydiumAmmV4WithdrawPnlEvent),
73
74    // Orca Whirlpool 事件
75    OrcaWhirlpoolSwap(OrcaWhirlpoolSwapEvent),
76    OrcaWhirlpoolLiquidityIncreased(OrcaWhirlpoolLiquidityIncreasedEvent),
77    OrcaWhirlpoolLiquidityDecreased(OrcaWhirlpoolLiquidityDecreasedEvent),
78    OrcaWhirlpoolPoolInitialized(OrcaWhirlpoolPoolInitializedEvent),
79
80    // Meteora Pools 事件
81    MeteoraPoolsSwap(MeteoraPoolsSwapEvent),
82    MeteoraPoolsAddLiquidity(MeteoraPoolsAddLiquidityEvent),
83    MeteoraPoolsRemoveLiquidity(MeteoraPoolsRemoveLiquidityEvent),
84    MeteoraPoolsBootstrapLiquidity(MeteoraPoolsBootstrapLiquidityEvent),
85    MeteoraPoolsPoolCreated(MeteoraPoolsPoolCreatedEvent),
86    MeteoraPoolsSetPoolFees(MeteoraPoolsSetPoolFeesEvent),
87
88    // Meteora DLMM 事件
89    MeteoraDlmmSwap(MeteoraDlmmSwapEvent),
90    MeteoraDlmmAddLiquidity(MeteoraDlmmAddLiquidityEvent),
91    MeteoraDlmmRemoveLiquidity(MeteoraDlmmRemoveLiquidityEvent),
92    MeteoraDlmmInitializePool(MeteoraDlmmInitializePoolEvent),
93    MeteoraDlmmInitializeBinArray(MeteoraDlmmInitializeBinArrayEvent),
94    MeteoraDlmmCreatePosition(MeteoraDlmmCreatePositionEvent),
95    MeteoraDlmmClosePosition(MeteoraDlmmClosePositionEvent),
96    MeteoraDlmmClaimFee(MeteoraDlmmClaimFeeEvent),
97
98    // 账户事件
99    TokenInfo(TokenInfoEvent),       // - 已对接
100    TokenAccount(TokenAccountEvent), // - 已对接
101    NonceAccount(NonceAccountEvent), // - 已对接
102    PumpSwapGlobalConfigAccount(PumpSwapGlobalConfigAccountEvent), // - 已对接
103    PumpSwapPoolAccount(PumpSwapPoolAccountEvent), // - 已对接
104
105    // 区块元数据事件
106    BlockMeta(BlockMetaEvent),
107
108    // 错误事件
109    Error(String),
110}
111
112// 静态默认 EventMetadata,用于 Error 事件
113static DEFAULT_METADATA: Lazy<EventMetadata> = Lazy::new(|| EventMetadata {
114    signature: Signature::from([0u8; 64]),
115    slot: 0,
116    tx_index: 0,
117    block_time_us: 0,
118    grpc_recv_us: 0,
119    recent_blockhash: None,
120});
121
122impl DexEvent {
123    /// 获取事件的元数据
124    pub fn metadata(&self) -> &EventMetadata {
125        match self {
126            // PumpFun 事件
127            DexEvent::PumpFunCreate(e) => &e.metadata,
128            DexEvent::PumpFunCreateV2(e) => &e.metadata,
129            DexEvent::PumpFunTrade(e) => &e.metadata,
130            DexEvent::PumpFunBuy(e) => &e.metadata,
131            DexEvent::PumpFunSell(e) => &e.metadata,
132            DexEvent::PumpFunBuyExactSolIn(e) => &e.metadata,
133            DexEvent::PumpFunMigrate(e) => &e.metadata,
134            DexEvent::PumpFeesCreateFeeSharingConfig(e) => &e.metadata,
135            DexEvent::PumpFeesInitializeFeeConfig(e) => &e.metadata,
136            DexEvent::PumpFeesResetFeeSharingConfig(e) => &e.metadata,
137            DexEvent::PumpFeesRevokeFeeSharingAuthority(e) => &e.metadata,
138            DexEvent::PumpFeesTransferFeeSharingAuthority(e) => &e.metadata,
139            DexEvent::PumpFeesUpdateAdmin(e) => &e.metadata,
140            DexEvent::PumpFeesUpdateFeeConfig(e) => &e.metadata,
141            DexEvent::PumpFeesUpdateFeeShares(e) => &e.metadata,
142            DexEvent::PumpFeesUpsertFeeTiers(e) => &e.metadata,
143            DexEvent::PumpFunMigrateBondingCurveCreator(e) => &e.metadata,
144            DexEvent::PumpFunGlobalAccount(e) => &e.metadata,
145
146            // PumpSwap 事件
147            DexEvent::PumpSwapTrade(e) => &e.metadata,
148            DexEvent::PumpSwapBuy(e) => &e.metadata,
149            DexEvent::PumpSwapSell(e) => &e.metadata,
150            DexEvent::PumpSwapCreatePool(e) => &e.metadata,
151            DexEvent::PumpSwapLiquidityAdded(e) => &e.metadata,
152            DexEvent::PumpSwapLiquidityRemoved(e) => &e.metadata,
153
154            // Meteora DAMM V2 事件
155            DexEvent::MeteoraDammV2Swap(e) => &e.metadata,
156            DexEvent::MeteoraDammV2CreatePosition(e) => &e.metadata,
157            DexEvent::MeteoraDammV2ClosePosition(e) => &e.metadata,
158            DexEvent::MeteoraDammV2AddLiquidity(e) => &e.metadata,
159            DexEvent::MeteoraDammV2RemoveLiquidity(e) => &e.metadata,
160
161            // Bonk 事件
162            DexEvent::BonkTrade(e) => &e.metadata,
163            DexEvent::BonkPoolCreate(e) => &e.metadata,
164            DexEvent::BonkMigrateAmm(e) => &e.metadata,
165
166            // Raydium CLMM 事件
167            DexEvent::RaydiumClmmSwap(e) => &e.metadata,
168            DexEvent::RaydiumClmmCreatePool(e) => &e.metadata,
169            DexEvent::RaydiumClmmOpenPosition(e) => &e.metadata,
170            DexEvent::RaydiumClmmOpenPositionWithTokenExtNft(e) => &e.metadata,
171            DexEvent::RaydiumClmmClosePosition(e) => &e.metadata,
172            DexEvent::RaydiumClmmIncreaseLiquidity(e) => &e.metadata,
173            DexEvent::RaydiumClmmDecreaseLiquidity(e) => &e.metadata,
174            DexEvent::RaydiumClmmCollectFee(e) => &e.metadata,
175
176            // Raydium CPMM 事件
177            DexEvent::RaydiumCpmmSwap(e) => &e.metadata,
178            DexEvent::RaydiumCpmmDeposit(e) => &e.metadata,
179            DexEvent::RaydiumCpmmWithdraw(e) => &e.metadata,
180            DexEvent::RaydiumCpmmInitialize(e) => &e.metadata,
181
182            // Raydium AMM V4 事件
183            DexEvent::RaydiumAmmV4Swap(e) => &e.metadata,
184            DexEvent::RaydiumAmmV4Deposit(e) => &e.metadata,
185            DexEvent::RaydiumAmmV4Initialize2(e) => &e.metadata,
186            DexEvent::RaydiumAmmV4Withdraw(e) => &e.metadata,
187            DexEvent::RaydiumAmmV4WithdrawPnl(e) => &e.metadata,
188
189            // Orca Whirlpool 事件
190            DexEvent::OrcaWhirlpoolSwap(e) => &e.metadata,
191            DexEvent::OrcaWhirlpoolLiquidityIncreased(e) => &e.metadata,
192            DexEvent::OrcaWhirlpoolLiquidityDecreased(e) => &e.metadata,
193            DexEvent::OrcaWhirlpoolPoolInitialized(e) => &e.metadata,
194
195            // Meteora Pools 事件
196            DexEvent::MeteoraPoolsSwap(e) => &e.metadata,
197            DexEvent::MeteoraPoolsAddLiquidity(e) => &e.metadata,
198            DexEvent::MeteoraPoolsRemoveLiquidity(e) => &e.metadata,
199            DexEvent::MeteoraPoolsBootstrapLiquidity(e) => &e.metadata,
200            DexEvent::MeteoraPoolsPoolCreated(e) => &e.metadata,
201            DexEvent::MeteoraPoolsSetPoolFees(e) => &e.metadata,
202
203            // Meteora DLMM 事件
204            DexEvent::MeteoraDlmmSwap(e) => &e.metadata,
205            DexEvent::MeteoraDlmmAddLiquidity(e) => &e.metadata,
206            DexEvent::MeteoraDlmmRemoveLiquidity(e) => &e.metadata,
207            DexEvent::MeteoraDlmmInitializePool(e) => &e.metadata,
208            DexEvent::MeteoraDlmmInitializeBinArray(e) => &e.metadata,
209            DexEvent::MeteoraDlmmCreatePosition(e) => &e.metadata,
210            DexEvent::MeteoraDlmmClosePosition(e) => &e.metadata,
211            DexEvent::MeteoraDlmmClaimFee(e) => &e.metadata,
212
213            // 账户事件
214            DexEvent::TokenInfo(e) => &e.metadata,
215            DexEvent::TokenAccount(e) => &e.metadata,
216            DexEvent::NonceAccount(e) => &e.metadata,
217            DexEvent::PumpSwapGlobalConfigAccount(e) => &e.metadata,
218            DexEvent::PumpSwapPoolAccount(e) => &e.metadata,
219
220            // 区块元数据事件
221            DexEvent::BlockMeta(e) => &e.metadata,
222
223            // 错误事件 - 返回默认元数据
224            DexEvent::Error(_) => &DEFAULT_METADATA,
225        }
226    }
227
228    /// Mutable metadata for filling shared fields (e.g. recent_blockhash). Returns None for Error variant.
229    pub fn metadata_mut(&mut self) -> Option<&mut EventMetadata> {
230        match self {
231            DexEvent::PumpFunCreate(e) => Some(&mut e.metadata),
232            DexEvent::PumpFunCreateV2(e) => Some(&mut e.metadata),
233            DexEvent::PumpFunTrade(e) => Some(&mut e.metadata),
234            DexEvent::PumpFunBuy(e) => Some(&mut e.metadata),
235            DexEvent::PumpFunSell(e) => Some(&mut e.metadata),
236            DexEvent::PumpFunBuyExactSolIn(e) => Some(&mut e.metadata),
237            DexEvent::PumpFunMigrate(e) => Some(&mut e.metadata),
238            DexEvent::PumpFeesCreateFeeSharingConfig(e) => Some(&mut e.metadata),
239            DexEvent::PumpFeesInitializeFeeConfig(e) => Some(&mut e.metadata),
240            DexEvent::PumpFeesResetFeeSharingConfig(e) => Some(&mut e.metadata),
241            DexEvent::PumpFeesRevokeFeeSharingAuthority(e) => Some(&mut e.metadata),
242            DexEvent::PumpFeesTransferFeeSharingAuthority(e) => Some(&mut e.metadata),
243            DexEvent::PumpFeesUpdateAdmin(e) => Some(&mut e.metadata),
244            DexEvent::PumpFeesUpdateFeeConfig(e) => Some(&mut e.metadata),
245            DexEvent::PumpFeesUpdateFeeShares(e) => Some(&mut e.metadata),
246            DexEvent::PumpFeesUpsertFeeTiers(e) => Some(&mut e.metadata),
247            DexEvent::PumpFunMigrateBondingCurveCreator(e) => Some(&mut e.metadata),
248            DexEvent::PumpFunGlobalAccount(e) => Some(&mut e.metadata),
249            DexEvent::PumpSwapTrade(e) => Some(&mut e.metadata),
250            DexEvent::PumpSwapBuy(e) => Some(&mut e.metadata),
251            DexEvent::PumpSwapSell(e) => Some(&mut e.metadata),
252            DexEvent::PumpSwapCreatePool(e) => Some(&mut e.metadata),
253            DexEvent::PumpSwapLiquidityAdded(e) => Some(&mut e.metadata),
254            DexEvent::PumpSwapLiquidityRemoved(e) => Some(&mut e.metadata),
255            DexEvent::MeteoraDammV2Swap(e) => Some(&mut e.metadata),
256            DexEvent::MeteoraDammV2CreatePosition(e) => Some(&mut e.metadata),
257            DexEvent::MeteoraDammV2ClosePosition(e) => Some(&mut e.metadata),
258            DexEvent::MeteoraDammV2AddLiquidity(e) => Some(&mut e.metadata),
259            DexEvent::MeteoraDammV2RemoveLiquidity(e) => Some(&mut e.metadata),
260            DexEvent::BonkTrade(e) => Some(&mut e.metadata),
261            DexEvent::BonkPoolCreate(e) => Some(&mut e.metadata),
262            DexEvent::BonkMigrateAmm(e) => Some(&mut e.metadata),
263            DexEvent::RaydiumClmmSwap(e) => Some(&mut e.metadata),
264            DexEvent::RaydiumClmmCreatePool(e) => Some(&mut e.metadata),
265            DexEvent::RaydiumClmmOpenPosition(e) => Some(&mut e.metadata),
266            DexEvent::RaydiumClmmOpenPositionWithTokenExtNft(e) => Some(&mut e.metadata),
267            DexEvent::RaydiumClmmClosePosition(e) => Some(&mut e.metadata),
268            DexEvent::RaydiumClmmIncreaseLiquidity(e) => Some(&mut e.metadata),
269            DexEvent::RaydiumClmmDecreaseLiquidity(e) => Some(&mut e.metadata),
270            DexEvent::RaydiumClmmCollectFee(e) => Some(&mut e.metadata),
271            DexEvent::RaydiumCpmmSwap(e) => Some(&mut e.metadata),
272            DexEvent::RaydiumCpmmDeposit(e) => Some(&mut e.metadata),
273            DexEvent::RaydiumCpmmWithdraw(e) => Some(&mut e.metadata),
274            DexEvent::RaydiumCpmmInitialize(e) => Some(&mut e.metadata),
275            DexEvent::RaydiumAmmV4Swap(e) => Some(&mut e.metadata),
276            DexEvent::RaydiumAmmV4Deposit(e) => Some(&mut e.metadata),
277            DexEvent::RaydiumAmmV4Initialize2(e) => Some(&mut e.metadata),
278            DexEvent::RaydiumAmmV4Withdraw(e) => Some(&mut e.metadata),
279            DexEvent::RaydiumAmmV4WithdrawPnl(e) => Some(&mut e.metadata),
280            DexEvent::OrcaWhirlpoolSwap(e) => Some(&mut e.metadata),
281            DexEvent::OrcaWhirlpoolLiquidityIncreased(e) => Some(&mut e.metadata),
282            DexEvent::OrcaWhirlpoolLiquidityDecreased(e) => Some(&mut e.metadata),
283            DexEvent::OrcaWhirlpoolPoolInitialized(e) => Some(&mut e.metadata),
284            DexEvent::MeteoraPoolsSwap(e) => Some(&mut e.metadata),
285            DexEvent::MeteoraPoolsAddLiquidity(e) => Some(&mut e.metadata),
286            DexEvent::MeteoraPoolsRemoveLiquidity(e) => Some(&mut e.metadata),
287            DexEvent::MeteoraPoolsBootstrapLiquidity(e) => Some(&mut e.metadata),
288            DexEvent::MeteoraPoolsPoolCreated(e) => Some(&mut e.metadata),
289            DexEvent::MeteoraPoolsSetPoolFees(e) => Some(&mut e.metadata),
290            DexEvent::MeteoraDlmmSwap(e) => Some(&mut e.metadata),
291            DexEvent::MeteoraDlmmAddLiquidity(e) => Some(&mut e.metadata),
292            DexEvent::MeteoraDlmmRemoveLiquidity(e) => Some(&mut e.metadata),
293            DexEvent::MeteoraDlmmInitializePool(e) => Some(&mut e.metadata),
294            DexEvent::MeteoraDlmmInitializeBinArray(e) => Some(&mut e.metadata),
295            DexEvent::MeteoraDlmmCreatePosition(e) => Some(&mut e.metadata),
296            DexEvent::MeteoraDlmmClosePosition(e) => Some(&mut e.metadata),
297            DexEvent::MeteoraDlmmClaimFee(e) => Some(&mut e.metadata),
298            DexEvent::TokenInfo(e) => Some(&mut e.metadata),
299            DexEvent::TokenAccount(e) => Some(&mut e.metadata),
300            DexEvent::NonceAccount(e) => Some(&mut e.metadata),
301            DexEvent::PumpSwapGlobalConfigAccount(e) => Some(&mut e.metadata),
302            DexEvent::PumpSwapPoolAccount(e) => Some(&mut e.metadata),
303            DexEvent::BlockMeta(e) => Some(&mut e.metadata),
304            DexEvent::Error(_) => None,
305        }
306    }
307}