fix: expose PumpFun create quote accounts

This commit is contained in:
0xfnzero
2026-06-12 01:08:33 +08:00
parent 7131fb3aa1
commit ad166ae62e
7 changed files with 44 additions and 12 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "solana-streamer-sdk" name = "solana-streamer-sdk"
version = "1.5.13" version = "1.5.14"
edition = "2021" edition = "2021"
authors = ["William <byteblock6@gmail.com>", "sgxiang <sgxiang@gmail.com>", "wei <1415121722@qq.com>"] authors = ["William <byteblock6@gmail.com>", "sgxiang <sgxiang@gmail.com>", "wei <1415121722@qq.com>"]
repository = "https://github.com/0xfnzero/solana-streamer" 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"] sdk-ultra-perf = ["sol-parser-sdk/ultra-perf"]
[dependencies] [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-sdk = "3.0.0"
solana-client = "3.1.12" solana-client = "3.1.12"
solana-transaction-status = "3.1.12" solana-transaction-status = "3.1.12"
+9 -5
View File
@@ -124,30 +124,34 @@ Add the dependency to your `Cargo.toml`:
```toml ```toml
# Add to your Cargo.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 ### Use crates.io
```toml ```toml
# Add to your Cargo.toml # Add to your Cargo.toml
solana-streamer-sdk = "1.5.13" solana-streamer-sdk = "1.5.14"
``` ```
Parser backend features: Parser backend features:
```toml ```toml
# Default: sol-parser-sdk parse-borsh backend # 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 # 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 ## 🔄 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 ### 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. 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.
+9 -5
View File
@@ -123,30 +123,34 @@ git clone https://github.com/0xfnzero/solana-streamer
```toml ```toml
# 添加到您的 Cargo.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 ### 使用 crates.io
```toml ```toml
# 添加到您的 Cargo.toml # 添加到您的 Cargo.toml
solana-streamer-sdk = "1.5.13" solana-streamer-sdk = "1.5.14"
``` ```
解析后端 feature 解析后端 feature
```toml ```toml
# 默认:sol-parser-sdk parse-borsh 后端 # 默认:sol-parser-sdk parse-borsh 后端
solana-streamer-sdk = "1.5.13" solana-streamer-sdk = "1.5.14"
# 面向低延迟 Bot 的 zero-copy 解析后端 # 面向低延迟 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
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`)。 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`)。
@@ -176,6 +176,8 @@ pub fn merge(instruction_event: &mut DexEvent, cpi_log_event: DexEvent) {
e.token_program = cpie.token_program; e.token_program = cpie.token_program;
} }
fill_pumpfun_quote_mint(&mut e.quote_mint, cpie.quote_mint); 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); fill_u64(&mut e.virtual_quote_reserves, cpie.virtual_quote_reserves);
e.is_mayhem_mode |= cpie.is_mayhem_mode; e.is_mayhem_mode |= cpie.is_mayhem_mode;
e.is_cashback_enabled |= cpie.is_cashback_enabled; 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_u64(&mut e.token_total_supply, cpie.token_total_supply);
fill_pubkey(&mut e.token_program, cpie.token_program); fill_pubkey(&mut e.token_program, cpie.token_program);
fill_pumpfun_quote_mint(&mut e.quote_mint, cpie.quote_mint); 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); fill_u64(&mut e.virtual_quote_reserves, cpie.virtual_quote_reserves);
e.is_mayhem_mode |= cpie.is_mayhem_mode; e.is_mayhem_mode |= cpie.is_mayhem_mode;
e.is_cashback_enabled |= cpie.is_cashback_enabled; 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; e.token_program = cpie.token_program;
} }
fill_pumpfun_quote_mint(&mut e.quote_mint, cpie.quote_mint); 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); fill_u64(&mut e.virtual_quote_reserves, cpie.virtual_quote_reserves);
e.is_mayhem_mode |= cpie.is_mayhem_mode; e.is_mayhem_mode |= cpie.is_mayhem_mode;
e.is_cashback_enabled |= cpie.is_cashback_enabled; e.is_cashback_enabled |= cpie.is_cashback_enabled;
@@ -31,6 +31,10 @@ pub struct PumpFunCreateTokenEvent {
#[borsh(skip)] #[borsh(skip)]
pub quote_mint: Pubkey, pub quote_mint: Pubkey,
#[borsh(skip)] #[borsh(skip)]
pub quote_vault: Pubkey,
#[borsh(skip)]
pub quote_token_program: Pubkey,
#[borsh(skip)]
pub virtual_quote_reserves: u64, pub virtual_quote_reserves: u64,
/// Original PumpFun instruction name: "create" or "create_v2". /// Original PumpFun instruction name: "create" or "create_v2".
#[borsh(skip)] #[borsh(skip)]
@@ -93,6 +97,10 @@ pub struct PumpFunCreateV2TokenEvent {
#[borsh(skip)] #[borsh(skip)]
pub quote_mint: Pubkey, pub quote_mint: Pubkey,
#[borsh(skip)] #[borsh(skip)]
pub quote_vault: Pubkey,
#[borsh(skip)]
pub quote_token_program: Pubkey,
#[borsh(skip)]
pub virtual_quote_reserves: u64, pub virtual_quote_reserves: u64,
#[borsh(skip)] #[borsh(skip)]
pub mint_authority: Pubkey, pub mint_authority: Pubkey,
+6
View File
@@ -152,6 +152,8 @@ mod tests {
let global = Pubkey::new_unique(); let global = Pubkey::new_unique();
let event_authority = Pubkey::new_unique(); let event_authority = Pubkey::new_unique();
let quote_mint = sol_parser_sdk::core::events::PUMPFUN_WSOL_QUOTE_MINT; 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 { let c = PbPumpCreateV2 {
metadata: EventMetadata { metadata: EventMetadata {
signature: Signature::default(), signature: Signature::default(),
@@ -167,6 +169,8 @@ mod tests {
global, global,
event_authority, event_authority,
quote_mint, quote_mint,
quote_vault,
quote_token_program,
is_mayhem_mode: true, is_mayhem_mode: true,
is_cashback_enabled: true, is_cashback_enabled: true,
..Default::default() ..Default::default()
@@ -180,6 +184,8 @@ mod tests {
assert_eq!(st.global, global); assert_eq!(st.global, global);
assert_eq!(st.event_authority, event_authority); assert_eq!(st.event_authority, event_authority);
assert_eq!(st.quote_mint, quote_mint); 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_eq!(st.ix_name, "create_v2");
assert!(st.is_mayhem_mode); assert!(st.is_mayhem_mode);
assert!(st.is_cashback_enabled); assert!(st.is_cashback_enabled);
@@ -53,6 +53,8 @@ pub(crate) fn pumpfun_create_token_from_parser(
is_mayhem_mode: c.is_mayhem_mode, is_mayhem_mode: c.is_mayhem_mode,
is_cashback_enabled: c.is_cashback_enabled, is_cashback_enabled: c.is_cashback_enabled,
quote_mint: normalize_pumpfun_quote_mint(c.quote_mint), 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, virtual_quote_reserves: c.virtual_quote_reserves,
ix_name: "create".to_string(), ix_name: "create".to_string(),
..Default::default() ..Default::default()
@@ -81,6 +83,8 @@ pub(crate) fn pumpfun_create_token_from_parser_v2(
is_mayhem_mode: c.is_mayhem_mode, is_mayhem_mode: c.is_mayhem_mode,
is_cashback_enabled: c.is_cashback_enabled, is_cashback_enabled: c.is_cashback_enabled,
quote_mint: normalize_pumpfun_quote_mint(c.quote_mint), 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, virtual_quote_reserves: c.virtual_quote_reserves,
ix_name: "create_v2".to_string(), ix_name: "create_v2".to_string(),
mint_authority: c.mint_authority, mint_authority: c.mint_authority,