Skip to main content

klend_interface/instructions/
borrow.rs

1use 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
7// ---------------------------------------------------------------------------
8// borrow_obligation_liquidity_v2
9// ---------------------------------------------------------------------------
10
11pub 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    // V2 farms
24    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    // V1 accounts
42    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    // V2 farms accounts
58    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
79// ---------------------------------------------------------------------------
80// rollover_fixed_term_borrow
81// ---------------------------------------------------------------------------
82
83pub 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    // Source farms (optional)
95    pub source_obligation_farm_user_state: Option<Pubkey>,
96    pub source_reserve_farm_state: Option<Pubkey>,
97    // Target farms (optional)
98    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            // RolloverAccounts
109            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            // Source farms
120            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            // Target farms
127            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            // Farms program
134            readonly(FARMS_PROGRAM_ID),
135        ],
136        data,
137    }
138}