manifest/program/instruction_builders/
withdraw_instruction.rs

1use 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}