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