klend_interface/instructions/
liquidate.rs1use 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
10pub struct LiquidateObligationAndRedeemReserveCollateralV2Accounts {
15 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 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 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 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}