feat: enhance protocol event parsers and bump to v0.3.5

- Add creator_fee support to Bonk events
- Improve PumpFun/PumpSwap event parsing
- Update documentation and common types
This commit is contained in:
ysq
2025-08-19 21:13:22 +08:00
parent 915209abd8
commit 372bb765af
11 changed files with 193 additions and 45 deletions
@@ -53,6 +53,15 @@ pub struct PumpSwapBuyEvent {
pub coin_creator_vault_authority: Pubkey,
}
pub const PUMP_SWAP_BUY_EVENT_LOG_SIZE: usize = 385;
pub fn pump_swap_buy_event_log_decode(data: &[u8]) -> Option<PumpSwapBuyEvent> {
if data.len() < PUMP_SWAP_BUY_EVENT_LOG_SIZE {
return None;
}
borsh::from_slice::<PumpSwapBuyEvent>(&data[..PUMP_SWAP_BUY_EVENT_LOG_SIZE]).ok()
}
// 使用宏生成UnifiedEvent实现,指定需要合并的字段
impl_unified_event!(
PumpSwapBuyEvent,
@@ -123,6 +132,15 @@ pub struct PumpSwapSellEvent {
pub coin_creator_vault_authority: Pubkey,
}
pub const PUMP_SWAP_SELL_EVENT_LOG_SIZE: usize = 352;
pub fn pump_swap_sell_event_log_decode(data: &[u8]) -> Option<PumpSwapSellEvent> {
if data.len() < PUMP_SWAP_SELL_EVENT_LOG_SIZE {
return None;
}
borsh::from_slice::<PumpSwapSellEvent>(&data[..PUMP_SWAP_SELL_EVENT_LOG_SIZE]).ok()
}
// 使用宏生成UnifiedEvent实现,指定需要合并的字段
impl_unified_event!(
PumpSwapSellEvent,
@@ -184,6 +202,15 @@ pub struct PumpSwapCreatePoolEvent {
pub pool_quote_token_account: Pubkey,
}
pub const PUMP_SWAP_CREATE_POOL_EVENT_LOG_SIZE: usize = 325;
pub fn pump_swap_create_pool_event_log_decode(data: &[u8]) -> Option<PumpSwapCreatePoolEvent> {
if data.len() < PUMP_SWAP_CREATE_POOL_EVENT_LOG_SIZE {
return None;
}
borsh::from_slice::<PumpSwapCreatePoolEvent>(&data[..PUMP_SWAP_CREATE_POOL_EVENT_LOG_SIZE]).ok()
}
impl_unified_event!(
PumpSwapCreatePoolEvent,
timestamp,
@@ -239,6 +266,15 @@ pub struct PumpSwapDepositEvent {
pub pool_quote_token_account: Pubkey,
}
pub const PUMP_SWAP_DEPOSIT_EVENT_LOG_SIZE: usize = 248;
pub fn pump_swap_deposit_event_log_decode(data: &[u8]) -> Option<PumpSwapDepositEvent> {
if data.len() < PUMP_SWAP_DEPOSIT_EVENT_LOG_SIZE {
return None;
}
borsh::from_slice::<PumpSwapDepositEvent>(&data[..PUMP_SWAP_DEPOSIT_EVENT_LOG_SIZE]).ok()
}
impl_unified_event!(
PumpSwapDepositEvent,
timestamp,
@@ -290,6 +326,15 @@ pub struct PumpSwapWithdrawEvent {
pub pool_quote_token_account: Pubkey,
}
pub const PUMP_SWAP_WITHDRAW_EVENT_LOG_SIZE: usize = 248;
pub fn pump_swap_withdraw_event_log_decode(data: &[u8]) -> Option<PumpSwapWithdrawEvent> {
if data.len() < PUMP_SWAP_WITHDRAW_EVENT_LOG_SIZE {
return None;
}
borsh::from_slice::<PumpSwapWithdrawEvent>(&data[..PUMP_SWAP_WITHDRAW_EVENT_LOG_SIZE]).ok()
}
impl_unified_event!(
PumpSwapWithdrawEvent,
timestamp,
@@ -8,8 +8,10 @@ use crate::streaming::event_parser::{
common::{read_u64_le, EventMetadata, EventType, ProtocolType},
core::traits::{EventParser, GenericEventParseConfig, GenericEventParser, UnifiedEvent},
protocols::pumpswap::{
discriminators, PumpSwapBuyEvent, PumpSwapCreatePoolEvent, PumpSwapDepositEvent,
PumpSwapSellEvent, PumpSwapWithdrawEvent,
discriminators, pump_swap_buy_event_log_decode, pump_swap_create_pool_event_log_decode,
pump_swap_deposit_event_log_decode, pump_swap_sell_event_log_decode,
pump_swap_withdraw_event_log_decode, PumpSwapBuyEvent, PumpSwapCreatePoolEvent,
PumpSwapDepositEvent, PumpSwapSellEvent, PumpSwapWithdrawEvent,
},
};
@@ -89,16 +91,13 @@ impl PumpSwapEventParser {
data: &[u8],
metadata: EventMetadata,
) -> Option<Box<dyn UnifiedEvent>> {
if let Ok(event) = borsh::from_slice::<PumpSwapBuyEvent>(data) {
if let Some(event) = pump_swap_buy_event_log_decode(data) {
let mut metadata = metadata;
metadata.set_id(format!(
"{}-{}-{}-{}",
metadata.signature, event.user, event.pool, event.base_amount_out
));
Some(Box::new(PumpSwapBuyEvent {
metadata,
..event
}))
Some(Box::new(PumpSwapBuyEvent { metadata, ..event }))
} else {
None
}
@@ -109,16 +108,13 @@ impl PumpSwapEventParser {
data: &[u8],
metadata: EventMetadata,
) -> Option<Box<dyn UnifiedEvent>> {
if let Ok(event) = borsh::from_slice::<PumpSwapSellEvent>(data) {
if let Some(event) = pump_swap_sell_event_log_decode(data) {
let mut metadata = metadata;
metadata.set_id(format!(
"{}-{}-{}-{}",
metadata.signature, event.user, event.pool, event.base_amount_in
));
Some(Box::new(PumpSwapSellEvent {
metadata,
..event
}))
Some(Box::new(PumpSwapSellEvent { metadata, ..event }))
} else {
None
}
@@ -129,16 +125,13 @@ impl PumpSwapEventParser {
data: &[u8],
metadata: EventMetadata,
) -> Option<Box<dyn UnifiedEvent>> {
if let Ok(event) = borsh::from_slice::<PumpSwapCreatePoolEvent>(data) {
if let Some(event) = pump_swap_create_pool_event_log_decode(data) {
let mut metadata = metadata;
metadata.set_id(format!(
"{}-{}-{}-{}",
metadata.signature, event.pool, event.creator, event.base_amount_in
));
Some(Box::new(PumpSwapCreatePoolEvent {
metadata,
..event
}))
Some(Box::new(PumpSwapCreatePoolEvent { metadata, ..event }))
} else {
None
}
@@ -149,16 +142,13 @@ impl PumpSwapEventParser {
data: &[u8],
metadata: EventMetadata,
) -> Option<Box<dyn UnifiedEvent>> {
if let Ok(event) = borsh::from_slice::<PumpSwapDepositEvent>(data) {
if let Some(event) = pump_swap_deposit_event_log_decode(data) {
let mut metadata = metadata;
metadata.set_id(format!(
"{}-{}-{}-{}",
metadata.signature, event.pool, event.user, event.lp_token_amount_out
));
Some(Box::new(PumpSwapDepositEvent {
metadata,
..event
}))
Some(Box::new(PumpSwapDepositEvent { metadata, ..event }))
} else {
None
}
@@ -169,16 +159,13 @@ impl PumpSwapEventParser {
data: &[u8],
metadata: EventMetadata,
) -> Option<Box<dyn UnifiedEvent>> {
if let Ok(event) = borsh::from_slice::<PumpSwapWithdrawEvent>(data) {
if let Some(event) = pump_swap_withdraw_event_log_decode(data) {
let mut metadata = metadata;
metadata.set_id(format!(
"{}-{}-{}-{}",
metadata.signature, event.pool, event.user, event.lp_token_amount_in
));
Some(Box::new(PumpSwapWithdrawEvent {
metadata,
..event
}))
Some(Box::new(PumpSwapWithdrawEvent { metadata, ..event }))
} else {
None
}