diff --git a/Cargo.toml b/Cargo.toml index 554678d..c543ab8 100755 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ sdk-perf-stats = ["sol-parser-sdk/perf-stats"] sdk-ultra-perf = ["sol-parser-sdk/ultra-perf"] [dependencies] -sol-parser-sdk = { version = "0.6.4", default-features = false } +sol-parser-sdk = { version = "0.6.6", default-features = false } solana-sdk = "3.0.0" solana-client = "3.1.12" solana-transaction-status = "3.1.12" diff --git a/README.md b/README.md index f3e5172..b6a508a 100755 --- a/README.md +++ b/README.md @@ -153,6 +153,10 @@ If both `sdk-parse-borsh` and `sdk-parse-zero-copy` are enabled, `sol-parser-sdk ## 🔄 Migration Guide +### Unreleased + +The source tree now uses `sol-parser-sdk 0.6.6`. PumpFun trade events preserve the parser SDK's optional pre/post token balances in raw mint units and pre/post SOL balances in lamports, populated from transaction metadata without additional RPC calls. + ### Upgrading to v2.0.1 Version 2.0.1 uses `sol-parser-sdk 0.6.1` from crates.io. PumpSwap Buy/Sell events now preserve the complete current cashback, buyback, signed virtual quote reserve, boost, and base-supply tail through dispatcher and SDK bridge paths. Truncated current layouts are rejected consistently by the default and zero-copy parser backends while historical layouts remain supported. diff --git a/README_CN.md b/README_CN.md index bf08a48..65d8bda 100644 --- a/README_CN.md +++ b/README_CN.md @@ -152,6 +152,10 @@ solana-streamer-sdk = { version = "2.0.1", default-features = false, features = ## 🔄 迁移指南 +### 未发布 + +当前源码已升级到 `sol-parser-sdk 0.6.6`。PumpFun 交易事件会保留 parser SDK 提供的可选交易前后 token 余额(mint 原始精度)和 SOL 余额(lamports),这些字段直接来自交易 metadata,无需额外 RPC 请求。 + ### 升级到 v2.0.1 v2.0.1 使用 crates.io 上的 `sol-parser-sdk 0.6.1`。PumpSwap Buy/Sell 事件现在会在 dispatcher 和 SDK bridge 路径中完整保留 cashback、buyback、带符号 virtual quote reserve、boost 和 base supply 尾部字段。默认和 zero-copy 解析后端会一致拒绝截断的当前布局,同时继续兼容历史布局。 diff --git a/src/streaming/event_parser/protocols/pumpfun/events.rs b/src/streaming/event_parser/protocols/pumpfun/events.rs index 5a41625..63124be 100755 --- a/src/streaming/event_parser/protocols/pumpfun/events.rs +++ b/src/streaming/event_parser/protocols/pumpfun/events.rs @@ -237,6 +237,16 @@ pub struct PumpFunTradeEvent { pub spendable_quote_in: u64, #[borsh(skip)] pub min_tokens_out: u64, + /// User token balance before/after the transaction, in raw mint units. + #[borsh(skip)] + pub pre_token_balance: Option, + #[borsh(skip)] + pub post_token_balance: Option, + /// User SOL balance before/after the transaction, in lamports. + #[borsh(skip)] + pub pre_sol_balance: Option, + #[borsh(skip)] + pub post_sol_balance: Option, #[borsh(skip)] pub quote_token_program: Pubkey, #[borsh(skip)] diff --git a/src/streaming/event_parser/protocols/sol_parser_forward/events.rs b/src/streaming/event_parser/protocols/sol_parser_forward/events.rs index aebc886..7242394 100644 --- a/src/streaming/event_parser/protocols/sol_parser_forward/events.rs +++ b/src/streaming/event_parser/protocols/sol_parser_forward/events.rs @@ -319,6 +319,8 @@ pub struct MeteoraDlmmSwapEvent { pub start_bin_id: i32, pub end_bin_id: i32, pub amount_in: u64, + #[serde(default)] + pub min_amount_out: u64, pub amount_out: u64, pub swap_for_y: bool, pub fee: u64, diff --git a/src/streaming/parser_sdk_bridge/forward_pb.rs b/src/streaming/parser_sdk_bridge/forward_pb.rs index 489eb2d..02a27b3 100644 --- a/src/streaming/parser_sdk_bridge/forward_pb.rs +++ b/src/streaming/parser_sdk_bridge/forward_pb.rs @@ -367,6 +367,7 @@ pub(crate) fn meteora_dlmm_swap_from_pb( start_bin_id: e.start_bin_id, end_bin_id: e.end_bin_id, amount_in: e.amount_in, + min_amount_out: e.min_amount_out, amount_out: e.amount_out, swap_for_y: e.swap_for_y, fee: e.fee, diff --git a/src/streaming/parser_sdk_bridge/mod.rs b/src/streaming/parser_sdk_bridge/mod.rs index 6c190f6..91dd3d7 100644 --- a/src/streaming/parser_sdk_bridge/mod.rs +++ b/src/streaming/parser_sdk_bridge/mod.rs @@ -457,6 +457,7 @@ mod tests { start_bin_id: -5, end_bin_id: 12, amount_in: 300, + min_amount_out: 298, amount_out: 299, swap_for_y: true, fee: 1, @@ -474,6 +475,7 @@ mod tests { assert_eq!(e.start_bin_id, -5); assert_eq!(e.end_bin_id, 12); assert_eq!(e.amount_in, 300); + assert_eq!(e.min_amount_out, 298); assert_eq!(e.amount_out, 299); assert!(e.swap_for_y); assert_eq!(e.fee_bps, 25); diff --git a/src/streaming/parser_sdk_bridge/pump_pumpswap.rs b/src/streaming/parser_sdk_bridge/pump_pumpswap.rs index 0a79486..2fd23fa 100644 --- a/src/streaming/parser_sdk_bridge/pump_pumpswap.rs +++ b/src/streaming/parser_sdk_bridge/pump_pumpswap.rs @@ -753,6 +753,10 @@ pub(crate) fn pumpfun_trade_from_parser_with_event_type( spendable_sol_in: t.spendable_sol_in, spendable_quote_in: t.spendable_quote_in, min_tokens_out: t.min_tokens_out, + pre_token_balance: t.pre_token_balance, + post_token_balance: t.post_token_balance, + pre_sol_balance: t.pre_sol_balance, + post_sol_balance: t.post_sol_balance, ..Default::default() }; DexEvent::PumpFunTradeEvent(st) @@ -888,4 +892,30 @@ mod tests { _ => panic!("expected PumpFunTradeEvent"), } } + + #[test] + fn pumpfun_balance_snapshots_are_preserved() { + let ev = pumpfun_trade_from_parser_with_event_type( + sol_parser_sdk::core::events::PumpFunTradeEvent { + pre_token_balance: Some(10), + post_token_balance: Some(25), + pre_sol_balance: Some(1_000), + post_sol_balance: Some(900), + ..Default::default() + }, + None, + 0, + EventType::PumpFunBuy, + ); + + match ev { + DexEvent::PumpFunTradeEvent(t) => { + assert_eq!(t.pre_token_balance, Some(10)); + assert_eq!(t.post_token_balance, Some(25)); + assert_eq!(t.pre_sol_balance, Some(1_000)); + assert_eq!(t.post_sol_balance, Some(900)); + } + _ => panic!("expected PumpFunTradeEvent"), + } + } }