Skip to main content

klend_interface/instructions/
withdraw.rs

1use 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
10// ---------------------------------------------------------------------------
11// redeem_reserve_collateral
12// ---------------------------------------------------------------------------
13
14pub 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
60// ---------------------------------------------------------------------------
61// withdraw_obligation_collateral_v2
62// ---------------------------------------------------------------------------
63
64pub struct WithdrawObligationCollateralV2Accounts {
65    // V1 accounts
66    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    // V2 additions
74    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            // V1 accounts
95            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            // V2 additions
105            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
113// ---------------------------------------------------------------------------
114// withdraw_obligation_collateral_and_redeem_reserve_collateral_v2
115// ---------------------------------------------------------------------------
116
117pub struct WithdrawObligationCollateralAndRedeemReserveCollateralV2Accounts {
118    // V1 accounts
119    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    // V2 additions
132    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            // V1 accounts
154            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            // V2 additions
173            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}