manifest/program/processor/
claim_seat.rs

1use std::cell::RefMut;
2
3use crate::{
4    logs::{emit_stack, ClaimSeatLog},
5    state::{MarketFixed, MarketRefMut},
6    validation::{loaders::ClaimSeatContext, ManifestAccountInfo, Signer},
7};
8use solana_program::{account_info::AccountInfo, entrypoint::ProgramResult, pubkey::Pubkey};
9
10use super::shared::{expand_market_if_needed, get_mut_dynamic_account};
11
12#[cfg(feature = "certora")]
13use early_panic::early_panic;
14
15#[cfg_attr(all(feature = "certora", not(feature = "certora-test")), early_panic)]
16pub(crate) fn process_claim_seat(
17    _program_id: &Pubkey,
18    accounts: &[AccountInfo],
19    _data: &[u8],
20) -> ProgramResult {
21    let claim_seat_context: ClaimSeatContext = ClaimSeatContext::load(accounts)?;
22    let ClaimSeatContext { market, payer, .. } = claim_seat_context;
23
24    process_claim_seat_internal(&market, &payer)?;
25
26    // Leave a free block on the market
27    expand_market_if_needed(&payer, &market)?;
28
29    Ok(())
30}
31
32#[cfg_attr(all(feature = "certora", not(feature = "certora-test")), early_panic)]
33pub(crate) fn process_claim_seat_internal<'a, 'info>(
34    market: &ManifestAccountInfo<'a, 'info, MarketFixed>,
35    payer: &Signer<'a, 'info>,
36) -> ProgramResult {
37    let market_data: &mut RefMut<&mut [u8]> = &mut market.try_borrow_mut_data()?;
38    let mut dynamic_account: MarketRefMut = get_mut_dynamic_account(market_data);
39    dynamic_account.claim_seat(payer.key)?;
40
41    emit_stack(ClaimSeatLog {
42        market: *market.key,
43        trader: *payer.key,
44    })?;
45
46    Ok(())
47}