- global_state: only decrement signature_count when remove() actually removed entry
- types: bounds-check program_id_index and account indices in swap extraction
- types: require data.len() >= 9/12 before slicing token instruction data
- types: use i32 for current_index and safe skip count to avoid i8 truncation/UB
- event_parser: encode recent_blockhash only when len() == 32; pass i32 to swap parsers
Made-with: Cursor
- Add PumpFunTradeEvent.account: Option<Pubkey> for the 17th instruction
account (index 16), labeled as 'Account' on block explorers.
- Fill account in parse_buy_instruction, parse_buy_exact_sol_in_instruction,
and parse_sell_instruction when accounts.get(16) is present.
- Merge account from CPI log event into instruction event when merging.
Made-with: Cursor
- EventMetadata: add recent_blockhash (Option<Vec<u8>>)
- gRPC path: extract from message.recent_blockhash, thread through parse_instruction_events_from_grpc_transaction and parse_events_from_grpc_instruction
- VersionedTransaction path: get from message.recent_blockhash(), pass into parse_events_from_instruction
- BlockMeta event: pass None for recent_blockhash
Made-with: Cursor
- Add tx_index to TransactionWithSlot (entry index), pass to parser
- Emit PumpFun Migrate even when no CPI (shred gets instruction-only)
- Merge: only overwrite Create/CreateV2 with CPI when value non-default
- Rename transaction_index -> tx_index across codebase
- Add docs/SHREDSTREAM_LIMITATIONS.md (ALT/CPI limits, field completeness)
- Comment shred path: static_account_keys only, no inner_instructions
Made-with: Cursor
This commit addresses two critical issues:
1. PumpFun buy_exact_sol_in Parameter Order Fix
- Fixed incorrect parameter parsing in buy_exact_sol_in instruction
- Created dedicated parse_buy_exact_sol_in_instruction function
- Correct order: spendable_sol_in (SOL) first, min_tokens_out (token) second
- Previous bug: reused parse_buy_instruction which has reversed order
- Impact: Fixes ~4-5% of PumpFun trades that were being parsed incorrectly
- Issue reported by community: SOL and token amounts were swapped
2. Raydium CPMM Field Naming Alignment
- Updated PoolState struct field names to match IDL specification exactly
- Changed token0_vault -> token_0_vault (and similar for all token fields)
- Changed mint0_decimals -> mint_0_decimals
- Changed protocol_fees_token0 -> protocol_fees_token_0
- Ensures consistency with official IDL from solana-program-idls repo
- Improves code maintainability and readability
3. IDL Files Sync
- Added latest IDL files from https://github.com/0xfnzero/solana-program-idls
- Includes: pumpfun, pump_amm, raydium_cpmm, raydium_clmm, raydium_pool_v4
- Also added: meteora_amm, meteora_damm_v2, meteora_dlmm, orca_whirlpool, raydium_launchpad
- All IDL files stored in idl/ directory for reference
Files Modified:
- src/streaming/event_parser/protocols/pumpfun/parser.rs
- src/streaming/event_parser/protocols/raydium_cpmm/types.rs
- src/streaming/event_parser/protocols/raydium_cpmm/events.rs
- src/streaming/event_parser/protocols/raydium_cpmm/parser.rs
Testing:
- ✅ Compiles successfully (cargo build --release)
- ✅ All field name updates verified
- ✅ Parameter order matches IDL specification
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
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>