diff --git a/programs/openbook-v2/src/accounts_ix/cancel_all_orders.rs b/programs/openbook-v2/src/accounts_ix/cancel_all_orders.rs deleted file mode 100644 index 718d94ce..00000000 --- a/programs/openbook-v2/src/accounts_ix/cancel_all_orders.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::state::{BookSide, Market, OpenOrdersAccount}; -use anchor_lang::prelude::*; - -#[derive(Accounts)] -pub struct CancelAllOrders<'info> { - #[account( - mut, - // owner is checked at #1 - has_one = market, - )] - pub open_orders_account: AccountLoader<'info, OpenOrdersAccount>, - pub owner: Signer<'info>, - - #[account( - has_one = bids, - has_one = asks, - )] - pub market: AccountLoader<'info, Market>, - #[account(mut)] - pub bids: AccountLoader<'info, BookSide>, - #[account(mut)] - pub asks: AccountLoader<'info, BookSide>, -} diff --git a/programs/openbook-v2/src/accounts_ix/cancel_all_orders_by_side.rs b/programs/openbook-v2/src/accounts_ix/cancel_all_orders_by_side.rs deleted file mode 100644 index 57a29132..00000000 --- a/programs/openbook-v2/src/accounts_ix/cancel_all_orders_by_side.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::state::{BookSide, Market, OpenOrdersAccount}; -use anchor_lang::prelude::*; - -#[derive(Accounts)] -pub struct CancelAllOrdersBySide<'info> { - #[account(mut, - has_one = market, - )] - pub open_orders_account: AccountLoader<'info, OpenOrdersAccount>, - pub owner: Signer<'info>, - - #[account( - has_one = bids, - has_one = asks, - )] - pub market: AccountLoader<'info, Market>, - #[account(mut)] - pub bids: AccountLoader<'info, BookSide>, - #[account(mut)] - pub asks: AccountLoader<'info, BookSide>, -} diff --git a/programs/openbook-v2/src/accounts_ix/cancel_order.rs b/programs/openbook-v2/src/accounts_ix/cancel_order.rs index 2c3734f0..874971d0 100644 --- a/programs/openbook-v2/src/accounts_ix/cancel_order.rs +++ b/programs/openbook-v2/src/accounts_ix/cancel_order.rs @@ -3,12 +3,13 @@ use anchor_lang::prelude::*; #[derive(Accounts)] pub struct CancelOrder<'info> { - #[account(mut, - has_one = market, + #[account( + mut, + has_one = market + // also is_owner_or_delegate check inside ix )] pub open_orders_account: AccountLoader<'info, OpenOrdersAccount>, pub owner: Signer<'info>, - #[account( has_one = bids, has_one = asks, diff --git a/programs/openbook-v2/src/accounts_ix/cancel_order_by_client_order_id.rs b/programs/openbook-v2/src/accounts_ix/cancel_order_by_client_order_id.rs deleted file mode 100644 index dc808103..00000000 --- a/programs/openbook-v2/src/accounts_ix/cancel_order_by_client_order_id.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::state::{BookSide, Market, OpenOrdersAccount}; -use anchor_lang::prelude::*; - -#[derive(Accounts)] -pub struct CancelOrderByClientOrderId<'info> { - #[account( - mut, - // owner is checked at #1 - has_one = market, - )] - pub open_orders_account: AccountLoader<'info, OpenOrdersAccount>, - pub owner: Signer<'info>, - - #[account( - has_one = bids, - has_one = asks, - )] - pub market: AccountLoader<'info, Market>, - #[account(mut)] - pub bids: AccountLoader<'info, BookSide>, - #[account(mut)] - pub asks: AccountLoader<'info, BookSide>, -} diff --git a/programs/openbook-v2/src/accounts_ix/consume_events.rs b/programs/openbook-v2/src/accounts_ix/consume_events.rs index 05bb981c..33774c4f 100644 --- a/programs/openbook-v2/src/accounts_ix/consume_events.rs +++ b/programs/openbook-v2/src/accounts_ix/consume_events.rs @@ -9,7 +9,6 @@ pub struct ConsumeEvents<'info> { has_one = event_queue, )] pub market: AccountLoader<'info, Market>, - #[account(mut)] pub event_queue: AccountLoader<'info, EventQueue>, } diff --git a/programs/openbook-v2/src/accounts_ix/deposit.rs b/programs/openbook-v2/src/accounts_ix/deposit.rs index e876fd34..8f32d3e6 100644 --- a/programs/openbook-v2/src/accounts_ix/deposit.rs +++ b/programs/openbook-v2/src/accounts_ix/deposit.rs @@ -5,17 +5,28 @@ use anchor_spl::token::{Token, TokenAccount}; #[derive(Accounts)] pub struct Deposit<'info> { pub owner: Signer<'info>, - #[account(mut)] + #[account( + mut, + token::mint = base_vault.mint + )] pub token_base_account: Account<'info, TokenAccount>, - #[account(mut)] + #[account( + mut, + token::mint = quote_vault.mint + )] pub token_quote_account: Account<'info, TokenAccount>, - #[account(mut, + #[account( + mut, has_one = market, )] pub open_orders_account: AccountLoader<'info, OpenOrdersAccount>, - #[account(mut)] - pub market: AccountLoader<'info, Market>, + #[account( + mut, + has_one = base_vault, + has_one = quote_vault, + )] + pub market: AccountLoader<'info, Market>, #[account(mut)] pub base_vault: Account<'info, TokenAccount>, #[account(mut)] diff --git a/programs/openbook-v2/src/accounts_ix/init_open_orders.rs b/programs/openbook-v2/src/accounts_ix/init_open_orders.rs index 269f15f0..78f251d5 100644 --- a/programs/openbook-v2/src/accounts_ix/init_open_orders.rs +++ b/programs/openbook-v2/src/accounts_ix/init_open_orders.rs @@ -5,6 +5,12 @@ use crate::state::{Market, OpenOrdersAccount}; #[derive(Accounts)] #[instruction(account_num: u32)] pub struct InitOpenOrders<'info> { + #[account(mut)] + pub payer: Signer<'info>, + #[account(mut)] + pub owner: Signer<'info>, + /// CHECK: + pub delegate_account: Option>, #[account( init, seeds = [b"OpenOrders".as_ref(), owner.key().as_ref(), market.key().as_ref(), &account_num.to_le_bytes()], @@ -13,13 +19,6 @@ pub struct InitOpenOrders<'info> { space = OpenOrdersAccount::space()?, )] pub open_orders_account: AccountLoader<'info, OpenOrdersAccount>, - #[account(mut)] - pub owner: Signer<'info>, - #[account(mut)] - pub payer: Signer<'info>, - /// CHECK: - pub delegate_account: Option>, - #[account(mut)] pub market: AccountLoader<'info, Market>, pub system_program: Program<'info, System>, } diff --git a/programs/openbook-v2/src/accounts_ix/mod.rs b/programs/openbook-v2/src/accounts_ix/mod.rs index 4b314fc7..85e0459b 100644 --- a/programs/openbook-v2/src/accounts_ix/mod.rs +++ b/programs/openbook-v2/src/accounts_ix/mod.rs @@ -1,7 +1,4 @@ -pub use cancel_all_orders::*; -pub use cancel_all_orders_by_side::*; pub use cancel_order::*; -pub use cancel_order_by_client_order_id::*; pub use close_market::*; pub use consume_events::*; pub use create_market::*; @@ -18,10 +15,7 @@ pub use stub_oracle_create::*; pub use stub_oracle_set::*; pub use sweep_fees::*; -mod cancel_all_orders; -mod cancel_all_orders_by_side; mod cancel_order; -mod cancel_order_by_client_order_id; mod close_market; mod consume_events; mod create_market; diff --git a/programs/openbook-v2/src/accounts_ix/place_order.rs b/programs/openbook-v2/src/accounts_ix/place_order.rs index cf2f784d..226ad4bc 100644 --- a/programs/openbook-v2/src/accounts_ix/place_order.rs +++ b/programs/openbook-v2/src/accounts_ix/place_order.rs @@ -4,13 +4,19 @@ use anchor_spl::token::{Token, TokenAccount}; #[derive(Accounts)] pub struct PlaceOrder<'info> { - #[account(mut, + #[account( + mut, has_one = market, + // also is_owner_or_delegate check inside ix )] pub open_orders_account: AccountLoader<'info, OpenOrdersAccount>, pub owner_or_delegate: Signer<'info>, pub open_orders_admin: Option>, - #[account(mut)] + + #[account( + mut, + constraint = token_deposit_account.mint == market_vault.mint + )] pub token_deposit_account: Account<'info, TokenAccount>, #[account( @@ -27,7 +33,10 @@ pub struct PlaceOrder<'info> { pub asks: AccountLoader<'info, BookSide>, #[account(mut)] pub event_queue: AccountLoader<'info, EventQueue>, - #[account(mut)] + #[account( + mut, + constraint = market.load()?.is_market_vault(market_vault.key()) + )] pub market_vault: Account<'info, TokenAccount>, /// CHECK: The oracle can be one of several different account types and the pubkey is checked above diff --git a/programs/openbook-v2/src/accounts_ix/place_take_order.rs b/programs/openbook-v2/src/accounts_ix/place_take_order.rs index 140d4600..099c20d6 100644 --- a/programs/openbook-v2/src/accounts_ix/place_take_order.rs +++ b/programs/openbook-v2/src/accounts_ix/place_take_order.rs @@ -12,16 +12,14 @@ pub struct PlaceTakeOrder<'info> { has_one = asks, has_one = event_queue, has_one = oracle, + has_one = base_vault, + has_one = quote_vault, )] pub market: AccountLoader<'info, Market>, #[account(mut)] pub bids: AccountLoader<'info, BookSide>, #[account(mut)] pub asks: AccountLoader<'info, BookSide>, - #[account(mut, constraint = token_deposit_account.owner == signer.key())] - pub token_deposit_account: Box>, - #[account(mut)] - pub token_receiver_account: Box>, #[account(mut)] pub base_vault: Account<'info, TokenAccount>, #[account(mut)] @@ -29,6 +27,18 @@ pub struct PlaceTakeOrder<'info> { #[account(mut)] pub event_queue: AccountLoader<'info, EventQueue>, + #[account( + mut, + token::authority = signer.key(), + constraint = token_deposit_account.mint == base_vault.mint || token_deposit_account.mint == quote_vault.mint + )] + pub token_deposit_account: Box>, + #[account( + mut, + constraint = token_deposit_account.mint == base_vault.mint || token_deposit_account.mint == quote_vault.mint + )] + pub token_receiver_account: Box>, + /// CHECK: The oracle can be one of several different account types and the pubkey is checked above pub oracle: UncheckedAccount<'info>, pub token_program: Program<'info, Token>, diff --git a/programs/openbook-v2/src/accounts_ix/set_delegate.rs b/programs/openbook-v2/src/accounts_ix/set_delegate.rs index c11069bc..c36076e5 100644 --- a/programs/openbook-v2/src/accounts_ix/set_delegate.rs +++ b/programs/openbook-v2/src/accounts_ix/set_delegate.rs @@ -4,13 +4,13 @@ use crate::state::OpenOrdersAccount; #[derive(Accounts)] pub struct SetDelegate<'info> { + #[account(mut)] + pub owner: Signer<'info>, #[account( mut, has_one = owner, )] pub open_orders_account: AccountLoader<'info, OpenOrdersAccount>, - #[account(mut)] - pub owner: Signer<'info>, /// CHECK: pub delegate_account: Option>, } diff --git a/programs/openbook-v2/src/accounts_ix/settle_funds.rs b/programs/openbook-v2/src/accounts_ix/settle_funds.rs index b8ba90b5..ed8aeb80 100644 --- a/programs/openbook-v2/src/accounts_ix/settle_funds.rs +++ b/programs/openbook-v2/src/accounts_ix/settle_funds.rs @@ -5,21 +5,33 @@ use anchor_spl::token::{Token, TokenAccount}; #[derive(Accounts)] pub struct SettleFunds<'info> { pub owner: Signer<'info>, - #[account(mut, has_one = owner, + #[account( + mut, + has_one = owner, has_one = market, )] pub open_orders_account: AccountLoader<'info, OpenOrdersAccount>, - #[account(mut)] - pub market: AccountLoader<'info, Market>, + #[account( + mut, + has_one = base_vault, + has_one = quote_vault, + )] + pub market: AccountLoader<'info, Market>, #[account(mut)] pub base_vault: Account<'info, TokenAccount>, #[account(mut)] pub quote_vault: Account<'info, TokenAccount>, - #[account(mut)] + #[account( + mut, + token::mint = base_vault.mint + )] pub token_base_account: Account<'info, TokenAccount>, - #[account(mut)] + #[account( + mut, + token::mint = quote_vault.mint + )] pub token_quote_account: Account<'info, TokenAccount>, pub token_program: Program<'info, Token>, diff --git a/programs/openbook-v2/src/accounts_ix/stub_oracle_close.rs b/programs/openbook-v2/src/accounts_ix/stub_oracle_close.rs index 3ce926c0..0f310fb2 100644 --- a/programs/openbook-v2/src/accounts_ix/stub_oracle_close.rs +++ b/programs/openbook-v2/src/accounts_ix/stub_oracle_close.rs @@ -6,17 +6,13 @@ use crate::state::*; #[derive(Accounts)] pub struct StubOracleClose<'info> { pub admin: Signer<'info>, - - // match stub oracle to group #[account( mut, close = sol_destination )] pub oracle: AccountLoader<'info, StubOracle>, - #[account(mut)] /// CHECK: target for account rent needs no checks pub sol_destination: UncheckedAccount<'info>, - pub token_program: Program<'info, Token>, } diff --git a/programs/openbook-v2/src/accounts_ix/stub_oracle_create.rs b/programs/openbook-v2/src/accounts_ix/stub_oracle_create.rs index e1db59ec..45a79537 100644 --- a/programs/openbook-v2/src/accounts_ix/stub_oracle_create.rs +++ b/programs/openbook-v2/src/accounts_ix/stub_oracle_create.rs @@ -4,6 +4,8 @@ use anchor_spl::token::Mint; #[derive(Accounts)] pub struct StubOracleCreate<'info> { + #[account(mut)] + pub payer: Signer<'info>, #[account( init, seeds = [b"StubOracle".as_ref(), mint.key().as_ref()], @@ -12,13 +14,7 @@ pub struct StubOracleCreate<'info> { space = 8 + std::mem::size_of::(), )] pub oracle: AccountLoader<'info, StubOracle>, - pub admin: Signer<'info>, - pub mint: Account<'info, Mint>, - - #[account(mut)] - pub payer: Signer<'info>, - pub system_program: Program<'info, System>, } diff --git a/programs/openbook-v2/src/accounts_ix/stub_oracle_set.rs b/programs/openbook-v2/src/accounts_ix/stub_oracle_set.rs index 6aa2f591..56e6feab 100644 --- a/programs/openbook-v2/src/accounts_ix/stub_oracle_set.rs +++ b/programs/openbook-v2/src/accounts_ix/stub_oracle_set.rs @@ -4,7 +4,6 @@ use anchor_lang::prelude::*; #[derive(Accounts)] pub struct StubOracleSet<'info> { pub admin: Signer<'info>, - #[account(mut)] pub oracle: AccountLoader<'info, StubOracle>, } diff --git a/programs/openbook-v2/src/accounts_ix/sweep_fees.rs b/programs/openbook-v2/src/accounts_ix/sweep_fees.rs index 1190d097..a6ab706c 100644 --- a/programs/openbook-v2/src/accounts_ix/sweep_fees.rs +++ b/programs/openbook-v2/src/accounts_ix/sweep_fees.rs @@ -5,16 +5,20 @@ use anchor_spl::token::{Token, TokenAccount}; #[derive(Accounts)] pub struct SweepFees<'info> { pub collect_fee_admin: Signer<'info>, - - #[account(mut, has_one = collect_fee_admin)] + #[account( + mut, + has_one = quote_vault, + has_one = collect_fee_admin + )] pub market: AccountLoader<'info, Market>, - - #[account(mut)] - pub token_receiver_account: Account<'info, TokenAccount>, - #[account(mut)] pub quote_vault: Account<'info, TokenAccount>, + #[account( + mut, + token::mint = quote_vault.mint + )] + pub token_receiver_account: Account<'info, TokenAccount>, pub token_program: Program<'info, Token>, pub system_program: Program<'info, System>, } diff --git a/programs/openbook-v2/src/instructions/cancel_all_orders.rs b/programs/openbook-v2/src/instructions/cancel_all_orders.rs index d96ee30b..a98dfd3e 100644 --- a/programs/openbook-v2/src/instructions/cancel_all_orders.rs +++ b/programs/openbook-v2/src/instructions/cancel_all_orders.rs @@ -5,12 +5,11 @@ use crate::error::OpenBookError; use crate::state::*; pub fn cancel_all_orders( - ctx: Context, + ctx: Context, side_option: Option, limit: u8, ) -> Result<()> { let mut account = ctx.accounts.open_orders_account.load_mut()?; - // account constraint #1 require!( account.is_owner_or_delegate(ctx.accounts.owner.key()), OpenBookError::NoOwnerOrDelegate diff --git a/programs/openbook-v2/src/instructions/cancel_order.rs b/programs/openbook-v2/src/instructions/cancel_order.rs index 14063e85..4c3fc73a 100644 --- a/programs/openbook-v2/src/instructions/cancel_order.rs +++ b/programs/openbook-v2/src/instructions/cancel_order.rs @@ -8,7 +8,6 @@ pub fn cancel_order(ctx: Context, order_id: u128) -> Result<()> { require_gt!(order_id, 0, OpenBookError::InvalidInputOrderId); let mut account = ctx.accounts.open_orders_account.load_mut()?; - // account constraint #1 require!( account.is_owner_or_delegate(ctx.accounts.owner.key()), OpenBookError::NoOwnerOrDelegate diff --git a/programs/openbook-v2/src/instructions/cancel_order_by_client_order_id.rs b/programs/openbook-v2/src/instructions/cancel_order_by_client_order_id.rs index dfc4bb66..b6ca91d1 100644 --- a/programs/openbook-v2/src/instructions/cancel_order_by_client_order_id.rs +++ b/programs/openbook-v2/src/instructions/cancel_order_by_client_order_id.rs @@ -5,11 +5,10 @@ use crate::error::*; use crate::state::*; pub fn cancel_order_by_client_order_id( - ctx: Context, + ctx: Context, client_order_id: u64, ) -> Result<()> { let mut account = ctx.accounts.open_orders_account.load_mut()?; - // account constraint #1 require!( account.is_owner_or_delegate(ctx.accounts.owner.key()), OpenBookError::SomeError diff --git a/programs/openbook-v2/src/instructions/place_order.rs b/programs/openbook-v2/src/instructions/place_order.rs index a422fb8e..feda78ed 100644 --- a/programs/openbook-v2/src/instructions/place_order.rs +++ b/programs/openbook-v2/src/instructions/place_order.rs @@ -18,7 +18,6 @@ pub fn place_order(ctx: Context, order: Order, limit: u8) -> Result< ); let mut open_orders_account = ctx.accounts.open_orders_account.load_mut()?; - // account constraint #1 require!( open_orders_account.is_owner_or_delegate(ctx.accounts.owner_or_delegate.key()), OpenBookError::NoOwnerOrDelegate diff --git a/programs/openbook-v2/src/lib.rs b/programs/openbook-v2/src/lib.rs index 16ab3ba9..2c1439de 100644 --- a/programs/openbook-v2/src/lib.rs +++ b/programs/openbook-v2/src/lib.rs @@ -305,7 +305,7 @@ pub mod openbook_v2 { /// Note that this doesn't emit an [`OutEvent`](crate::state::OutEvent) because a /// maker knows that they will be passing in their own [`OpenOrdersAccount`](crate::state::OpenOrdersAccount). pub fn cancel_order_by_client_order_id( - ctx: Context, + ctx: Context, client_order_id: u64, ) -> Result<()> { #[cfg(feature = "enable-gpl")] @@ -315,7 +315,7 @@ pub mod openbook_v2 { /// Cancel up to `limit` orders, optionally filtering by side pub fn cancel_all_orders( - ctx: Context, + ctx: Context, side_option: Option, limit: u8, ) -> Result<()> { diff --git a/programs/openbook-v2/src/state/market.rs b/programs/openbook-v2/src/state/market.rs index c21a96ce..f270da50 100644 --- a/programs/openbook-v2/src/state/market.rs +++ b/programs/openbook-v2/src/state/market.rs @@ -154,6 +154,10 @@ impl Market { .trim_matches(char::from(0)) } + pub fn is_market_vault(&self, pubkey: Pubkey) -> bool { + pubkey == self.quote_vault || pubkey == self.base_vault + } + pub fn gen_order_id(&mut self, side: Side, price_data: u64) -> u128 { self.seq_num += 1; orderbook::new_node_key(side, price_data, self.seq_num) diff --git a/programs/openbook-v2/tests/program_test/client.rs b/programs/openbook-v2/tests/program_test/client.rs index 0fe2555e..489f2336 100644 --- a/programs/openbook-v2/tests/program_test/client.rs +++ b/programs/openbook-v2/tests/program_test/client.rs @@ -560,7 +560,7 @@ pub struct CancelOrderByClientOrderIdInstruction { } #[async_trait::async_trait(?Send)] impl ClientInstruction for CancelOrderByClientOrderIdInstruction { - type Accounts = openbook_v2::accounts::CancelOrderByClientOrderId; + type Accounts = openbook_v2::accounts::CancelOrder; type Instruction = openbook_v2::instruction::CancelOrderByClientOrderId; async fn to_instruction( &self, @@ -596,7 +596,7 @@ pub struct CancelAllOrdersInstruction { } #[async_trait::async_trait(?Send)] impl ClientInstruction for CancelAllOrdersInstruction { - type Accounts = openbook_v2::accounts::CancelAllOrders; + type Accounts = openbook_v2::accounts::CancelOrder; type Instruction = openbook_v2::instruction::CancelAllOrders; async fn to_instruction( &self,