manifest/program/instruction_builders/
swap_instruction.rs1use crate::{
2 program::{swap::SwapParams, ManifestInstruction},
3 validation::{get_global_address, get_global_vault_address, get_vault_address},
4};
5use borsh::BorshSerialize;
6use solana_program::{
7 instruction::{AccountMeta, Instruction},
8 pubkey::Pubkey,
9};
10
11#[allow(clippy::too_many_arguments)]
12pub fn swap_instruction(
13 market: &Pubkey,
14 payer: &Pubkey,
15 base_mint: &Pubkey,
16 quote_mint: &Pubkey,
17 trader_base_account: &Pubkey,
18 trader_quote_account: &Pubkey,
19 in_atoms: u64,
20 out_atoms: u64,
21 is_base_in: bool,
22 is_exact_in: bool,
23 token_program_base: Pubkey,
24 token_program_quote: Pubkey,
25 include_global: bool,
26) -> Instruction {
27 let (vault_base_account, _) = get_vault_address(market, base_mint);
28 let (vault_quote_account, _) = get_vault_address(market, quote_mint);
29 let mut account_metas: Vec<AccountMeta> = vec![
30 AccountMeta::new_readonly(*payer, true),
31 AccountMeta::new(*market, false),
32 AccountMeta::new_readonly(solana_program::system_program::id(), false),
33 AccountMeta::new(*trader_base_account, false),
34 AccountMeta::new(*trader_quote_account, false),
35 AccountMeta::new(vault_base_account, false),
36 AccountMeta::new(vault_quote_account, false),
37 AccountMeta::new_readonly(token_program_base, false),
38 ];
39 if token_program_base == spl_token_2022::id() {
40 account_metas.push(AccountMeta::new_readonly(*base_mint, false))
41 }
42 if token_program_base != token_program_quote {
43 account_metas.push(AccountMeta::new_readonly(token_program_quote, false))
44 }
45 if token_program_quote == spl_token_2022::id() {
46 account_metas.push(AccountMeta::new(*quote_mint, false))
47 }
48 if include_global {
49 let global_mint: &Pubkey = if is_base_in { quote_mint } else { base_mint };
50 let (global, _) = get_global_address(global_mint);
51 let (global_vault, _) = get_global_vault_address(global_mint);
52 account_metas.push(AccountMeta::new(global, false));
53 account_metas.push(AccountMeta::new(global_vault, false));
54 }
55
56 Instruction {
57 program_id: crate::id(),
58 accounts: account_metas,
59 data: [
60 ManifestInstruction::Swap.to_vec(),
61 SwapParams::new(in_atoms, out_atoms, is_base_in, is_exact_in)
62 .try_to_vec()
63 .unwrap(),
64 ]
65 .concat(),
66 }
67}