phoenix/program/processor/
deposit.rs

1use 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}