Skip to content

Commit

Permalink
impl transfer cpi ctx for PlaceTakeOrder
Browse files Browse the repository at this point in the history
  • Loading branch information
skrrb committed Jul 11, 2023
1 parent 8b25eab commit a1e4d54
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 51 deletions.
70 changes: 69 additions & 1 deletion programs/openbook-v2/src/accounts_ix/place_take_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 PlaceTakeOrder<'info> {
Expand Down Expand Up @@ -46,3 +46,71 @@ pub struct PlaceTakeOrder<'info> {
pub system_program: Program<'info, System>,
pub open_orders_admin: Option<Signer<'info>>,
}

impl<'info> PlaceTakeOrder<'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.signer.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.signer.to_account_info(),
},
)
}

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

pub fn transfer_quote_from_market_to_user_ctx(
&self,
) -> CpiContext<'_, '_, '_, 'info, Transfer<'info>> {
CpiContext::new(
self.token_program.to_account_info(),
Transfer {
from: self.quote_vault.to_account_info(),
to: self.user_quote_vault.to_account_info(),
authority: self.market.to_account_info(),
},
)
}

pub fn transfer_quote_from_market_to_account_ctx(
&self,
referrer: &AccountInfo<'info>,
) -> CpiContext<'_, '_, '_, 'info, Transfer<'info>> {
CpiContext::new(
self.token_program.to_account_info(),
Transfer {
from: self.quote_vault.to_account_info(),
to: referrer.to_account_info(),
authority: self.market.to_account_info(),
},
)
}
}
1 change: 0 additions & 1 deletion programs/openbook-v2/src/instructions/place_order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,6 @@ pub fn place_order(ctx: Context<PlaceOrder>, order: Order, limit: u8) -> Result<
Side::Ask => ctx.accounts.transfer_base_from_user_to_market_ctx(),
Side::Bid => ctx.accounts.transfer_quote_from_user_to_market_ctx(),
};

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

Expand Down
65 changes: 16 additions & 49 deletions programs/openbook-v2/src/instructions/place_take_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 crate::accounts_ix::*;
use crate::accounts_zerocopy::*;
Expand Down Expand Up @@ -94,63 +94,30 @@ pub fn place_take_order<'info>(
drop(market);

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.signer.to_account_info(),
},
);
token::transfer(cpi_context, deposit_amount)?;
token::transfer(cpi_ctx, deposit_amount)?;
}

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

let cpi_context = CpiContext::new(
ctx.accounts.token_program.to_account_info(),
Transfer {
from,
to,
authority: ctx.accounts.market.to_account_info(),
},
);
token::transfer(cpi_context.with_signer(signer), withdraw_amount)?;
token::transfer(cpi_ctx.with_signer(signer), withdraw_amount)?;
}

// Transfer to referrer
if !ctx.remaining_accounts.is_empty() && referrer_amount > 0 {
let referrer = ctx.remaining_accounts[0].to_account_info();
let cpi_context = CpiContext::new(
ctx.accounts.token_program.to_account_info(),
Transfer {
from: ctx.accounts.quote_vault.to_account_info(),
to: referrer,
authority: ctx.accounts.market.to_account_info(),
},
);
token::transfer(cpi_context.with_signer(signer), referrer_amount)?;
let referrer = &ctx.remaining_accounts[0];
token::transfer(
ctx.accounts
.transfer_quote_from_market_to_account_ctx(referrer)
.with_signer(signer),
referrer_amount,
)?;
}

Ok(order_id)
Expand Down

0 comments on commit a1e4d54

Please sign in to comment.