diff --git a/Cargo.toml b/Cargo.toml index cb23c50..35d0507 100755 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-streamer-sdk" -version = "1.5.13" +version = "1.5.14" edition = "2021" authors = ["William ", "sgxiang ", "wei <1415121722@qq.com>"] repository = "https://github.com/0xfnzero/solana-streamer" @@ -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.5.13", default-features = false } +sol-parser-sdk = { version = "0.5.14", 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 395b44a..45f7f1c 100755 --- a/README.md +++ b/README.md @@ -124,30 +124,34 @@ Add the dependency to your `Cargo.toml`: ```toml # Add to your Cargo.toml -solana-streamer-sdk = { path = "./solana-streamer", version = "1.5.13" } +solana-streamer-sdk = { path = "./solana-streamer", version = "1.5.14" } ``` ### Use crates.io ```toml # Add to your Cargo.toml -solana-streamer-sdk = "1.5.13" +solana-streamer-sdk = "1.5.14" ``` Parser backend features: ```toml # Default: sol-parser-sdk parse-borsh backend -solana-streamer-sdk = "1.5.13" +solana-streamer-sdk = "1.5.14" # Zero-copy parser backend for latency-sensitive bots -solana-streamer-sdk = { version = "1.5.13", default-features = false, features = ["sdk-parse-zero-copy"] } +solana-streamer-sdk = { version = "1.5.14", default-features = false, features = ["sdk-parse-zero-copy"] } ``` -If both `sdk-parse-borsh` and `sdk-parse-zero-copy` are enabled, `sol-parser-sdk 0.5.13+` uses the zero-copy backend. +If both `sdk-parse-borsh` and `sdk-parse-zero-copy` are enabled, `sol-parser-sdk 0.5.14+` uses the zero-copy backend. ## 🔄 Migration Guide +### Upgrading to v1.5.14 + +Version 1.5.14 uses `sol-parser-sdk 0.5.14` from crates.io. Pump.fun canonical create events now expose `quote_mint`, `quote_vault`, and `quote_token_program` for `create_v2` quote pools, including USDC pools, across gRPC/RPC parser bridge and ShredStream-backed SDK output. + ### Upgrading to v1.5.13 Version 1.5.13 uses `sol-parser-sdk 0.5.13` from crates.io. Pump.fun gRPC and ShredStream create/trade outputs now preserve real WSOL quote mints (`So11111111111111111111111111111111111111112`). The Solscan SOL sentinel (`So11111111111111111111111111111111111111111`) is used only when legacy data omits a quote mint. diff --git a/README_CN.md b/README_CN.md index 4a2636e..0117695 100644 --- a/README_CN.md +++ b/README_CN.md @@ -123,30 +123,34 @@ git clone https://github.com/0xfnzero/solana-streamer ```toml # 添加到您的 Cargo.toml -solana-streamer-sdk = { path = "./solana-streamer", version = "1.5.13" } +solana-streamer-sdk = { path = "./solana-streamer", version = "1.5.14" } ``` ### 使用 crates.io ```toml # 添加到您的 Cargo.toml -solana-streamer-sdk = "1.5.13" +solana-streamer-sdk = "1.5.14" ``` 解析后端 feature: ```toml # 默认:sol-parser-sdk parse-borsh 后端 -solana-streamer-sdk = "1.5.13" +solana-streamer-sdk = "1.5.14" # 面向低延迟 Bot 的 zero-copy 解析后端 -solana-streamer-sdk = { version = "1.5.13", default-features = false, features = ["sdk-parse-zero-copy"] } +solana-streamer-sdk = { version = "1.5.14", default-features = false, features = ["sdk-parse-zero-copy"] } ``` -如果同时启用 `sdk-parse-borsh` 和 `sdk-parse-zero-copy`,`sol-parser-sdk 0.5.13+` 会优先使用 zero-copy 后端。 +如果同时启用 `sdk-parse-borsh` 和 `sdk-parse-zero-copy`,`sol-parser-sdk 0.5.14+` 会优先使用 zero-copy 后端。 ## 🔄 迁移指南 +### 升级到 v1.5.14 + +v1.5.14 使用 crates.io 上的 `sol-parser-sdk 0.5.14`。Pump.fun canonical create 事件现在会为 `create_v2` quote 池暴露 `quote_mint`、`quote_vault`、`quote_token_program`,包括 USDC 池;gRPC/RPC parser bridge 和 ShredStream-backed SDK 输出都会保留这些字段。 + ### 升级到 v1.5.13 v1.5.13 使用 crates.io 上的 `sol-parser-sdk 0.5.13`。Pump.fun gRPC 和 ShredStream create/trade 输出现在会保留真实 WSOL quote mint(`So11111111111111111111111111111111111111112`)。只有 legacy 数据缺失 quote mint 时,才使用 Solscan SOL sentinel(`So11111111111111111111111111111111111111111`)。 diff --git a/src/streaming/event_parser/core/merger_event.rs b/src/streaming/event_parser/core/merger_event.rs index 3822d6a..d473f86 100644 --- a/src/streaming/event_parser/core/merger_event.rs +++ b/src/streaming/event_parser/core/merger_event.rs @@ -176,6 +176,8 @@ pub fn merge(instruction_event: &mut DexEvent, cpi_log_event: DexEvent) { e.token_program = cpie.token_program; } fill_pumpfun_quote_mint(&mut e.quote_mint, cpie.quote_mint); + fill_pubkey(&mut e.quote_vault, cpie.quote_vault); + fill_pubkey(&mut e.quote_token_program, cpie.quote_token_program); fill_u64(&mut e.virtual_quote_reserves, cpie.virtual_quote_reserves); e.is_mayhem_mode |= cpie.is_mayhem_mode; e.is_cashback_enabled |= cpie.is_cashback_enabled; @@ -198,6 +200,8 @@ pub fn merge(instruction_event: &mut DexEvent, cpi_log_event: DexEvent) { fill_u64(&mut e.token_total_supply, cpie.token_total_supply); fill_pubkey(&mut e.token_program, cpie.token_program); fill_pumpfun_quote_mint(&mut e.quote_mint, cpie.quote_mint); + fill_pubkey(&mut e.quote_vault, cpie.quote_vault); + fill_pubkey(&mut e.quote_token_program, cpie.quote_token_program); fill_u64(&mut e.virtual_quote_reserves, cpie.virtual_quote_reserves); e.is_mayhem_mode |= cpie.is_mayhem_mode; e.is_cashback_enabled |= cpie.is_cashback_enabled; @@ -237,6 +241,8 @@ pub fn merge(instruction_event: &mut DexEvent, cpi_log_event: DexEvent) { e.token_program = cpie.token_program; } fill_pumpfun_quote_mint(&mut e.quote_mint, cpie.quote_mint); + fill_pubkey(&mut e.quote_vault, cpie.quote_vault); + fill_pubkey(&mut e.quote_token_program, cpie.quote_token_program); fill_u64(&mut e.virtual_quote_reserves, cpie.virtual_quote_reserves); e.is_mayhem_mode |= cpie.is_mayhem_mode; e.is_cashback_enabled |= cpie.is_cashback_enabled; diff --git a/src/streaming/event_parser/protocols/pumpfun/events.rs b/src/streaming/event_parser/protocols/pumpfun/events.rs index 9a27bd0..5a41625 100755 --- a/src/streaming/event_parser/protocols/pumpfun/events.rs +++ b/src/streaming/event_parser/protocols/pumpfun/events.rs @@ -31,6 +31,10 @@ pub struct PumpFunCreateTokenEvent { #[borsh(skip)] pub quote_mint: Pubkey, #[borsh(skip)] + pub quote_vault: Pubkey, + #[borsh(skip)] + pub quote_token_program: Pubkey, + #[borsh(skip)] pub virtual_quote_reserves: u64, /// Original PumpFun instruction name: "create" or "create_v2". #[borsh(skip)] @@ -93,6 +97,10 @@ pub struct PumpFunCreateV2TokenEvent { #[borsh(skip)] pub quote_mint: Pubkey, #[borsh(skip)] + pub quote_vault: Pubkey, + #[borsh(skip)] + pub quote_token_program: Pubkey, + #[borsh(skip)] pub virtual_quote_reserves: u64, #[borsh(skip)] pub mint_authority: Pubkey, diff --git a/src/streaming/parser_sdk_bridge/mod.rs b/src/streaming/parser_sdk_bridge/mod.rs index 93e377d..e5f7a9f 100644 --- a/src/streaming/parser_sdk_bridge/mod.rs +++ b/src/streaming/parser_sdk_bridge/mod.rs @@ -152,6 +152,8 @@ mod tests { let global = Pubkey::new_unique(); let event_authority = Pubkey::new_unique(); let quote_mint = sol_parser_sdk::core::events::PUMPFUN_WSOL_QUOTE_MINT; + let quote_vault = Pubkey::new_unique(); + let quote_token_program = Pubkey::new_unique(); let c = PbPumpCreateV2 { metadata: EventMetadata { signature: Signature::default(), @@ -167,6 +169,8 @@ mod tests { global, event_authority, quote_mint, + quote_vault, + quote_token_program, is_mayhem_mode: true, is_cashback_enabled: true, ..Default::default() @@ -180,6 +184,8 @@ mod tests { assert_eq!(st.global, global); assert_eq!(st.event_authority, event_authority); assert_eq!(st.quote_mint, quote_mint); + assert_eq!(st.quote_vault, quote_vault); + assert_eq!(st.quote_token_program, quote_token_program); assert_eq!(st.ix_name, "create_v2"); assert!(st.is_mayhem_mode); assert!(st.is_cashback_enabled); diff --git a/src/streaming/parser_sdk_bridge/pump_pumpswap.rs b/src/streaming/parser_sdk_bridge/pump_pumpswap.rs index fc8cacf..26a80e2 100644 --- a/src/streaming/parser_sdk_bridge/pump_pumpswap.rs +++ b/src/streaming/parser_sdk_bridge/pump_pumpswap.rs @@ -53,6 +53,8 @@ pub(crate) fn pumpfun_create_token_from_parser( is_mayhem_mode: c.is_mayhem_mode, is_cashback_enabled: c.is_cashback_enabled, quote_mint: normalize_pumpfun_quote_mint(c.quote_mint), + quote_vault: c.quote_vault, + quote_token_program: c.quote_token_program, virtual_quote_reserves: c.virtual_quote_reserves, ix_name: "create".to_string(), ..Default::default() @@ -81,6 +83,8 @@ pub(crate) fn pumpfun_create_token_from_parser_v2( is_mayhem_mode: c.is_mayhem_mode, is_cashback_enabled: c.is_cashback_enabled, quote_mint: normalize_pumpfun_quote_mint(c.quote_mint), + quote_vault: c.quote_vault, + quote_token_program: c.quote_token_program, virtual_quote_reserves: c.virtual_quote_reserves, ix_name: "create_v2".to_string(), mint_authority: c.mint_authority,