percli_program/instructions/
trade.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 Trade<'info> {
8 pub signer: Signer<'info>,
10
11 #[account(
13 mut,
14 constraint = market.data_len() == MARKET_ACCOUNT_SIZE @ PercolatorError::AccountNotFound,
15 )]
16 pub market: UncheckedAccount<'info>,
17}
18
19pub fn handler(
20 ctx: Context<Trade>,
21 account_a: u16,
22 account_b: u16,
23 size_q: i128,
24 exec_price: u64,
25 funding_rate: i64,
26) -> Result<()> {
27 let market = &ctx.accounts.market;
28 let mut data = market.try_borrow_mut_data()?;
29
30 require!(&data[0..8] == b"percmrkt", PercolatorError::AccountNotFound);
31
32 let engine = engine_from_account_data(&mut data);
33 let oracle_price = engine.last_oracle_price;
34 let clock = Clock::get()?;
35
36 engine
37 .execute_trade_not_atomic(
38 account_a,
39 account_b,
40 oracle_price,
41 clock.slot,
42 size_q,
43 exec_price,
44 funding_rate,
45 )
46 .map_err(from_risk_error)?;
47
48 Ok(())
49}