diff --git a/programs/perp_smith/src/errors.rs b/programs/perp_smith/src/errors.rs index 14c9b4d..dddd925 100644 --- a/programs/perp_smith/src/errors.rs +++ b/programs/perp_smith/src/errors.rs @@ -32,4 +32,12 @@ pub enum EternaError { InvalidOraclePrice, #[msg("Stale data")] StaleData, + #[msg("Invalid collateral mint")] + InvalidCollateralMint, + #[msg("Invalid user collateral account")] + InvalidUserCollateralAccount, + #[msg("Invalid collateral vault")] + InvalidCollateralVault, + #[msg("Invalid margin account owner")] + InvalidMarginAccountOwner, } diff --git a/programs/perp_smith/src/instructions/deposit_margin.rs b/programs/perp_smith/src/instructions/deposit_margin.rs index 4d10500..40af12c 100644 --- a/programs/perp_smith/src/instructions/deposit_margin.rs +++ b/programs/perp_smith/src/instructions/deposit_margin.rs @@ -41,7 +41,7 @@ pub struct DepositMargin<'info> { } pub fn deposit_margin(ctx: Context, amount: u64) -> Result<()> { - msg!("DepositMargin: Intitializing..."); + msg!("DepositMargin: Initializing..."); let market = &mut ctx.accounts.market; let margin_account = &mut ctx.accounts.margin_account; @@ -51,6 +51,41 @@ pub fn deposit_margin(ctx: Context, amount: u64) -> Result<()> { let user = &ctx.accounts.user; require!(amount > 0, EternaError::InvalidAmount); + require_keys_eq!( + market.collateral_mint, + ctx.accounts.collateral_mint.key(), + EternaError::InvalidCollateralMint + ); + require_keys_eq!( + user_collateral_ata.owner, + user.key(), + EternaError::InvalidUserCollateralAccount + ); + require_eq!( + user_collateral_ata.mint, + ctx.accounts.collateral_mint.key(), + EternaError::InvalidCollateralMint + ); + require_keys_eq!( + vault_collateral_ata.key(), + market.collateral_vault, + EternaError::InvalidCollateralVault + ); + require_eq!( + vault_collateral_ata.mint, + ctx.accounts.collateral_mint.key(), + EternaError::InvalidCollateralMint + ); + + if margin_account.owner == Pubkey::default() { + margin_account.owner = user.key(); + } else { + require_keys_eq!( + margin_account.owner, + user.key(), + EternaError::InvalidMarginAccountOwner + ); + } let cpi_accounts = Transfer { from: user_collateral_ata.to_account_info(), @@ -58,9 +93,7 @@ pub fn deposit_margin(ctx: Context, amount: u64) -> Result<()> { authority: user.to_account_info(), }; let cpi = CpiContext::new(token_program.to_account_info(), cpi_accounts); - let _ = transfer(cpi, amount)?; - - margin_account.owner = user.key(); + transfer(cpi, amount)?; margin_account.deposited_margin = margin_account .deposited_margin .checked_add(amount) @@ -72,7 +105,7 @@ pub fn deposit_margin(ctx: Context, amount: u64) -> Result<()> { emit!(DepositMarginEvent { owner: ctx.accounts.user.key(), - amount: amount, + amount, deposited_margin: margin_account.deposited_margin, }); diff --git a/programs/perp_smith/src/instructions/initialize_market.rs b/programs/perp_smith/src/instructions/initialize_market.rs index ac92f68..c0c47f7 100644 --- a/programs/perp_smith/src/instructions/initialize_market.rs +++ b/programs/perp_smith/src/instructions/initialize_market.rs @@ -23,7 +23,7 @@ pub struct InitializeMarket<'info> { #[account( init, payer = admin, - seeds = [SEED_MARKET, collateral_mint.key().as_ref()], + seeds = [SEED_MARKET, collateral_mint.key().as_ref()], bump, space = 8 + Market::LEN )]