Files
sol-trade-sdk/src/common/pumpswap/logs_events.rs
T

106 lines
4.8 KiB
Rust
Executable File

use base64::engine::general_purpose;
use base64::Engine;
use crate::common::pumpswap::logs_data::{
BuyEvent, SellEvent, CreatePoolEvent, DepositEvent, WithdrawEvent,
DisableEvent, UpdateAdminEvent, UpdateFeeConfigEvent, discriminators
};
use borsh::BorshDeserialize;
pub const PROGRAM_DATA: &str = "Program data: ";
pub const PROGRAM_LOG_PREFIX: &str = "Program log: PumpSwap: ";
/// PumpSwap事件枚举
#[derive(Debug)]
pub enum PumpSwapEvent {
Buy(BuyEvent),
Sell(SellEvent),
CreatePool(CreatePoolEvent),
Deposit(DepositEvent),
Withdraw(WithdrawEvent),
Disable(DisableEvent),
UpdateAdmin(UpdateAdminEvent),
UpdateFeeConfig(UpdateFeeConfigEvent),
Error(String),
}
impl PumpSwapEvent {
/// 解析日志并提取PumpSwap事件
pub fn parse_logs(logs: &[String]) -> Vec<PumpSwapEvent> {
let mut events = Vec::new();
if logs.is_empty() {
return events;
}
for log in logs {
// 检查是否是事件日志
if let Some(event_data) = log.strip_prefix(PROGRAM_DATA) {
let borsh_bytes = match general_purpose::STANDARD.decode(event_data) {
Ok(bytes) => bytes,
Err(_) => continue,
};
// 检查鉴别器
if borsh_bytes.len() < 16 {
continue;
}
let prefix = [0xe4, 0x45, 0xa5, 0x2e, 0x51, 0xcb, 0x9a, 0x1d];
let discriminator = &[&prefix[..], &borsh_bytes[..8]].concat();
let data = &borsh_bytes[8..];
// 根据鉴别器解析不同类型的事件
if discriminator == discriminators::BUY_EVENT {
if let Ok(mut event) = BuyEvent::deserialize(&mut &data[..]) {
event.signature = String::new(); // 在外部设置
events.push(PumpSwapEvent::Buy(event));
}
} else if discriminator == discriminators::SELL_EVENT {
if let Ok(mut event) = SellEvent::deserialize(&mut &data[..]) {
event.signature = String::new(); // 在外部设置
events.push(PumpSwapEvent::Sell(event));
}
} else if discriminator == discriminators::CREATE_POOL_EVENT {
if let Ok(mut event) = CreatePoolEvent::deserialize(&mut &data[..]) {
event.signature = String::new(); // 在外部设置
events.push(PumpSwapEvent::CreatePool(event));
}
} else if discriminator == discriminators::DEPOSIT_EVENT {
if let Ok(mut event) = DepositEvent::deserialize(&mut &data[..]) {
event.signature = String::new(); // 在外部设置
events.push(PumpSwapEvent::Deposit(event));
}
} else if discriminator == discriminators::WITHDRAW_EVENT {
if let Ok(mut event) = WithdrawEvent::deserialize(&mut &data[..]) {
event.signature = String::new(); // 在外部设置
events.push(PumpSwapEvent::Withdraw(event));
}
} else if discriminator == discriminators::DISABLE_EVENT {
if let Ok(mut event) = DisableEvent::deserialize(&mut &data[..]) {
event.signature = String::new(); // 在外部设置
events.push(PumpSwapEvent::Disable(event));
}
} else if discriminator == discriminators::UPDATE_ADMIN_EVENT {
if let Ok(mut event) = UpdateAdminEvent::deserialize(&mut &data[..]) {
event.signature = String::new(); // 在外部设置
events.push(PumpSwapEvent::UpdateAdmin(event));
}
} else if discriminator == discriminators::UPDATE_FEE_CONFIG_EVENT {
if let Ok(mut event) = UpdateFeeConfigEvent::deserialize(&mut &data[..]) {
event.signature = String::new(); // 在外部设置
events.push(PumpSwapEvent::UpdateFeeConfig(event));
}
}
} else if let Some(event_log) = log.strip_prefix(PROGRAM_LOG_PREFIX) {
// 处理程序日志中的事件信息
if event_log.contains("BuyEvent") {
// 这里可以添加从日志文本中解析事件的逻辑
// 例如使用正则表达式提取关键信息
} else if event_log.contains("SellEvent") {
// 同上
}
// 其他事件类型...
}
}
events
}
}