percli_program/instructions/
liquidate.rs1use anchor_lang::prelude::*;
2use percli_core::LiquidationPolicy;
3
4use crate::error::{from_risk_error, PercolatorError};
5use crate::state::{engine_from_account_data, MARKET_ACCOUNT_SIZE};
6
7#[derive(Accounts)]
8pub struct Liquidate<'info> {
9 pub liquidator: Signer<'info>,
11
12 #[account(
14 mut,
15 constraint = market.data_len() == MARKET_ACCOUNT_SIZE @ PercolatorError::AccountNotFound,
16 )]
17 pub market: UncheckedAccount<'info>,
18}
19
20pub fn handler(ctx: Context<Liquidate>, account_idx: u16, funding_rate: i64) -> Result<bool> {
21 let market = &ctx.accounts.market;
22 let mut data = market.try_borrow_mut_data()?;
23
24 require!(&data[0..8] == b"percmrkt", PercolatorError::AccountNotFound);
25
26 let engine = engine_from_account_data(&mut data);
27 let oracle_price = engine.last_oracle_price;
28 let clock = Clock::get()?;
29
30 let liquidated = engine
31 .liquidate_at_oracle_not_atomic(
32 account_idx,
33 clock.slot,
34 oracle_price,
35 LiquidationPolicy::FullClose,
36 funding_rate,
37 )
38 .map_err(from_risk_error)?;
39
40 Ok(liquidated)
41}