kvault_interface/instructions/
redeem.rs1use borsh::BorshSerialize;
2use solana_instruction::{AccountMeta, Instruction};
3use solana_pubkey::Pubkey;
4
5use crate::{discriminators, pda, util::*, KVAULT_PROGRAM_ID};
6
7pub struct RedeemInKindAccounts {
13 pub user: Pubkey,
14 pub vault_state: Pubkey,
15 pub global_config: Pubkey,
16 pub base_vault_authority: Pubkey,
17 pub reserve: Pubkey,
18 pub ctoken_vault: Pubkey,
19 pub user_ctoken_ta: Pubkey,
20 pub ctoken_mint: Pubkey,
21 pub user_shares_ta: Pubkey,
22 pub shares_mint: Pubkey,
23 pub reserve_collateral_token_program: Pubkey,
24 pub shares_token_program: Pubkey,
25 pub klend_program: Pubkey,
26}
27
28pub fn redeem_in_kind(
44 accounts: RedeemInKindAccounts,
45 shares_amount: u64,
46 remaining_accounts: Vec<AccountMeta>,
47) -> Instruction {
48 #[derive(BorshSerialize)]
49 struct Args {
50 shares_amount: u64,
51 }
52
53 let args = Args { shares_amount };
54 let mut data = discriminators::REDEEM_IN_KIND.to_vec();
55 args.serialize(&mut data).unwrap();
56
57 let (evt_auth, _) = pda::event_authority(&KVAULT_PROGRAM_ID);
58 let mut account_metas = vec![
59 signer(accounts.user),
60 writable(accounts.vault_state),
61 readonly(accounts.global_config),
62 readonly(accounts.base_vault_authority),
63 writable(accounts.reserve),
64 writable(accounts.ctoken_vault),
65 writable(accounts.user_ctoken_ta),
66 writable(accounts.ctoken_mint),
67 writable(accounts.user_shares_ta),
68 writable(accounts.shares_mint),
69 readonly(accounts.reserve_collateral_token_program),
70 readonly(accounts.shares_token_program),
71 readonly(accounts.klend_program),
72 readonly(evt_auth),
74 readonly(KVAULT_PROGRAM_ID),
75 ];
76 account_metas.extend(remaining_accounts);
77
78 Instruction {
79 program_id: KVAULT_PROGRAM_ID,
80 accounts: account_metas,
81 data,
82 }
83}