From 3a063139e260d741bebacd07f43c25a95b204b1b Mon Sep 17 00:00:00 2001 From: Binye Barwe Date: Fri, 2 Feb 2024 08:04:14 +0800 Subject: [PATCH 1/3] add place_orders --- .../cancel_all_and_place_orders.rs | 5 +- programs/openbook-v2/src/lib.rs | 50 ++++++++++++++++++- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/programs/openbook-v2/src/instructions/cancel_all_and_place_orders.rs b/programs/openbook-v2/src/instructions/cancel_all_and_place_orders.rs index ed256a760..6106d4335 100644 --- a/programs/openbook-v2/src/instructions/cancel_all_and_place_orders.rs +++ b/programs/openbook-v2/src/instructions/cancel_all_and_place_orders.rs @@ -10,6 +10,7 @@ use crate::token_utils::*; #[allow(clippy::too_many_arguments)] pub fn cancel_all_and_place_orders( ctx: Context, + cancel: bool, mut orders: Vec, limit: u8, ) -> Result>> { @@ -39,7 +40,9 @@ pub fn cancel_all_and_place_orders( clock.slot, )?; - book.cancel_all_orders(&mut open_orders_account, *market, u8::MAX, None)?; + if cancel { + book.cancel_all_orders(&mut open_orders_account, *market, u8::MAX, None)?; + } let mut base_amount = 0_u64; let mut quote_amount = 0_u64; diff --git a/programs/openbook-v2/src/lib.rs b/programs/openbook-v2/src/lib.rs index bf9d6702e..c249b8063 100644 --- a/programs/openbook-v2/src/lib.rs +++ b/programs/openbook-v2/src/lib.rs @@ -256,6 +256,54 @@ pub mod openbook_v2 { Ok(None) } + /// Place multiple orders + pub fn place_orders( + ctx: Context, + orders_type: PlaceOrderType, + bids: Vec, + asks: Vec, + limit: u8, + ) -> Result>> { + let n_bids = bids.len(); + + let mut orders = vec![]; + for (i, order) in bids.into_iter().chain(asks).enumerate() { + require_gte!(order.price_lots, 1, OpenBookError::InvalidInputPriceLots); + + let time_in_force = match Order::tif_from_expiry(order.expiry_timestamp) { + Some(t) => t, + None => { + msg!("Order is already expired"); + continue; + } + }; + orders.push(Order { + side: if i < n_bids { Side::Bid } else { Side::Ask }, + max_base_lots: i64::MIN, // this will be overriden to max_base_lots + max_quote_lots_including_fees: order.max_quote_lots_including_fees, + client_order_id: i as u64, + time_in_force, + self_trade_behavior: SelfTradeBehavior::CancelProvide, + params: match orders_type { + PlaceOrderType::Market => OrderParams::Market, + PlaceOrderType::ImmediateOrCancel => OrderParams::ImmediateOrCancel { + price_lots: order.price_lots, + }, + _ => OrderParams::Fixed { + price_lots: order.price_lots, + order_type: orders_type.to_post_order_type()?, + }, + }, + }); + } + + #[cfg(feature = "enable-gpl")] + return instructions::cancel_all_and_place_orders(ctx, false, orders, limit); + + #[cfg(not(feature = "enable-gpl"))] + Ok(vec![]) + } + /// Cancel orders and place multiple orders. pub fn cancel_all_and_place_orders( ctx: Context, @@ -298,7 +346,7 @@ pub mod openbook_v2 { } #[cfg(feature = "enable-gpl")] - return instructions::cancel_all_and_place_orders(ctx, orders, limit); + return instructions::cancel_all_and_place_orders(ctx, true, orders, limit); #[cfg(not(feature = "enable-gpl"))] Ok(vec![]) From 23fc2952544f7236684d9ddb9814d8609a6cd752 Mon Sep 17 00:00:00 2001 From: skrrb Date: Fri, 2 Feb 2024 09:42:07 +0100 Subject: [PATCH 2/3] idl --- idl/openbook_v2.json | 114 ++++++++++++++++++ ts/client/src/openbook_v2.ts | 224 +++++++++++++++++++++++++++++++++++ 2 files changed, 338 insertions(+) diff --git a/idl/openbook_v2.json b/idl/openbook_v2.json index a756c6021..25c0d8b63 100644 --- a/idl/openbook_v2.json +++ b/idl/openbook_v2.json @@ -620,6 +620,120 @@ "option": "u128" } }, + { + "name": "placeOrders", + "docs": [ + "Place multiple orders" + ], + "accounts": [ + { + "name": "signer", + "isMut": false, + "isSigner": true + }, + { + "name": "openOrdersAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "openOrdersAdmin", + "isMut": false, + "isSigner": true, + "isOptional": true + }, + { + "name": "userQuoteAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "userBaseAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "market", + "isMut": true, + "isSigner": false + }, + { + "name": "bids", + "isMut": true, + "isSigner": false + }, + { + "name": "asks", + "isMut": true, + "isSigner": false + }, + { + "name": "eventHeap", + "isMut": true, + "isSigner": false + }, + { + "name": "marketQuoteVault", + "isMut": true, + "isSigner": false + }, + { + "name": "marketBaseVault", + "isMut": true, + "isSigner": false + }, + { + "name": "oracleA", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "oracleB", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ordersType", + "type": { + "defined": "PlaceOrderType" + } + }, + { + "name": "bids", + "type": { + "vec": { + "defined": "PlaceMultipleOrdersArgs" + } + } + }, + { + "name": "asks", + "type": { + "vec": { + "defined": "PlaceMultipleOrdersArgs" + } + } + }, + { + "name": "limit", + "type": "u8" + } + ], + "returns": { + "vec": { + "option": "u128" + } + } + }, { "name": "cancelAllAndPlaceOrders", "docs": [ diff --git a/ts/client/src/openbook_v2.ts b/ts/client/src/openbook_v2.ts index c8b11ddf5..91e38a549 100644 --- a/ts/client/src/openbook_v2.ts +++ b/ts/client/src/openbook_v2.ts @@ -616,6 +616,118 @@ export interface OpenbookV2 { option: 'u128'; }; }, + { + name: 'placeOrders'; + docs: ['Place multiple orders']; + accounts: [ + { + name: 'signer'; + isMut: false; + isSigner: true; + }, + { + name: 'openOrdersAccount'; + isMut: true; + isSigner: false; + }, + { + name: 'openOrdersAdmin'; + isMut: false; + isSigner: true; + isOptional: true; + }, + { + name: 'userQuoteAccount'; + isMut: true; + isSigner: false; + }, + { + name: 'userBaseAccount'; + isMut: true; + isSigner: false; + }, + { + name: 'market'; + isMut: true; + isSigner: false; + }, + { + name: 'bids'; + isMut: true; + isSigner: false; + }, + { + name: 'asks'; + isMut: true; + isSigner: false; + }, + { + name: 'eventHeap'; + isMut: true; + isSigner: false; + }, + { + name: 'marketQuoteVault'; + isMut: true; + isSigner: false; + }, + { + name: 'marketBaseVault'; + isMut: true; + isSigner: false; + }, + { + name: 'oracleA'; + isMut: false; + isSigner: false; + isOptional: true; + }, + { + name: 'oracleB'; + isMut: false; + isSigner: false; + isOptional: true; + }, + { + name: 'tokenProgram'; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: 'ordersType'; + type: { + defined: 'PlaceOrderType'; + }; + }, + { + name: 'bids'; + type: { + vec: { + defined: 'PlaceMultipleOrdersArgs'; + }; + }; + }, + { + name: 'asks'; + type: { + vec: { + defined: 'PlaceMultipleOrdersArgs'; + }; + }; + }, + { + name: 'limit'; + type: 'u8'; + }, + ]; + returns: { + vec: { + option: 'u128'; + }; + }; + }, { name: 'cancelAllAndPlaceOrders'; docs: ['Cancel orders and place multiple orders.']; @@ -4189,6 +4301,118 @@ export const IDL: OpenbookV2 = { option: 'u128', }, }, + { + name: 'placeOrders', + docs: ['Place multiple orders'], + accounts: [ + { + name: 'signer', + isMut: false, + isSigner: true, + }, + { + name: 'openOrdersAccount', + isMut: true, + isSigner: false, + }, + { + name: 'openOrdersAdmin', + isMut: false, + isSigner: true, + isOptional: true, + }, + { + name: 'userQuoteAccount', + isMut: true, + isSigner: false, + }, + { + name: 'userBaseAccount', + isMut: true, + isSigner: false, + }, + { + name: 'market', + isMut: true, + isSigner: false, + }, + { + name: 'bids', + isMut: true, + isSigner: false, + }, + { + name: 'asks', + isMut: true, + isSigner: false, + }, + { + name: 'eventHeap', + isMut: true, + isSigner: false, + }, + { + name: 'marketQuoteVault', + isMut: true, + isSigner: false, + }, + { + name: 'marketBaseVault', + isMut: true, + isSigner: false, + }, + { + name: 'oracleA', + isMut: false, + isSigner: false, + isOptional: true, + }, + { + name: 'oracleB', + isMut: false, + isSigner: false, + isOptional: true, + }, + { + name: 'tokenProgram', + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: 'ordersType', + type: { + defined: 'PlaceOrderType', + }, + }, + { + name: 'bids', + type: { + vec: { + defined: 'PlaceMultipleOrdersArgs', + }, + }, + }, + { + name: 'asks', + type: { + vec: { + defined: 'PlaceMultipleOrdersArgs', + }, + }, + }, + { + name: 'limit', + type: 'u8', + }, + ], + returns: { + vec: { + option: 'u128', + }, + }, + }, { name: 'cancelAllAndPlaceOrders', docs: ['Cancel orders and place multiple orders.'], From 1a995c691acd63a8988612646225f69ea6fb2d87 Mon Sep 17 00:00:00 2001 From: Binye Barwe Date: Fri, 2 Feb 2024 20:02:35 +0800 Subject: [PATCH 3/3] add placeOrders to the sdk --- package.json | 2 +- ts/client/src/client.ts | 43 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f61667138..3f9155713 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@openbook-dex/openbook-v2", - "version": "0.1.8", + "version": "0.1.9", "description": "Typescript Client for openbook-v2 program.", "repository": "https://github.com/openbook-dex/openbook-v2/", "author": { diff --git a/ts/client/src/client.ts b/ts/client/src/client.ts index 6e6fb1464..8ee2c0fe1 100644 --- a/ts/client/src/client.ts +++ b/ts/client/src/client.ts @@ -803,6 +803,49 @@ export class OpenBookV2Client { return [ix, signers]; } + // Use OrderType from './utils/utils' for orderType + public async placeOrdersIx( + openOrdersPublicKey: PublicKey, + marketPublicKey: PublicKey, + market: MarketAccount, + userBaseAccount: PublicKey, + userQuoteAccount: PublicKey, + openOrdersAdmin: PublicKey | null, + orderType: PlaceOrderType, + bids: PlaceMultipleOrdersArgs[], + asks: PlaceMultipleOrdersArgs[], + limit: number = 12, + openOrdersDelegate?: Keypair, + ): Promise<[TransactionInstruction, Signer[]]> { + const ix = await this.program.methods + .placeOrders(orderType, bids, asks, limit) + .accounts({ + signer: + openOrdersDelegate != null + ? openOrdersDelegate.publicKey + : this.walletPk, + asks: market.asks, + bids: market.bids, + marketQuoteVault: market.marketQuoteVault, + marketBaseVault: market.marketBaseVault, + eventHeap: market.eventHeap, + market: marketPublicKey, + openOrdersAccount: openOrdersPublicKey, + oracleA: market.oracleA.key, + oracleB: market.oracleB.key, + userBaseAccount, + userQuoteAccount, + tokenProgram: TOKEN_PROGRAM_ID, + openOrdersAdmin, + }) + .instruction(); + const signers: Signer[] = []; + if (openOrdersDelegate != null) { + signers.push(openOrdersDelegate); + } + return [ix, signers]; + } + public async cancelOrderById( openOrdersPublicKey: PublicKey, openOrdersAccount: OpenOrdersAccount,