manifest/program/instruction_builders/
global_evict_instruction.rs

1use crate::{
2    program::{global_deposit::GlobalDepositParams, ManifestInstruction},
3    validation::{get_global_address, get_global_vault_address},
4};
5use borsh::BorshSerialize;
6use solana_program::{
7    instruction::{AccountMeta, Instruction},
8    pubkey::Pubkey,
9};
10
11pub fn global_evict_instruction(
12    mint: &Pubkey,
13    payer: &Pubkey,
14    trader_token_account: &Pubkey,
15    evictee_token_account: &Pubkey,
16    token_program: &Pubkey,
17    num_atoms: u64,
18) -> Instruction {
19    let (global, _global_bump) = get_global_address(mint);
20    let (global_vault, _global_vault_bump) = get_global_vault_address(mint);
21    Instruction {
22        program_id: crate::id(),
23        accounts: vec![
24            AccountMeta::new(*payer, true),
25            AccountMeta::new(global, false),
26            AccountMeta::new_readonly(*mint, false),
27            AccountMeta::new(global_vault, false),
28            AccountMeta::new(*trader_token_account, false),
29            AccountMeta::new(*evictee_token_account, false),
30            AccountMeta::new_readonly(*token_program, false),
31        ],
32        data: [
33            ManifestInstruction::GlobalEvict.to_vec(),
34            GlobalDepositParams::new(num_atoms).try_to_vec().unwrap(),
35        ]
36        .concat(),
37    }
38}