Skip to main content

klend_interface/instructions/
withdraw_queue.rs

1use 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
10// ---------------------------------------------------------------------------
11// enqueue_to_withdraw
12// ---------------------------------------------------------------------------
13
14pub 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
79// ---------------------------------------------------------------------------
80// withdraw_queued_liquidity
81// ---------------------------------------------------------------------------
82
83pub 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, // writable — kvault callback requires vault state to be writable
127            ),
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
139// ---------------------------------------------------------------------------
140// recover_invalid_ticket_collateral
141// ---------------------------------------------------------------------------
142
143pub 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
190// ---------------------------------------------------------------------------
191// cancel_withdraw_ticket
192// ---------------------------------------------------------------------------
193
194pub 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}