solana_tx_decoding/instruction/
classify_instruction.rs

1use crate::instruction::pumpfun::is_pf_bonding_curve_create_instruction::is_pf_bonding_curve_create_instruction;
2use crate::instruction::pumpfun::is_pumpfun_event_instruction::is_pumpfun_event_instruction;
3use crate::instruction::pumpswap::is_pumpswap_swap_instruction::is_pumpswap_swap_instruction;
4use crate::instruction::raydium::is_raydium_ammv4_swap_instruction::is_raydium_ammv4_swap_instruction;
5use crate::instruction::raydium::is_raydium_cpmm_swap_instruction::is_raydium_cpmm_swap_instruction;
6use crate::instruction::raydium::is_raydium_launchpad_swap_instruction::is_raydium_launchpad_swap_instruction;
7use crate::types::instruction_type::InstructionType;
8use solana_central::Instruction;
9use solana_central::SwapDirection;
10
11/// Classify an instruction to determine its type and swap direction. Returns a tuple of 
12/// `(InstructionType, SwapDirection)`. For instructions that don't have a swap direction, a dummy
13/// `SwapDirection` value is used. The `InstructionType` will always be correct or `None`.
14pub fn classify_instruction(instruction: &Instruction) -> (InstructionType, SwapDirection) {
15  if is_raydium_ammv4_swap_instruction(instruction) {
16    return (InstructionType::RaydiumAmmV4Swap, SwapDirection::AToB);
17  } else if is_raydium_cpmm_swap_instruction(instruction) {
18    return (InstructionType::RaydiumCpmmSwap, SwapDirection::AToB);
19  }
20
21  // These 2 functions return swap direction, use it in result instead of dummy value
22  let (is_raydium_launchpad_swap, swap_direction) =
23    is_raydium_launchpad_swap_instruction(instruction);
24  if is_raydium_launchpad_swap {
25    return (InstructionType::RaydiumLaunchpadSwap, swap_direction);
26  }
27  let (is_pumpswap_swap, swap_direction) = is_pumpswap_swap_instruction(instruction);
28  if is_pumpswap_swap {
29    return (InstructionType::PumpswapSwap, swap_direction);
30  }
31  // Dummy values
32  else if is_pumpfun_event_instruction(instruction) {
33    return (InstructionType::PfBondingCurveSwap, SwapDirection::AToB);
34  } else if is_pf_bonding_curve_create_instruction(instruction) {
35    return (InstructionType::PfBondingCurveCreate, SwapDirection::AToB);
36  } else {
37    return (InstructionType::None, SwapDirection::AToB);
38  }
39}