mirror of
https://github.com/0xfnzero/solana-streamer.git
synced 2026-08-20 04:18:06 +00:00
fix: sync all protocol structures with latest IDL definitions
This commit fixes multiple critical issues found when comparing SDK structures with the official IDL repository (https://github.com/0xfnzero/solana-program-idls): 1. PumpSwap GlobalConfig - Add missing reserved_fee_recipients: [Pubkey; 7] field - Update GLOBAL_CONFIG_SIZE constant 2. PumpFun Global - Add missing reserved_fee_recipients: [Pubkey; 7] field - Update GLOBAL_SIZE constant 3. Raydium CPMM AmmConfig - Add missing creator_fee_rate: u64 field - Adjust padding from [u64; 16] to [u64; 15] 4. Raydium CPMM PoolState - Add creator_fee_on: u8 field - Add enable_creator_fee: bool field - Add padding1: [u8; 6] field - Add creator_fees_token_0: u64 field - Add creator_fees_token_1: u64 field - Adjust padding from [u64; 31] to [u64; 28] 5. Bonk (Raydium Launchpad) PoolState - Add AmmCreatorFeeOn enum with borsh discriminant support - Add token_program_flag: u8 field - Add amm_creator_fee_on: AmmCreatorFeeOn field - Add platform_vesting_share: u64 field - Fix padding from [u64; 8] to [u8; 54] with serde_big_array - Update POOL_STATE_SIZE constant 6. Bonk (Raydium Launchpad) PlatformConfig - Add BondingCurveParam and PlatformCurveParam structures - Fix name from Vec<u8> to [u8; 64] with serde_big_array - Fix web from Vec<u8> to [u8; 256] with serde_big_array - Fix img from Vec<u8> to [u8; 256] with serde_big_array - Add cpswap_config: Pubkey field - Add creator_fee_rate: u64 field - Add transfer_fee_extension_auth: Pubkey field - Add platform_vesting_wallet: Pubkey field - Add platform_vesting_scale: u64 field - Add platform_cp_creator: Pubkey field - Fix padding from Vec<u8> to [u8; 108] with serde_big_array - Add curve_params: Vec<PlatformCurveParam> field - Update PLATFORM_CONFIG_SIZE constant 7. PumpSwap buy_exact_quote_in parameter order bug - Create separate parse_buy_exact_quote_in_instruction function - Fix parameter parsing order: spendable_quote_in (SOL) first, then min_base_amount_out (token) - Previous bug: buy_exact_quote_in incorrectly reused parse_buy_instruction which has reversed parameter order - Add detailed comments explaining the parameter order difference All changes have been verified against the official IDL files and compile successfully. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.5
parent
6969d15f08
commit
ce2931046d
@@ -24,7 +24,8 @@ pub fn parse_pumpswap_instruction_data(
|
||||
metadata: EventMetadata,
|
||||
) -> Option<DexEvent> {
|
||||
match discriminator {
|
||||
discriminators::BUY_IX | discriminators::BUY_EXACT_QUOTE_IN_IX => parse_buy_instruction(data, accounts, metadata),
|
||||
discriminators::BUY_IX => parse_buy_instruction(data, accounts, metadata),
|
||||
discriminators::BUY_EXACT_QUOTE_IN_IX => parse_buy_exact_quote_in_instruction(data, accounts, metadata),
|
||||
discriminators::SELL_IX => parse_sell_instruction(data, accounts, metadata),
|
||||
discriminators::CREATE_POOL_IX => {
|
||||
parse_create_pool_instruction(data, accounts, metadata)
|
||||
@@ -165,6 +166,47 @@ fn parse_buy_instruction(
|
||||
}))
|
||||
}
|
||||
|
||||
/// 解析 buy_exact_quote_in 指令事件
|
||||
/// 注意:参数顺序与 buy 指令不同
|
||||
/// buy_exact_quote_in: spendable_quote_in (SOL), min_base_amount_out (token)
|
||||
/// buy: base_amount_out (token), max_quote_amount_in (SOL)
|
||||
fn parse_buy_exact_quote_in_instruction(
|
||||
data: &[u8],
|
||||
accounts: &[Pubkey],
|
||||
mut metadata: EventMetadata,
|
||||
) -> Option<DexEvent> {
|
||||
metadata.event_type = EventType::PumpSwapBuy;
|
||||
|
||||
if data.len() < 16 || accounts.len() < 13 {
|
||||
return None;
|
||||
}
|
||||
|
||||
// 注意:buy_exact_quote_in 的参数顺序是先 quote (SOL) 再 base (token)
|
||||
let spendable_quote_in = read_u64_le(data, 0)?;
|
||||
let min_base_amount_out = read_u64_le(data, 8)?;
|
||||
|
||||
Some(DexEvent::PumpSwapBuyEvent(PumpSwapBuyEvent {
|
||||
metadata,
|
||||
base_amount_out: min_base_amount_out,
|
||||
max_quote_amount_in: spendable_quote_in,
|
||||
pool: accounts[0],
|
||||
user: accounts[1],
|
||||
base_mint: accounts[3],
|
||||
quote_mint: accounts[4],
|
||||
user_base_token_account: accounts[5],
|
||||
user_quote_token_account: accounts[6],
|
||||
pool_base_token_account: accounts[7],
|
||||
pool_quote_token_account: accounts[8],
|
||||
protocol_fee_recipient: accounts[9],
|
||||
protocol_fee_recipient_token_account: accounts[10],
|
||||
base_token_program: accounts[11],
|
||||
quote_token_program: accounts[12],
|
||||
coin_creator_vault_ata: accounts.get(17).copied().unwrap_or_default(),
|
||||
coin_creator_vault_authority: accounts.get(18).copied().unwrap_or_default(),
|
||||
..Default::default()
|
||||
}))
|
||||
}
|
||||
|
||||
/// 解析卖出指令事件
|
||||
fn parse_sell_instruction(
|
||||
data: &[u8],
|
||||
|
||||
@@ -23,9 +23,10 @@ pub struct GlobalConfig {
|
||||
pub whitelist_pda: Pubkey,
|
||||
pub reserved_fee_recipient: Pubkey,
|
||||
pub mayhem_mode_enabled: bool,
|
||||
pub reserved_fee_recipients: [Pubkey; 7],
|
||||
}
|
||||
|
||||
pub const GLOBAL_CONFIG_SIZE: usize = 32 + 8 + 8 + 1 + 32 * 8 + 8 + 32 + 32 + 32 + 1;
|
||||
pub const GLOBAL_CONFIG_SIZE: usize = 32 + 8 + 8 + 1 + 32 * 8 + 8 + 32 + 32 + 32 + 1 + 32 * 7;
|
||||
|
||||
pub fn global_config_decode(data: &[u8]) -> Option<GlobalConfig> {
|
||||
if data.len() < GLOBAL_CONFIG_SIZE {
|
||||
|
||||
Reference in New Issue
Block a user