solana_exec/raydium/
push_raydium_launchpad_swap_instruction.rs

1use crate::constants::COMPUTE_UNITS;
2use crate::types::swap_config::SwapConfig;
3use crate::utilities::get_min_amount_out::get_min_amount_out;
4use solana_central::RaydiumLaunchpad;
5use solana_central::SwapDirection;
6use solana_central::constants::{RAYDIUM_CONSTANTS, SOLANA_PROGRAMS};
7use solana_sdk::instruction::{AccountMeta, Instruction};
8use spl_associated_token_account::get_associated_token_address;
9
10/// Create and add a Raydium launchpad swap instruction
11pub fn push_raydium_launchpad_swap_instruction(
12  swap_config: &SwapConfig,
13  instructions: &mut Vec<Instruction>,
14  compute_unit_budget: &mut u32,
15  pool: &RaydiumLaunchpad,
16) {
17  /*
18  Raydium Launchpad is 32 bytes swap length, 8 for discriminator, 8 for amount in, 8 for minimum
19  amount out, and 8 for share fee u64 bytes
20  */
21  let mut data: Vec<u8> = Vec::with_capacity(32);
22
23  let minimum_amount_out = get_min_amount_out(swap_config, pool);
24
25  if swap_config.direction == SwapDirection::AToB {
26    // Push sell exact in
27    data.extend_from_slice(&RAYDIUM_CONSTANTS.launchpad_swap_discriminators[1]);
28  } else {
29    // Push buy exact in
30    data.extend_from_slice(&RAYDIUM_CONSTANTS.launchpad_swap_discriminators[0]);
31  }
32
33  data.extend_from_slice(&swap_config.amount_in.to_le_bytes());
34  data.extend_from_slice(&minimum_amount_out.to_le_bytes());
35  // We don't use the share fee
36  data.extend_from_slice(&0u64.to_le_bytes());
37
38  let accounts: Vec<AccountMeta> = vec![
39    AccountMeta::new(swap_config.wallet, true),
40    AccountMeta::new_readonly(RAYDIUM_CONSTANTS.launchpad_authority, false),
41    AccountMeta::new_readonly(RAYDIUM_CONSTANTS.launchpad_global_config, false),
42    AccountMeta::new_readonly(pool.platform_config, false),
43    AccountMeta::new(pool.info.pool_address, false),
44    AccountMeta::new(
45      get_associated_token_address(&swap_config.wallet, &pool.info.token_a_address),
46      false,
47    ),
48    AccountMeta::new(
49      get_associated_token_address(&swap_config.wallet, &pool.info.token_b_address),
50      false,
51    ),
52    AccountMeta::new(pool.info.token_a_vault_address, false),
53    AccountMeta::new(pool.info.token_b_vault_address, false),
54    AccountMeta::new_readonly(pool.info.token_a_address, false),
55    AccountMeta::new_readonly(pool.info.token_b_address, false),
56    AccountMeta::new_readonly(SOLANA_PROGRAMS.token_program, false),
57    AccountMeta::new_readonly(SOLANA_PROGRAMS.token_program, false),
58    AccountMeta::new_readonly(RAYDIUM_CONSTANTS.launchpad_event_authority, false),
59    AccountMeta::new_readonly(RAYDIUM_CONSTANTS.launchpad_program, false),
60    AccountMeta::new_readonly(SOLANA_PROGRAMS.system_program, false),
61    AccountMeta::new(pool.platform_vault, false),
62    AccountMeta::new(pool.creator_vault, false),
63  ];
64  instructions.push(Instruction {
65    program_id: RAYDIUM_CONSTANTS.launchpad_program,
66    accounts,
67    data,
68  });
69  *compute_unit_budget += COMPUTE_UNITS.raydium_launchlab_swap;
70}