From 0192728efc8acbc4a63c31839b61f82ba1b968fb Mon Sep 17 00:00:00 2001 From: microwavedcola1 <89031858+microwavedcola1@users.noreply.github.com> Date: Wed, 25 Jan 2023 09:03:35 +0100 Subject: [PATCH] return order id from a perp place order ix (#417) * return order id from a perp place order ix Signed-off-by: microwavedcola1 * fix Signed-off-by: microwavedcola1 * fixes from review Signed-off-by: microwavedcola1 Signed-off-by: microwavedcola1 --- .../src/instructions/perp_place_order.rs | 10 +++++++--- programs/mango-v4/src/lib.rs | 8 ++++---- programs/mango-v4/src/state/orderbook/book.rs | 8 ++++++-- ts/client/src/client.ts | 3 +++ ts/client/src/mango_v4.ts | 20 +++++++++++++++---- 5 files changed, 36 insertions(+), 13 deletions(-) diff --git a/programs/mango-v4/src/instructions/perp_place_order.rs b/programs/mango-v4/src/instructions/perp_place_order.rs index 8f145fff0..09b81931a 100644 --- a/programs/mango-v4/src/instructions/perp_place_order.rs +++ b/programs/mango-v4/src/instructions/perp_place_order.rs @@ -47,7 +47,11 @@ pub struct PerpPlaceOrder<'info> { // TODO #[allow(clippy::too_many_arguments)] -pub fn perp_place_order(ctx: Context, mut order: Order, limit: u8) -> Result<()> { +pub fn perp_place_order( + ctx: Context, + mut order: Order, + limit: u8, +) -> Result> { require_gte!(order.max_base_lots, 0); require_gte!(order.max_quote_lots, 0); @@ -149,7 +153,7 @@ pub fn perp_place_order(ctx: Context, mut order: Order, limit: u }; order.max_base_lots = max_base_lots; - book.new_order( + let order_id_opt = book.new_order( order, &mut perp_market, &mut event_queue, @@ -169,5 +173,5 @@ pub fn perp_place_order(ctx: Context, mut order: Order, limit: u account.check_health_post(&health_cache, pre_health)?; } - Ok(()) + Ok(order_id_opt) } diff --git a/programs/mango-v4/src/lib.rs b/programs/mango-v4/src/lib.rs index c513c5491..f2c197ccc 100644 --- a/programs/mango-v4/src/lib.rs +++ b/programs/mango-v4/src/lib.rs @@ -592,7 +592,7 @@ pub mod mango_v4 { // Use this to limit compute used during order matching. // When the limit is reached, processing stops and the instruction succeeds. limit: u8, - ) -> Result<()> { + ) -> Result> { require_gte!(price_lots, 0); use crate::state::{Order, OrderParams}; @@ -600,7 +600,7 @@ pub mod mango_v4 { Some(t) => t, None => { msg!("Order is already expired"); - return Ok(()); + return Ok(None); } }; let order = Order { @@ -660,7 +660,7 @@ pub mod mango_v4 { // // WARNING: Not currently implemented. max_oracle_staleness_slots: i32, - ) -> Result<()> { + ) -> Result> { require_gte!(peg_limit, -1); require_eq!(max_oracle_staleness_slots, -1); // unimplemented @@ -669,7 +669,7 @@ pub mod mango_v4 { Some(t) => t, None => { msg!("Order is already expired"); - return Ok(()); + return Ok(None); } }; let order = Order { diff --git a/programs/mango-v4/src/state/orderbook/book.rs b/programs/mango-v4/src/state/orderbook/book.rs index 77b6a80d7..dd23e8cd4 100644 --- a/programs/mango-v4/src/state/orderbook/book.rs +++ b/programs/mango-v4/src/state/orderbook/book.rs @@ -51,7 +51,7 @@ impl<'a> Orderbook<'a> { mango_account_pk: &Pubkey, now_ts: u64, mut limit: u8, - ) -> std::result::Result<(), Error> { + ) -> std::result::Result, Error> { let side = order.side; let other_side = side.invert_side(); let market = perp_market; @@ -269,7 +269,11 @@ impl<'a> Orderbook<'a> { )?; } - Ok(()) + if post_target.is_some() { + Ok(Some(order_id)) + } else { + Ok(None) + } } /// Cancels up to `limit` orders that are listed on the mango account for the given perp market. diff --git a/ts/client/src/client.ts b/ts/client/src/client.ts index 87d6e3c18..3398871d0 100644 --- a/ts/client/src/client.ts +++ b/ts/client/src/client.ts @@ -1919,6 +1919,9 @@ export class MangoClient { .rpc(); } + // perpPlaceOrder ix returns an optional, custom order id, + // but, since we use a customer tx sender, this method + // doesn't return it public async perpPlaceOrder( group: Group, mangoAccount: MangoAccount, diff --git a/ts/client/src/mango_v4.ts b/ts/client/src/mango_v4.ts index 9de01da70..20db536c4 100644 --- a/ts/client/src/mango_v4.ts +++ b/ts/client/src/mango_v4.ts @@ -2975,7 +2975,10 @@ export type MangoV4 = { "name": "limit", "type": "u8" } - ] + ], + "returns": { + "option": "u128" + } }, { "name": "perpPlaceOrderPegged", @@ -3070,7 +3073,10 @@ export type MangoV4 = { "name": "maxOracleStalenessSlots", "type": "i32" } - ] + ], + "returns": { + "option": "u128" + } }, { "name": "perpCancelOrder", @@ -10920,7 +10926,10 @@ export const IDL: MangoV4 = { "name": "limit", "type": "u8" } - ] + ], + "returns": { + "option": "u128" + } }, { "name": "perpPlaceOrderPegged", @@ -11015,7 +11024,10 @@ export const IDL: MangoV4 = { "name": "maxOracleStalenessSlots", "type": "i32" } - ] + ], + "returns": { + "option": "u128" + } }, { "name": "perpCancelOrder",