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