klend_interface/instructions/
withdraw.rs1use borsh::BorshSerialize;
2use solana_instruction::Instruction;
3use solana_pubkey::Pubkey;
4
5use crate::{
6 discriminators, util::*, FARMS_PROGRAM_ID, KLEND_PROGRAM_ID, SYSVAR_INSTRUCTIONS_ID,
7 TOKEN_PROGRAM_ID,
8};
9
10pub struct RedeemReserveCollateralAccounts {
15 pub owner: Pubkey,
16 pub lending_market: Pubkey,
17 pub reserve: Pubkey,
18 pub lending_market_authority: Pubkey,
19 pub reserve_liquidity_mint: Pubkey,
20 pub reserve_collateral_mint: Pubkey,
21 pub reserve_liquidity_supply: Pubkey,
22 pub user_source_collateral: Pubkey,
23 pub user_destination_liquidity: Pubkey,
24 pub liquidity_token_program: Pubkey,
25}
26
27pub fn redeem_reserve_collateral(
28 accounts: RedeemReserveCollateralAccounts,
29 collateral_amount: u64,
30) -> Instruction {
31 #[derive(BorshSerialize)]
32 struct Args {
33 collateral_amount: u64,
34 }
35
36 let args = Args { collateral_amount };
37 let mut data = discriminators::REDEEM_RESERVE_COLLATERAL.to_vec();
38 args.serialize(&mut data).unwrap();
39
40 Instruction {
41 program_id: KLEND_PROGRAM_ID,
42 accounts: vec![
43 signer(accounts.owner),
44 readonly(accounts.lending_market),
45 writable(accounts.reserve),
46 readonly(accounts.lending_market_authority),
47 readonly(accounts.reserve_liquidity_mint),
48 writable(accounts.reserve_collateral_mint),
49 writable(accounts.reserve_liquidity_supply),
50 writable(accounts.user_source_collateral),
51 writable(accounts.user_destination_liquidity),
52 readonly(TOKEN_PROGRAM_ID),
53 readonly(accounts.liquidity_token_program),
54 readonly(SYSVAR_INSTRUCTIONS_ID),
55 ],
56 data,
57 }
58}
59
60pub struct WithdrawObligationCollateralV2Accounts {
65 pub owner: Pubkey,
67 pub obligation: Pubkey,
68 pub lending_market: Pubkey,
69 pub lending_market_authority: Pubkey,
70 pub withdraw_reserve: Pubkey,
71 pub reserve_source_collateral: Pubkey,
72 pub user_destination_collateral: Pubkey,
73 pub obligation_farm_user_state: Option<Pubkey>,
75 pub reserve_farm_state: Option<Pubkey>,
76}
77
78pub fn withdraw_obligation_collateral_v2(
79 accounts: WithdrawObligationCollateralV2Accounts,
80 collateral_amount: u64,
81) -> Instruction {
82 #[derive(BorshSerialize)]
83 struct Args {
84 collateral_amount: u64,
85 }
86
87 let args = Args { collateral_amount };
88 let mut data = discriminators::WITHDRAW_OBLIGATION_COLLATERAL_V2.to_vec();
89 args.serialize(&mut data).unwrap();
90
91 Instruction {
92 program_id: KLEND_PROGRAM_ID,
93 accounts: vec![
94 signer_writable(accounts.owner),
96 writable(accounts.obligation),
97 readonly(accounts.lending_market),
98 readonly(accounts.lending_market_authority),
99 writable(accounts.withdraw_reserve),
100 writable(accounts.reserve_source_collateral),
101 writable(accounts.user_destination_collateral),
102 readonly(TOKEN_PROGRAM_ID),
103 readonly(SYSVAR_INSTRUCTIONS_ID),
104 optional_account(&KLEND_PROGRAM_ID, accounts.obligation_farm_user_state, true),
106 optional_account(&KLEND_PROGRAM_ID, accounts.reserve_farm_state, true),
107 readonly(FARMS_PROGRAM_ID),
108 ],
109 data,
110 }
111}
112
113pub struct WithdrawObligationCollateralAndRedeemReserveCollateralV2Accounts {
118 pub owner: Pubkey,
120 pub obligation: Pubkey,
121 pub lending_market: Pubkey,
122 pub lending_market_authority: Pubkey,
123 pub withdraw_reserve: Pubkey,
124 pub reserve_liquidity_mint: Pubkey,
125 pub reserve_source_collateral: Pubkey,
126 pub reserve_collateral_mint: Pubkey,
127 pub reserve_liquidity_supply: Pubkey,
128 pub user_destination_liquidity: Pubkey,
129 pub placeholder_user_destination_collateral: Option<Pubkey>,
130 pub liquidity_token_program: Pubkey,
131 pub obligation_farm_user_state: Option<Pubkey>,
133 pub reserve_farm_state: Option<Pubkey>,
134}
135
136pub fn withdraw_obligation_collateral_and_redeem_reserve_collateral_v2(
137 accounts: WithdrawObligationCollateralAndRedeemReserveCollateralV2Accounts,
138 collateral_amount: u64,
139) -> Instruction {
140 #[derive(BorshSerialize)]
141 struct Args {
142 collateral_amount: u64,
143 }
144
145 let args = Args { collateral_amount };
146 let mut data =
147 discriminators::WITHDRAW_OBLIGATION_COLLATERAL_AND_REDEEM_RESERVE_COLLATERAL_V2.to_vec();
148 args.serialize(&mut data).unwrap();
149
150 Instruction {
151 program_id: KLEND_PROGRAM_ID,
152 accounts: vec![
153 signer_writable(accounts.owner),
155 writable(accounts.obligation),
156 readonly(accounts.lending_market),
157 readonly(accounts.lending_market_authority),
158 writable(accounts.withdraw_reserve),
159 readonly(accounts.reserve_liquidity_mint),
160 writable(accounts.reserve_source_collateral),
161 writable(accounts.reserve_collateral_mint),
162 writable(accounts.reserve_liquidity_supply),
163 writable(accounts.user_destination_liquidity),
164 optional_account(
165 &KLEND_PROGRAM_ID,
166 accounts.placeholder_user_destination_collateral,
167 false,
168 ),
169 readonly(TOKEN_PROGRAM_ID),
170 readonly(accounts.liquidity_token_program),
171 readonly(SYSVAR_INSTRUCTIONS_ID),
172 optional_account(&KLEND_PROGRAM_ID, accounts.obligation_farm_user_state, true),
174 optional_account(&KLEND_PROGRAM_ID, accounts.reserve_farm_state, true),
175 readonly(FARMS_PROGRAM_ID),
176 ],
177 data,
178 }
179}