klend_interface/instructions/
borrow.rs1use borsh::BorshSerialize;
2use solana_instruction::{AccountMeta, Instruction};
3use solana_pubkey::Pubkey;
4
5use crate::{discriminators, util::*, FARMS_PROGRAM_ID, KLEND_PROGRAM_ID, SYSVAR_INSTRUCTIONS_ID};
6
7pub struct BorrowObligationLiquidityV2Accounts {
12 pub owner: Pubkey,
13 pub obligation: Pubkey,
14 pub lending_market: Pubkey,
15 pub lending_market_authority: Pubkey,
16 pub borrow_reserve: Pubkey,
17 pub borrow_reserve_liquidity_mint: Pubkey,
18 pub reserve_source_liquidity: Pubkey,
19 pub borrow_reserve_liquidity_fee_receiver: Pubkey,
20 pub user_destination_liquidity: Pubkey,
21 pub referrer_token_state: Option<Pubkey>,
22 pub token_program: Pubkey,
23 pub obligation_farm_user_state: Option<Pubkey>,
25 pub reserve_farm_state: Option<Pubkey>,
26}
27
28pub fn borrow_obligation_liquidity_v2(
29 accounts: BorrowObligationLiquidityV2Accounts,
30 liquidity_amount: u64,
31 remaining_accounts: Vec<AccountMeta>,
32) -> Instruction {
33 #[derive(BorshSerialize)]
34 struct Args {
35 liquidity_amount: u64,
36 }
37
38 let mut data = discriminators::BORROW_OBLIGATION_LIQUIDITY_V2.to_vec();
39 Args { liquidity_amount }.serialize(&mut data).unwrap();
40
41 let mut account_metas = vec![
43 signer(accounts.owner),
44 writable(accounts.obligation),
45 readonly(accounts.lending_market),
46 readonly(accounts.lending_market_authority),
47 writable(accounts.borrow_reserve),
48 readonly(accounts.borrow_reserve_liquidity_mint),
49 writable(accounts.reserve_source_liquidity),
50 writable(accounts.borrow_reserve_liquidity_fee_receiver),
51 writable(accounts.user_destination_liquidity),
52 optional_account(&KLEND_PROGRAM_ID, accounts.referrer_token_state, true),
53 readonly(accounts.token_program),
54 readonly(SYSVAR_INSTRUCTIONS_ID),
55 ];
56
57 account_metas.push(optional_account(
59 &KLEND_PROGRAM_ID,
60 accounts.obligation_farm_user_state,
61 true,
62 ));
63 account_metas.push(optional_account(
64 &KLEND_PROGRAM_ID,
65 accounts.reserve_farm_state,
66 true,
67 ));
68 account_metas.push(readonly(FARMS_PROGRAM_ID));
69
70 account_metas.extend(remaining_accounts);
71
72 Instruction {
73 program_id: KLEND_PROGRAM_ID,
74 accounts: account_metas,
75 data,
76 }
77}
78
79pub struct RolloverFixedTermBorrowAccounts {
84 pub payer: Pubkey,
85 pub obligation: Pubkey,
86 pub lending_market: Pubkey,
87 pub lending_market_authority: Pubkey,
88 pub source_borrow_reserve: Pubkey,
89 pub target_borrow_reserve: Pubkey,
90 pub liquidity_mint: Pubkey,
91 pub source_borrow_reserve_liquidity: Pubkey,
92 pub target_borrow_reserve_liquidity: Pubkey,
93 pub token_program: Pubkey,
94 pub source_obligation_farm_user_state: Option<Pubkey>,
96 pub source_reserve_farm_state: Option<Pubkey>,
97 pub target_obligation_farm_user_state: Option<Pubkey>,
99 pub target_reserve_farm_state: Option<Pubkey>,
100}
101
102pub fn rollover_fixed_term_borrow(accounts: RolloverFixedTermBorrowAccounts) -> Instruction {
103 let data = discriminators::ROLLOVER_FIXED_TERM_BORROW.to_vec();
104
105 Instruction {
106 program_id: KLEND_PROGRAM_ID,
107 accounts: vec![
108 signer(accounts.payer),
110 writable(accounts.obligation),
111 readonly(accounts.lending_market),
112 readonly(accounts.lending_market_authority),
113 writable(accounts.source_borrow_reserve),
114 writable(accounts.target_borrow_reserve),
115 readonly(accounts.liquidity_mint),
116 writable(accounts.source_borrow_reserve_liquidity),
117 writable(accounts.target_borrow_reserve_liquidity),
118 readonly(accounts.token_program),
119 optional_account(
121 &KLEND_PROGRAM_ID,
122 accounts.source_obligation_farm_user_state,
123 true,
124 ),
125 optional_account(&KLEND_PROGRAM_ID, accounts.source_reserve_farm_state, true),
126 optional_account(
128 &KLEND_PROGRAM_ID,
129 accounts.target_obligation_farm_user_state,
130 true,
131 ),
132 optional_account(&KLEND_PROGRAM_ID, accounts.target_reserve_farm_state, true),
133 readonly(FARMS_PROGRAM_ID),
135 ],
136 data,
137 }
138}