Skip to content

Commit

Permalink
impl transfer cpi ctx for PlaceOrder
Browse files Browse the repository at this point in the history
  • Loading branch information
skrrb committed Jul 11, 2023
1 parent f574db2 commit 8b25eab
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 26 deletions.
30 changes: 29 additions & 1 deletion programs/openbook-v2/src/accounts_ix/place_order.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::state::*;
use anchor_lang::prelude::*;
use anchor_spl::token::{Token, TokenAccount};
use anchor_spl::token::{Token, TokenAccount, Transfer};

#[derive(Accounts)]
pub struct PlaceOrder<'info> {
Expand Down Expand Up @@ -50,3 +50,31 @@ pub struct PlaceOrder<'info> {
pub token_program: Program<'info, Token>,
pub system_program: Program<'info, System>,
}

impl<'info> PlaceOrder<'info> {
pub fn transfer_base_from_user_to_market_ctx(
&self,
) -> CpiContext<'_, '_, '_, 'info, Transfer<'info>> {
CpiContext::new(
self.token_program.to_account_info(),
Transfer {
from: self.user_base_vault.to_account_info(),
to: self.base_vault.to_account_info(),
authority: self.owner_or_delegate.to_account_info(),
},
)
}

pub fn transfer_quote_from_user_to_market_ctx(
&self,
) -> CpiContext<'_, '_, '_, 'info, Transfer<'info>> {
CpiContext::new(
self.token_program.to_account_info(),
Transfer {
from: self.user_quote_vault.to_account_info(),
to: self.quote_vault.to_account_info(),
authority: self.owner_or_delegate.to_account_info(),
},
)
}
}
31 changes: 6 additions & 25 deletions programs/openbook-v2/src/instructions/place_order.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use anchor_lang::prelude::*;
use anchor_spl::token::{self, Transfer};
use anchor_spl::token;
use std::cmp;

use crate::accounts_ix::*;
Expand Down Expand Up @@ -71,7 +71,6 @@ pub fn place_order(ctx: Context<PlaceOrder>, order: Order, limit: u8) -> Result<
let deposit_amount = match order.side {
Side::Bid => {
let free_quote = position.quote_free_native;

let max_quote_including_fees = total_quote_taken_native
+ posted_quote_native
+ maker_fees
Expand All @@ -82,9 +81,7 @@ pub fn place_order(ctx: Context<PlaceOrder>, order: Order, limit: u8) -> Result<
position.quote_free_native -= free_qty_to_lock;

let deposit_amount = max_quote_including_fees - free_qty_to_lock;

market.quote_deposit_total += deposit_amount;

deposit_amount
}

Expand All @@ -96,35 +93,19 @@ pub fn place_order(ctx: Context<PlaceOrder>, order: Order, limit: u8) -> Result<
position.base_free_native -= free_qty_to_lock;

let deposit_amount = max_base_native - free_qty_to_lock;

market.base_deposit_total += deposit_amount;

deposit_amount
}
};

if deposit_amount > 0 {
let (from, to) = match order.side {
Side::Bid => (
ctx.accounts.user_quote_vault.to_account_info(),
ctx.accounts.quote_vault.to_account_info(),
),
Side::Ask => (
ctx.accounts.user_base_vault.to_account_info(),
ctx.accounts.base_vault.to_account_info(),
),
let cpi_ctx = match order.side {
Side::Ask => ctx.accounts.transfer_base_from_user_to_market_ctx(),
Side::Bid => ctx.accounts.transfer_quote_from_user_to_market_ctx(),
};

let cpi_context = CpiContext::new(
ctx.accounts.token_program.to_account_info(),
Transfer {
from,
to,
authority: ctx.accounts.owner_or_delegate.to_account_info(),
},
);

token::transfer(cpi_context, deposit_amount)?;
token::transfer(cpi_ctx, deposit_amount)?;
}

Ok(order_id)
}

0 comments on commit 8b25eab

Please sign in to comment.