manifest/program/processor/
global_add_trader.rs

1use std::cell::RefMut;
2
3use hypertree::trace;
4use solana_program::{account_info::AccountInfo, entrypoint::ProgramResult, pubkey::Pubkey};
5
6use crate::{
7    logs::{emit_stack, GlobalAddTraderLog},
8    program::{expand_global, get_mut_dynamic_account},
9    state::GlobalRefMut,
10    validation::loaders::GlobalAddTraderContext,
11};
12
13pub(crate) fn process_global_add_trader(
14    _program_id: &Pubkey,
15    accounts: &[AccountInfo],
16    _data: &[u8],
17) -> ProgramResult {
18    trace!("process_global_add_trader accs={accounts:?}");
19    let global_add_trader_context: GlobalAddTraderContext = GlobalAddTraderContext::load(accounts)?;
20
21    let GlobalAddTraderContext { payer, global, .. } = global_add_trader_context;
22
23    // Needs a spot for this trader on the global account.
24    expand_global(&payer, &global)?;
25
26    let global_data: &mut RefMut<&mut [u8]> = &mut global.try_borrow_mut_data()?;
27    let mut global_dynamic_account: GlobalRefMut = get_mut_dynamic_account(global_data);
28
29    global_dynamic_account.add_trader(payer.key)?;
30
31    emit_stack(GlobalAddTraderLog {
32        global: *global.key,
33        trader: *payer.key,
34    })?;
35
36    Ok(())
37}