feat(pumpswap): forward virtual quote reserve upgrade

This commit is contained in:
0xfnzero
2026-07-17 01:59:54 +08:00
parent 740838f414
commit aab0a3a143
8 changed files with 1237 additions and 13 deletions
@@ -342,6 +342,11 @@ pub fn merge(instruction_event: &mut DexEvent, cpi_log_event: DexEvent) {
e.ix_name = cpie.ix_name.clone();
e.cashback_fee_basis_points = cpie.cashback_fee_basis_points;
e.cashback = cpie.cashback;
e.buyback_fee_basis_points = cpie.buyback_fee_basis_points;
e.buyback_fee = cpie.buyback_fee;
e.virtual_quote_reserves = cpie.virtual_quote_reserves;
e.can_boost = cpie.can_boost;
e.base_supply = cpie.base_supply;
e.is_pump_pool = cpie.is_pump_pool;
fill_pubkey(&mut e.base_mint, cpie.base_mint);
fill_pubkey(&mut e.quote_mint, cpie.quote_mint);
@@ -387,6 +392,11 @@ pub fn merge(instruction_event: &mut DexEvent, cpi_log_event: DexEvent) {
e.coin_creator_fee = cpie.coin_creator_fee;
e.cashback_fee_basis_points = cpie.cashback_fee_basis_points;
e.cashback = cpie.cashback;
e.buyback_fee_basis_points = cpie.buyback_fee_basis_points;
e.buyback_fee = cpie.buyback_fee;
e.virtual_quote_reserves = cpie.virtual_quote_reserves;
e.can_boost = cpie.can_boost;
e.base_supply = cpie.base_supply;
e.is_pump_pool = cpie.is_pump_pool;
fill_pubkey(&mut e.base_mint, cpie.base_mint);
fill_pubkey(&mut e.quote_mint, cpie.quote_mint);
@@ -858,6 +868,7 @@ mod tests {
use crate::streaming::event_parser::protocols::pumpfun::events::{
PumpFeesShareholder, PumpFunTradeEvent,
};
use crate::streaming::event_parser::protocols::pumpswap::events::PumpSwapSellEvent;
#[test]
fn pumpfun_merge_keeps_instruction_context_and_copies_latest_trade_tail() {
@@ -912,6 +923,30 @@ mod tests {
}
}
#[test]
fn pumpswap_merge_preserves_signed_virtual_quote_reserves() {
let mut instruction_event = DexEvent::PumpSwapSellEvent(PumpSwapSellEvent::default());
let log_event = DexEvent::PumpSwapSellEvent(PumpSwapSellEvent {
virtual_quote_reserves: -500,
buyback_fee_basis_points: 11,
buyback_fee: 22,
can_boost: true,
base_supply: 33,
..Default::default()
});
merge(&mut instruction_event, log_event);
let DexEvent::PumpSwapSellEvent(event) = instruction_event else {
panic!("expected PumpSwapSellEvent");
};
assert_eq!(event.virtual_quote_reserves, -500);
assert_eq!(event.buyback_fee_basis_points, 11);
assert_eq!(event.buyback_fee, 22);
assert!(event.can_boost);
assert_eq!(event.base_supply, 33);
}
#[test]
fn pumpfun_merge_replaces_sol_quote_sentinel_with_real_quote_mint() {
let quote_mint = Pubkey::new_unique();
@@ -44,6 +44,11 @@ pub struct PumpSwapBuyEvent {
pub ix_name: String,
pub cashback_fee_basis_points: u64,
pub cashback: u64,
pub buyback_fee_basis_points: u64,
pub buyback_fee: u64,
pub virtual_quote_reserves: i128,
pub can_boost: bool,
pub base_supply: u64,
#[borsh(skip)]
pub is_pump_pool: bool,
#[borsh(skip)]
@@ -105,6 +110,11 @@ pub struct PumpSwapSellEvent {
pub coin_creator_fee: u64,
pub cashback_fee_basis_points: u64,
pub cashback: u64,
pub buyback_fee_basis_points: u64,
pub buyback_fee: u64,
pub virtual_quote_reserves: i128,
pub can_boost: bool,
pub base_supply: u64,
#[borsh(skip)]
pub is_pump_pool: bool,
#[borsh(skip)]
@@ -33,13 +33,12 @@ pub struct Pool {
pub coin_creator: Pubkey,
pub is_mayhem_mode: bool,
pub is_cashback_coin: bool,
/// On-chain reserved tail (7 bytes); keep in sync with pump_amm pool account layout.
pub reserved: [u8; 7],
pub virtual_quote_reserves: i128,
}
/// Legacy pool account body (before `is_cashback_coin` + reserved).
pub const POOL_BODY_LEGACY: usize = 1 + 2 + 32 * 6 + 8 + 32 + 1;
/// Current pool account body including flags and reserved.
pub const POOL_BODY: usize = POOL_BODY_LEGACY + 1 + 7;
/// Legacy allocated pool account body.
pub const POOL_BODY_LEGACY: usize = 244;
/// Current serialized pool account body including signed virtual quote reserves.
pub const POOL_BODY: usize = 253;
pub const POOL_SIZE: usize = POOL_BODY;