solana_tx_decoding/instruction/pumpswap/
is_pumpswap_swap_instruction.rs

1use solana_central::Instruction;
2use solana_central::SwapDirection;
3use solana_central::constants::PUMP_CONSTANTS;
4
5/// Determine if a Solana instruction is a Pumpswap swap instruction. Checks program ID, data
6/// length, and identifies swap direction by checking instruction discriminator.
7pub fn is_pumpswap_swap_instruction(instruction: &Instruction) -> (bool, SwapDirection) {
8  // Data length should be 24 for buy and sell, 25 for buy exact quote in
9  if instruction.data.len() < 24 {
10    return (false, SwapDirection::AToB);
11  }
12  if instruction.tx_account_keys[instruction.program_id_index as usize]
13    != PUMP_CONSTANTS.pump_swap_program
14  {
15    return (false, SwapDirection::AToB);
16  }
17  let discriminator = &instruction.data[0..8];
18  // Discriminator has to be either buy or sell
19  if discriminator == PUMP_CONSTANTS.buy_instruction_discriminator {
20    return (true, SwapDirection::BToA);
21  } else if discriminator == PUMP_CONSTANTS.sell_instruction_discriminator {
22    return (true, SwapDirection::AToB);
23  } else if discriminator == PUMP_CONSTANTS.pumpswap_buy_exact_quote_in_instruction_discriminator {
24    return (true, SwapDirection::BToA);
25  } else {
26    return (false, SwapDirection::AToB);
27  }
28}