feat: bridge streamer to sol-parser-sdk

This commit is contained in:
0xfnzero
2026-05-15 05:09:29 +08:00
parent e29a2e4f5a
commit ab84249f4a
85 changed files with 6350 additions and 1362 deletions
@@ -323,7 +323,8 @@ pub fn pumpfun_trade_event_log_decode(data: &[u8]) -> Option<PumpFunTradeEvent>
if data.len() < PUMPFUN_TRADE_EVENT_LOG_SIZE {
return None;
}
let mut event = borsh::from_slice::<PumpFunTradeEvent>(&data[..PUMPFUN_TRADE_EVENT_LOG_SIZE]).ok()?;
let mut event =
borsh::from_slice::<PumpFunTradeEvent>(&data[..PUMPFUN_TRADE_EVENT_LOG_SIZE]).ok()?;
let mut offset = PUMPFUN_TRADE_EVENT_LOG_SIZE;
if offset < data.len() {
let (ix_name, inc) = read_borsh_string(data, offset).unwrap_or((String::new(), 0));
@@ -335,7 +336,8 @@ pub fn pumpfun_trade_event_log_decode(data: &[u8]) -> Option<PumpFunTradeEvent>
offset += 1;
}
if offset + 8 <= data.len() {
event.cashback_fee_basis_points = u64::from_le_bytes(data[offset..offset + 8].try_into().ok()?);
event.cashback_fee_basis_points =
u64::from_le_bytes(data[offset..offset + 8].try_into().ok()?);
offset += 8;
}
if offset + 8 <= data.len() {
@@ -415,6 +417,138 @@ pub struct PumpFunMigrateEvent {
pub program: Pubkey,
}
// ---------- pump-fees IDL: `idls/pump_fees.json` (Program `pfeeUx...`) ----------
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PumpFeesShareholder {
pub address: Pubkey,
pub share_bps: u16,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum PumpFeesConfigStatus {
Paused,
Active,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PumpFeesFees {
pub lp_fee_bps: u64,
pub protocol_fee_bps: u64,
pub creator_fee_bps: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PumpFeesFeeTier {
pub market_cap_lamports_threshold: u128,
pub fees: PumpFeesFees,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PumpFeesCreateFeeSharingConfigEvent {
pub metadata: EventMetadata,
pub timestamp: i64,
pub mint: Pubkey,
pub bonding_curve: Pubkey,
pub pool: Option<Pubkey>,
pub sharing_config: Pubkey,
pub admin: Pubkey,
pub initial_shareholders: Vec<PumpFeesShareholder>,
pub status: PumpFeesConfigStatus,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PumpFeesInitializeFeeConfigEvent {
pub metadata: EventMetadata,
pub timestamp: i64,
pub admin: Pubkey,
pub fee_config: Pubkey,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PumpFeesResetFeeSharingConfigEvent {
pub metadata: EventMetadata,
pub timestamp: i64,
pub mint: Pubkey,
pub sharing_config: Pubkey,
pub old_admin: Pubkey,
pub old_shareholders: Vec<PumpFeesShareholder>,
pub new_admin: Pubkey,
pub new_shareholders: Vec<PumpFeesShareholder>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PumpFeesRevokeFeeSharingAuthorityEvent {
pub metadata: EventMetadata,
pub timestamp: i64,
pub mint: Pubkey,
pub sharing_config: Pubkey,
pub admin: Pubkey,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PumpFeesTransferFeeSharingAuthorityEvent {
pub metadata: EventMetadata,
pub timestamp: i64,
pub mint: Pubkey,
pub sharing_config: Pubkey,
pub old_admin: Pubkey,
pub new_admin: Pubkey,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PumpFeesUpdateAdminEvent {
pub metadata: EventMetadata,
pub timestamp: i64,
pub old_admin: Pubkey,
pub new_admin: Pubkey,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PumpFeesUpdateFeeConfigEvent {
pub metadata: EventMetadata,
pub timestamp: i64,
pub admin: Pubkey,
pub fee_config: Pubkey,
pub fee_tiers: Vec<PumpFeesFeeTier>,
pub flat_fees: PumpFeesFees,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PumpFeesUpdateFeeSharesEvent {
pub metadata: EventMetadata,
pub timestamp: i64,
pub mint: Pubkey,
pub sharing_config: Pubkey,
pub admin: Pubkey,
#[serde(default)]
pub bonding_curve: Pubkey,
#[serde(default)]
pub pump_creator_vault: Pubkey,
pub new_shareholders: Vec<PumpFeesShareholder>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PumpFeesUpsertFeeTiersEvent {
pub metadata: EventMetadata,
pub timestamp: i64,
pub admin: Pubkey,
pub fee_config: Pubkey,
pub fee_tiers: Vec<PumpFeesFeeTier>,
pub offset: u8,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PumpFunMigrateBondingCurveCreatorEvent {
pub metadata: EventMetadata,
pub timestamp: i64,
pub mint: Pubkey,
pub bonding_curve: Pubkey,
pub sharing_config: Pubkey,
pub old_creator: Pubkey,
pub new_creator: Pubkey,
}
pub const PUMPFUN_MIGRATE_EVENT_LOG_SIZE: usize = 160;
pub fn pumpfun_migrate_event_log_decode(data: &[u8]) -> Option<PumpFunMigrateEvent> {
@@ -28,7 +28,9 @@ pub fn parse_pumpfun_instruction_data(
parse_create_v2_token_instruction(data, accounts, metadata)
}
discriminators::BUY_IX => parse_buy_instruction(data, accounts, metadata),
discriminators::BUY_EXACT_SOL_IN_IX => parse_buy_exact_sol_in_instruction(data, accounts, metadata),
discriminators::BUY_EXACT_SOL_IN_IX => {
parse_buy_exact_sol_in_instruction(data, accounts, metadata)
}
discriminators::SELL_IX => parse_sell_instruction(data, accounts, metadata),
discriminators::MIGRATE_IX => parse_migrate_instruction(data, accounts, metadata),
_ => None,
@@ -320,10 +322,11 @@ fn parse_buy_instruction(
/// Same account layout as buy: 16 fixed + optional 17th (index 16).
/// Args: spendable_sol_in (SOL), min_tokens_out (token).
fn parse_buy_exact_sol_in_instruction(
data: &[u8], accounts: &[Pubkey],
data: &[u8],
accounts: &[Pubkey],
mut metadata: EventMetadata,
) -> Option<DexEvent> {
metadata.event_type = EventType::PumpFunBuy;
metadata.event_type = EventType::PumpFunBuyExactSolIn;
if data.len() < 16 || accounts.len() < 16 {
return None;
@@ -82,7 +82,8 @@ pub struct Global {
pub is_cashback_enabled: bool,
}
pub const GLOBAL_SIZE: usize = 1 + 32 * 2 + 8 * 5 + 32 + 1 + 8 * 2 + 32 * 7 + 32 * 2 + 1 + 32 * 2 + 1 + 32 * 7 + 1;
pub const GLOBAL_SIZE: usize =
1 + 32 * 2 + 8 * 5 + 32 + 1 + 8 * 2 + 32 * 7 + 32 * 2 + 1 + 32 * 2 + 1 + 32 * 7 + 1;
pub fn global_decode(data: &[u8]) -> Option<Global> {
if data.len() < GLOBAL_SIZE {