Skip to main content

klend_interface/instructions/
liquidate.rs

1use borsh::BorshSerialize;
2use solana_instruction::{AccountMeta, 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// liquidate_obligation_and_redeem_reserve_collateral_v2
12// ---------------------------------------------------------------------------
13
14pub struct LiquidateObligationAndRedeemReserveCollateralV2Accounts {
15    // V1 accounts
16    pub liquidator: Pubkey,
17    pub obligation: Pubkey,
18    pub lending_market: Pubkey,
19    pub lending_market_authority: Pubkey,
20    pub repay_reserve: Pubkey,
21    pub repay_reserve_liquidity_mint: Pubkey,
22    pub repay_reserve_liquidity_supply: Pubkey,
23    pub withdraw_reserve: Pubkey,
24    pub withdraw_reserve_liquidity_mint: Pubkey,
25    pub withdraw_reserve_collateral_mint: Pubkey,
26    pub withdraw_reserve_collateral_supply: Pubkey,
27    pub withdraw_reserve_liquidity_supply: Pubkey,
28    pub withdraw_reserve_liquidity_fee_receiver: Pubkey,
29    pub user_source_liquidity: Pubkey,
30    pub user_destination_collateral: Pubkey,
31    pub user_destination_liquidity: Pubkey,
32    pub repay_liquidity_token_program: Pubkey,
33    pub withdraw_liquidity_token_program: Pubkey,
34    // V2 additions
35    pub collateral_obligation_farm_user_state: Option<Pubkey>,
36    pub collateral_reserve_farm_state: Option<Pubkey>,
37    pub debt_obligation_farm_user_state: Option<Pubkey>,
38    pub debt_reserve_farm_state: Option<Pubkey>,
39}
40
41pub fn liquidate_obligation_and_redeem_reserve_collateral_v2(
42    accounts: LiquidateObligationAndRedeemReserveCollateralV2Accounts,
43    liquidity_amount: u64,
44    min_acceptable_received_liquidity_amount: u64,
45    max_allowed_ltv_override_percent: u64,
46    remaining_accounts: Vec<AccountMeta>,
47) -> Instruction {
48    #[derive(BorshSerialize)]
49    struct Args {
50        liquidity_amount: u64,
51        min_acceptable_received_liquidity_amount: u64,
52        max_allowed_ltv_override_percent: u64,
53    }
54
55    let args = Args {
56        liquidity_amount,
57        min_acceptable_received_liquidity_amount,
58        max_allowed_ltv_override_percent,
59    };
60    let mut data = discriminators::LIQUIDATE_OBLIGATION_AND_REDEEM_RESERVE_COLLATERAL_V2.to_vec();
61    args.serialize(&mut data).unwrap();
62
63    let mut account_metas = vec![
64        // V1 accounts
65        signer(accounts.liquidator),
66        writable(accounts.obligation),
67        readonly(accounts.lending_market),
68        readonly(accounts.lending_market_authority),
69        writable(accounts.repay_reserve),
70        readonly(accounts.repay_reserve_liquidity_mint),
71        writable(accounts.repay_reserve_liquidity_supply),
72        writable(accounts.withdraw_reserve),
73        readonly(accounts.withdraw_reserve_liquidity_mint),
74        writable(accounts.withdraw_reserve_collateral_mint),
75        writable(accounts.withdraw_reserve_collateral_supply),
76        writable(accounts.withdraw_reserve_liquidity_supply),
77        writable(accounts.withdraw_reserve_liquidity_fee_receiver),
78        writable(accounts.user_source_liquidity),
79        writable(accounts.user_destination_collateral),
80        writable(accounts.user_destination_liquidity),
81        readonly(TOKEN_PROGRAM_ID),
82        readonly(accounts.repay_liquidity_token_program),
83        readonly(accounts.withdraw_liquidity_token_program),
84        readonly(SYSVAR_INSTRUCTIONS_ID),
85        // V2 additions
86        optional_account(
87            &KLEND_PROGRAM_ID,
88            accounts.collateral_obligation_farm_user_state,
89            true,
90        ),
91        optional_account(
92            &KLEND_PROGRAM_ID,
93            accounts.collateral_reserve_farm_state,
94            true,
95        ),
96        optional_account(
97            &KLEND_PROGRAM_ID,
98            accounts.debt_obligation_farm_user_state,
99            true,
100        ),
101        optional_account(&KLEND_PROGRAM_ID, accounts.debt_reserve_farm_state, true),
102        readonly(FARMS_PROGRAM_ID),
103    ];
104
105    account_metas.extend(remaining_accounts);
106
107    Instruction {
108        program_id: KLEND_PROGRAM_ID,
109        accounts: account_metas,
110        data,
111    }
112}