manifest/program/instruction_builders/
withdraw_instruction.rs1use crate::{
2 program::{withdraw::WithdrawParams, ManifestInstruction},
3 validation::get_vault_address,
4};
5use borsh::BorshSerialize;
6use hypertree::DataIndex;
7use solana_program::{
8 instruction::{AccountMeta, Instruction},
9 pubkey::Pubkey,
10};
11
12pub fn withdraw_instruction(
13 market: &Pubkey,
14 payer: &Pubkey,
15 mint: &Pubkey,
16 amount_atoms: u64,
17 trader_token_account: &Pubkey,
18 token_program: Pubkey,
19 trader_index_hint: Option<DataIndex>,
20) -> Instruction {
21 let (vault_address, _) = get_vault_address(market, mint);
22
23 Instruction {
24 program_id: crate::id(),
25 accounts: vec![
26 AccountMeta::new_readonly(*payer, true),
27 AccountMeta::new(*market, false),
28 AccountMeta::new(*trader_token_account, false),
29 AccountMeta::new(vault_address, false),
30 AccountMeta::new_readonly(token_program, false),
31 AccountMeta::new_readonly(*mint, false),
32 ],
33 data: [
34 ManifestInstruction::Withdraw.to_vec(),
35 WithdrawParams::new(amount_atoms, trader_index_hint)
36 .try_to_vec()
37 .unwrap(),
38 ]
39 .concat(),
40 }
41}