Skip to main content

klend_interface/instructions/
deposit.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// deposit_reserve_liquidity
12// ---------------------------------------------------------------------------
13
14pub struct DepositReserveLiquidityAccounts {
15    pub owner: Pubkey,
16    pub reserve: Pubkey,
17    pub lending_market: Pubkey,
18    pub lending_market_authority: Pubkey,
19    pub reserve_liquidity_mint: Pubkey,
20    pub reserve_liquidity_supply: Pubkey,
21    pub reserve_collateral_mint: Pubkey,
22    pub user_source_liquidity: Pubkey,
23    pub user_destination_collateral: Pubkey,
24    pub liquidity_token_program: Pubkey,
25}
26
27pub fn deposit_reserve_liquidity(
28    accounts: DepositReserveLiquidityAccounts,
29    liquidity_amount: u64,
30) -> Instruction {
31    #[derive(BorshSerialize)]
32    struct Args {
33        liquidity_amount: u64,
34    }
35
36    let args = Args { liquidity_amount };
37    let mut data = discriminators::DEPOSIT_RESERVE_LIQUIDITY.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            writable(accounts.reserve),
45            readonly(accounts.lending_market),
46            readonly(accounts.lending_market_authority),
47            readonly(accounts.reserve_liquidity_mint),
48            writable(accounts.reserve_liquidity_supply),
49            writable(accounts.reserve_collateral_mint),
50            writable(accounts.user_source_liquidity),
51            writable(accounts.user_destination_collateral),
52            readonly(TOKEN_PROGRAM_ID),
53            readonly(accounts.liquidity_token_program),
54            readonly(SYSVAR_INSTRUCTIONS_ID),
55        ],
56        data,
57    }
58}
59
60// ---------------------------------------------------------------------------
61// deposit_obligation_collateral_v2
62// ---------------------------------------------------------------------------
63
64pub struct DepositObligationCollateralV2Accounts {
65    // V1 accounts
66    pub owner: Pubkey,
67    pub obligation: Pubkey,
68    pub lending_market: Pubkey,
69    pub deposit_reserve: Pubkey,
70    pub reserve_destination_collateral: Pubkey,
71    pub user_source_collateral: Pubkey,
72    // V2 additions
73    pub lending_market_authority: Pubkey,
74    pub obligation_farm_user_state: Option<Pubkey>,
75    pub reserve_farm_state: Option<Pubkey>,
76}
77
78pub fn deposit_obligation_collateral_v2(
79    accounts: DepositObligationCollateralV2Accounts,
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::DEPOSIT_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(accounts.owner),
96            writable(accounts.obligation),
97            readonly(accounts.lending_market),
98            writable(accounts.deposit_reserve),
99            writable(accounts.reserve_destination_collateral),
100            writable(accounts.user_source_collateral),
101            readonly(TOKEN_PROGRAM_ID),
102            readonly(SYSVAR_INSTRUCTIONS_ID),
103            // V2 additions
104            readonly(accounts.lending_market_authority),
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// deposit_reserve_liquidity_and_obligation_collateral_v2
115// ---------------------------------------------------------------------------
116
117pub struct DepositReserveLiquidityAndObligationCollateralV2Accounts {
118    // V1 accounts
119    pub owner: Pubkey,
120    pub obligation: Pubkey,
121    pub lending_market: Pubkey,
122    pub lending_market_authority: Pubkey,
123    pub reserve: Pubkey,
124    pub reserve_liquidity_mint: Pubkey,
125    pub reserve_liquidity_supply: Pubkey,
126    pub reserve_collateral_mint: Pubkey,
127    pub reserve_destination_deposit_collateral: Pubkey,
128    pub user_source_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 deposit_reserve_liquidity_and_obligation_collateral_v2(
137    accounts: DepositReserveLiquidityAndObligationCollateralV2Accounts,
138    liquidity_amount: u64,
139) -> Instruction {
140    #[derive(BorshSerialize)]
141    struct Args {
142        liquidity_amount: u64,
143    }
144
145    let args = Args { liquidity_amount };
146    let mut data = discriminators::DEPOSIT_RESERVE_LIQUIDITY_AND_OBLIGATION_COLLATERAL_V2.to_vec();
147    args.serialize(&mut data).unwrap();
148
149    Instruction {
150        program_id: KLEND_PROGRAM_ID,
151        accounts: vec![
152            // V1 accounts
153            signer_writable(accounts.owner),
154            writable(accounts.obligation),
155            readonly(accounts.lending_market),
156            readonly(accounts.lending_market_authority),
157            writable(accounts.reserve),
158            readonly(accounts.reserve_liquidity_mint),
159            writable(accounts.reserve_liquidity_supply),
160            writable(accounts.reserve_collateral_mint),
161            writable(accounts.reserve_destination_deposit_collateral),
162            writable(accounts.user_source_liquidity),
163            optional_account(
164                &KLEND_PROGRAM_ID,
165                accounts.placeholder_user_destination_collateral,
166                false,
167            ),
168            readonly(TOKEN_PROGRAM_ID),
169            readonly(accounts.liquidity_token_program),
170            readonly(SYSVAR_INSTRUCTIONS_ID),
171            // V2 additions
172            optional_account(&KLEND_PROGRAM_ID, accounts.obligation_farm_user_state, true),
173            optional_account(&KLEND_PROGRAM_ID, accounts.reserve_farm_state, true),
174            readonly(FARMS_PROGRAM_ID),
175        ],
176        data,
177    }
178}