fix: use fixed-size slices for protocol data parsing

- Improve borsh deserialization safety across all protocol decoders
- Add MarketState support for raydium_amm_v4
- Prevent buffer overflow in data decoding operations
This commit is contained in:
ysq
2025-08-19 17:37:17 +08:00
parent a9ceaa55d3
commit 915209abd8
9 changed files with 50 additions and 18 deletions
@@ -80,7 +80,7 @@ pub struct AmmInfo {
pub const AMM_INFO_SIZE: usize = 752;
pub fn amm_info_decode(data: &[u8]) -> Option<AmmInfo> {
borsh::from_slice::<AmmInfo>(&data).ok()
borsh::from_slice::<AmmInfo>(&data[..AMM_INFO_SIZE]).ok()
}
pub fn amm_info_parser(
@@ -104,3 +104,35 @@ pub fn amm_info_parser(
None
}
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, BorshDeserialize)]
pub struct MarketState {
pub padding: [u8; 5],
pub account_flags: u64,
pub own_address: Pubkey,
pub vault_signer_nonce: u64,
pub coin_mint: Pubkey,
pub pc_mint: Pubkey,
pub serum_coin_vault_account: Pubkey,
pub coin_deposits_total: u64,
pub coin_fees_accrued: u64,
pub serum_pc_vault_account: Pubkey,
pub pc_deposits_total: u64,
pub pc_fees_accrued: u64,
pub pc_dust_threshold: u64,
pub request_queue: Pubkey,
pub serum_event_queue: Pubkey,
pub serum_bids: Pubkey,
pub serum_asks: Pubkey,
pub coin_lot_size: u64,
pub pc_lot_size: u64,
pub fee_rate_bps: u64,
pub referrer_rebate_accrued: u64,
pub padding2: [u8; 7],
}
pub const MARKET_STATE_SIZE: usize = 388;
pub fn market_state_decode(data: &[u8]) -> Option<MarketState> {
borsh::from_slice::<MarketState>(&data[..MARKET_STATE_SIZE]).ok()
}