klend_interface/instructions/
withdraw_queue.rs1use borsh::BorshSerialize;
2use solana_instruction::Instruction;
3use solana_pubkey::Pubkey;
4
5use crate::{
6 discriminators, util::*, ASSOCIATED_TOKEN_PROGRAM_ID, KLEND_PROGRAM_ID, SYSTEM_PROGRAM_ID,
7 SYSVAR_INSTRUCTIONS_ID, TOKEN_PROGRAM_ID,
8};
9
10pub struct EnqueueToWithdrawAccounts {
15 pub owner: Pubkey,
16 pub lending_market: Pubkey,
17 pub lending_market_authority: Pubkey,
18 pub reserve: Pubkey,
19 pub user_source_collateral_ta: Pubkey,
20 pub user_destination_liquidity_ta: Pubkey,
21 pub reserve_liquidity_mint: Pubkey,
22 pub reserve_collateral_mint: Pubkey,
23 pub withdraw_ticket: Pubkey,
24 pub owner_queued_collateral_vault: Pubkey,
25 pub progress_callback_custom_account_0: Option<Pubkey>,
26 pub progress_callback_custom_account_1: Option<Pubkey>,
27}
28
29pub fn enqueue_to_withdraw(
30 accounts: EnqueueToWithdrawAccounts,
31 collateral_amount: u64,
32 progress_callback_type: crate::types::ProgressCallbackType,
33) -> Instruction {
34 #[derive(BorshSerialize)]
35 struct Args {
36 collateral_amount: u64,
37 progress_callback_type: crate::types::ProgressCallbackType,
38 }
39
40 let mut data = discriminators::ENQUEUE_TO_WITHDRAW.to_vec();
41 Args {
42 collateral_amount,
43 progress_callback_type,
44 }
45 .serialize(&mut data)
46 .unwrap();
47
48 Instruction {
49 program_id: KLEND_PROGRAM_ID,
50 accounts: vec![
51 signer_writable(accounts.owner),
52 readonly(accounts.lending_market),
53 readonly(accounts.lending_market_authority),
54 writable(accounts.reserve),
55 writable(accounts.user_source_collateral_ta),
56 readonly(accounts.user_destination_liquidity_ta),
57 readonly(accounts.reserve_liquidity_mint),
58 readonly(accounts.reserve_collateral_mint),
59 readonly(TOKEN_PROGRAM_ID),
60 writable(accounts.withdraw_ticket),
61 writable(accounts.owner_queued_collateral_vault),
62 readonly(SYSTEM_PROGRAM_ID),
63 optional_account(
64 &KLEND_PROGRAM_ID,
65 accounts.progress_callback_custom_account_0,
66 false,
67 ),
68 optional_account(
69 &KLEND_PROGRAM_ID,
70 accounts.progress_callback_custom_account_1,
71 false,
72 ),
73 readonly(SYSVAR_INSTRUCTIONS_ID),
74 ],
75 data,
76 }
77}
78
79pub struct WithdrawQueuedLiquidityAccounts {
84 pub payer: Pubkey,
85 pub lending_market: Pubkey,
86 pub lending_market_authority: Pubkey,
87 pub reserve: Pubkey,
88 pub reserve_liquidity_mint: Pubkey,
89 pub reserve_collateral_mint: Pubkey,
90 pub reserve_liquidity_supply: Pubkey,
91 pub owner_queued_collateral_vault: Pubkey,
92 pub user_destination_liquidity: Pubkey,
93 pub liquidity_token_program: Pubkey,
94 pub withdraw_ticket: Pubkey,
95 pub withdraw_ticket_owner: Pubkey,
96 pub progress_callback_program: Option<Pubkey>,
97 pub progress_callback_custom_account_0: Option<Pubkey>,
98 pub progress_callback_custom_account_1: Option<Pubkey>,
99}
100
101pub fn withdraw_queued_liquidity(accounts: WithdrawQueuedLiquidityAccounts) -> Instruction {
102 let data = discriminators::WITHDRAW_QUEUED_LIQUIDITY.to_vec();
103
104 Instruction {
105 program_id: KLEND_PROGRAM_ID,
106 accounts: vec![
107 signer_writable(accounts.payer),
108 readonly(accounts.lending_market),
109 readonly(accounts.lending_market_authority),
110 writable(accounts.reserve),
111 readonly(accounts.reserve_liquidity_mint),
112 writable(accounts.reserve_collateral_mint),
113 writable(accounts.reserve_liquidity_supply),
114 writable(accounts.owner_queued_collateral_vault),
115 writable(accounts.user_destination_liquidity),
116 readonly(TOKEN_PROGRAM_ID),
117 readonly(accounts.liquidity_token_program),
118 writable(accounts.withdraw_ticket),
119 writable(accounts.withdraw_ticket_owner),
120 readonly(ASSOCIATED_TOKEN_PROGRAM_ID),
121 readonly(SYSTEM_PROGRAM_ID),
122 optional_account(&KLEND_PROGRAM_ID, accounts.progress_callback_program, false),
123 optional_account(
124 &KLEND_PROGRAM_ID,
125 accounts.progress_callback_custom_account_0,
126 true, ),
128 optional_account(
129 &KLEND_PROGRAM_ID,
130 accounts.progress_callback_custom_account_1,
131 false,
132 ),
133 readonly(SYSVAR_INSTRUCTIONS_ID),
134 ],
135 data,
136 }
137}
138
139pub struct RecoverInvalidTicketCollateralAccounts {
144 pub payer: Pubkey,
145 pub lending_market: Pubkey,
146 pub lending_market_authority: Pubkey,
147 pub reserve: Pubkey,
148 pub reserve_collateral_mint: Pubkey,
149 pub owner_queued_collateral_vault: Pubkey,
150 pub user_source_collateral: Pubkey,
151 pub withdraw_ticket: Pubkey,
152 pub withdraw_ticket_owner: Pubkey,
153}
154
155pub fn recover_invalid_ticket_collateral(
156 accounts: RecoverInvalidTicketCollateralAccounts,
157 ticket_sequence_number: u64,
158) -> Instruction {
159 #[derive(BorshSerialize)]
160 struct Args {
161 ticket_sequence_number: u64,
162 }
163
164 let mut data = discriminators::RECOVER_INVALID_TICKET_COLLATERAL.to_vec();
165 Args {
166 ticket_sequence_number,
167 }
168 .serialize(&mut data)
169 .unwrap();
170
171 Instruction {
172 program_id: KLEND_PROGRAM_ID,
173 accounts: vec![
174 signer(accounts.payer),
175 readonly(accounts.lending_market),
176 readonly(accounts.lending_market_authority),
177 readonly(accounts.reserve),
178 readonly(accounts.reserve_collateral_mint),
179 writable(accounts.owner_queued_collateral_vault),
180 writable(accounts.user_source_collateral),
181 readonly(TOKEN_PROGRAM_ID),
182 writable(accounts.withdraw_ticket),
183 writable(accounts.withdraw_ticket_owner),
184 readonly(SYSVAR_INSTRUCTIONS_ID),
185 ],
186 data,
187 }
188}
189
190pub struct CancelWithdrawTicketAccounts {
195 pub owner: Pubkey,
196 pub lending_market: Pubkey,
197 pub lending_market_authority: Pubkey,
198 pub reserve: Pubkey,
199 pub reserve_collateral_mint: Pubkey,
200 pub owner_queued_collateral_vault: Pubkey,
201 pub user_destination_collateral: Pubkey,
202 pub collateral_token_program: Pubkey,
203 pub withdraw_ticket: Pubkey,
204}
205
206pub fn cancel_withdraw_ticket(
207 accounts: CancelWithdrawTicketAccounts,
208 ticket_sequence_number: u64,
209 collateral_amount_to_cancel: u64,
210) -> Instruction {
211 #[derive(BorshSerialize)]
212 struct Args {
213 ticket_sequence_number: u64,
214 collateral_amount_to_cancel: u64,
215 }
216
217 let mut data = discriminators::CANCEL_WITHDRAW_TICKET.to_vec();
218 Args {
219 ticket_sequence_number,
220 collateral_amount_to_cancel,
221 }
222 .serialize(&mut data)
223 .unwrap();
224
225 Instruction {
226 program_id: KLEND_PROGRAM_ID,
227 accounts: vec![
228 signer(accounts.owner),
229 readonly(accounts.lending_market),
230 readonly(accounts.lending_market_authority),
231 writable(accounts.reserve),
232 readonly(accounts.reserve_collateral_mint),
233 writable(accounts.owner_queued_collateral_vault),
234 writable(accounts.user_destination_collateral),
235 readonly(accounts.collateral_token_program),
236 writable(accounts.withdraw_ticket),
237 ],
238 data,
239 }
240}