phoenix/program/processor/
deposit.rs1use crate::{
2 program::{
3 dispatch_market::load_with_dispatch_mut, loaders::DepositContext, token_utils::try_deposit,
4 MarketHeader, PhoenixError, PhoenixMarketContext, PhoenixVaultContext,
5 },
6 quantities::{BaseLots, QuoteLots, WrapperU64},
7};
8use borsh::{BorshDeserialize, BorshSerialize};
9use solana_program::{account_info::AccountInfo, entrypoint::ProgramResult, pubkey::Pubkey};
10use std::mem::size_of;
11
12#[derive(BorshDeserialize, BorshSerialize, Clone)]
13pub struct DepositParams {
14 pub quote_lots_to_deposit: u64,
15 pub base_lots_to_deposit: u64,
16}
17
18pub(crate) fn process_deposit_funds<'a, 'info>(
19 _program_id: &Pubkey,
20 market_context: &PhoenixMarketContext<'a, 'info>,
21 accounts: &'a [AccountInfo<'info>],
22 data: &[u8],
23) -> ProgramResult {
24 let DepositContext {
25 vault_context:
26 PhoenixVaultContext {
27 base_account,
28 quote_account,
29 base_vault,
30 quote_vault,
31 token_program,
32 },
33 ..
34 } = DepositContext::load(market_context, accounts)?;
35 let DepositParams {
36 quote_lots_to_deposit,
37 base_lots_to_deposit,
38 } = DepositParams::try_from_slice(data)?;
39
40 let quote_lots = QuoteLots::new(quote_lots_to_deposit);
41 let base_lots = BaseLots::new(base_lots_to_deposit);
42
43 let PhoenixMarketContext {
44 market_info,
45 signer: trader,
46 } = market_context;
47
48 {
49 let market_bytes = &mut market_info.try_borrow_mut_data()?[size_of::<MarketHeader>()..];
50 let market = load_with_dispatch_mut(&market_info.size_params, market_bytes)?.inner;
51 market
52 .get_or_register_trader(trader.key)
53 .ok_or(PhoenixError::TraderNotFound)?;
54 let trader_state = market
55 .get_trader_state_mut(trader.key)
56 .ok_or(PhoenixError::TraderNotFound)?;
57 trader_state.deposit_free_base_lots(base_lots);
58 trader_state.deposit_free_quote_lots(quote_lots);
59 }
60
61 let header = market_info.get_header()?;
62
63 try_deposit(
64 token_program.as_ref(),
65 quote_account,
66 quote_vault,
67 base_account,
68 base_vault,
69 quote_lots * header.get_quote_lot_size(),
70 base_lots * header.get_base_lot_size(),
71 trader,
72 )?;
73
74 Ok(())
75}