Skip to main content

klend_interface/instructions/
flash.rs

1use borsh::BorshSerialize;
2use solana_instruction::Instruction;
3use solana_pubkey::Pubkey;
4
5use crate::{discriminators, util::*, KLEND_PROGRAM_ID, SYSVAR_INSTRUCTIONS_ID};
6
7// ---------------------------------------------------------------------------
8// flash_borrow_reserve_liquidity
9// ---------------------------------------------------------------------------
10
11pub struct FlashBorrowReserveLiquidityAccounts {
12    pub user_transfer_authority: Pubkey,
13    pub lending_market_authority: Pubkey,
14    pub lending_market: Pubkey,
15    pub reserve: Pubkey,
16    pub reserve_liquidity_mint: Pubkey,
17    pub reserve_source_liquidity: Pubkey,
18    pub user_destination_liquidity: Pubkey,
19    pub reserve_liquidity_fee_receiver: Pubkey,
20    pub referrer_token_state: Option<Pubkey>,
21    pub referrer_account: Option<Pubkey>,
22    pub token_program: Pubkey,
23}
24
25pub fn flash_borrow_reserve_liquidity(
26    accounts: FlashBorrowReserveLiquidityAccounts,
27    liquidity_amount: u64,
28) -> Instruction {
29    #[derive(BorshSerialize)]
30    struct Args {
31        liquidity_amount: u64,
32    }
33
34    let args = Args { liquidity_amount };
35    let mut data = discriminators::FLASH_BORROW_RESERVE_LIQUIDITY.to_vec();
36    args.serialize(&mut data).unwrap();
37
38    Instruction {
39        program_id: KLEND_PROGRAM_ID,
40        accounts: vec![
41            signer(accounts.user_transfer_authority),
42            readonly(accounts.lending_market_authority),
43            readonly(accounts.lending_market),
44            writable(accounts.reserve),
45            readonly(accounts.reserve_liquidity_mint),
46            writable(accounts.reserve_source_liquidity),
47            writable(accounts.user_destination_liquidity),
48            writable(accounts.reserve_liquidity_fee_receiver),
49            optional_account(&KLEND_PROGRAM_ID, accounts.referrer_token_state, true),
50            optional_account(&KLEND_PROGRAM_ID, accounts.referrer_account, true),
51            readonly(SYSVAR_INSTRUCTIONS_ID),
52            readonly(accounts.token_program),
53        ],
54        data,
55    }
56}
57
58// ---------------------------------------------------------------------------
59// flash_repay_reserve_liquidity
60// ---------------------------------------------------------------------------
61
62pub struct FlashRepayReserveLiquidityAccounts {
63    pub user_transfer_authority: Pubkey,
64    pub lending_market_authority: Pubkey,
65    pub lending_market: Pubkey,
66    pub reserve: Pubkey,
67    pub reserve_liquidity_mint: Pubkey,
68    pub reserve_destination_liquidity: Pubkey,
69    pub user_source_liquidity: Pubkey,
70    pub reserve_liquidity_fee_receiver: Pubkey,
71    pub referrer_token_state: Option<Pubkey>,
72    pub referrer_account: Option<Pubkey>,
73    pub token_program: Pubkey,
74}
75
76pub fn flash_repay_reserve_liquidity(
77    accounts: FlashRepayReserveLiquidityAccounts,
78    liquidity_amount: u64,
79    borrow_instruction_index: u8,
80) -> Instruction {
81    #[derive(BorshSerialize)]
82    struct Args {
83        liquidity_amount: u64,
84        borrow_instruction_index: u8,
85    }
86
87    let args = Args {
88        liquidity_amount,
89        borrow_instruction_index,
90    };
91    let mut data = discriminators::FLASH_REPAY_RESERVE_LIQUIDITY.to_vec();
92    args.serialize(&mut data).unwrap();
93
94    Instruction {
95        program_id: KLEND_PROGRAM_ID,
96        accounts: vec![
97            signer(accounts.user_transfer_authority),
98            readonly(accounts.lending_market_authority),
99            readonly(accounts.lending_market),
100            writable(accounts.reserve),
101            readonly(accounts.reserve_liquidity_mint),
102            writable(accounts.reserve_destination_liquidity),
103            writable(accounts.user_source_liquidity),
104            writable(accounts.reserve_liquidity_fee_receiver),
105            optional_account(&KLEND_PROGRAM_ID, accounts.referrer_token_state, true),
106            optional_account(&KLEND_PROGRAM_ID, accounts.referrer_account, true),
107            readonly(SYSVAR_INSTRUCTIONS_ID),
108            readonly(accounts.token_program),
109        ],
110        data,
111    }
112}