From 2caf5a61bc019c49ed4afe68201dbce12f35db74 Mon Sep 17 00:00:00 2001 From: Andreas Brekken Date: Wed, 16 Oct 2024 08:27:09 +0700 Subject: [PATCH] Add modify order (#58) Allows modifying (replacing) an order See https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#modify-an-order --- src/exchange/actions.rs | 8 ++++++- src/exchange/exchange_client.rs | 42 +++++++++++++++++++++++++++++++-- src/exchange/mod.rs | 2 ++ src/exchange/modify.rs | 13 ++++++++++ 4 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 src/exchange/modify.rs diff --git a/src/exchange/actions.rs b/src/exchange/actions.rs index 1ad9bb7..d389b6d 100644 --- a/src/exchange/actions.rs +++ b/src/exchange/actions.rs @@ -1,4 +1,4 @@ -use crate::exchange::{cancel::CancelRequest, order::OrderRequest}; +use crate::exchange::{cancel::CancelRequest, modify::ModifyRequest, order::OrderRequest}; pub(crate) use ethers::{ abi::{encode, ParamType, Tokenizable}, types::{ @@ -107,6 +107,12 @@ pub struct BulkCancel { pub cancels: Vec, } +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +pub struct BulkModify { + pub modifies: Vec, +} + #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(rename_all = "camelCase")] pub struct BulkCancelCloid { diff --git a/src/exchange/exchange_client.rs b/src/exchange/exchange_client.rs index 1e020b8..b776c4c 100644 --- a/src/exchange/exchange_client.rs +++ b/src/exchange/exchange_client.rs @@ -2,10 +2,11 @@ use crate::signature::sign_typed_data; use crate::{ exchange::{ actions::{ - ApproveAgent, BulkCancel, BulkOrder, SetReferrer, UpdateIsolatedMargin, UpdateLeverage, - UsdSend, + ApproveAgent, BulkCancel, BulkModify, BulkOrder, SetReferrer, UpdateIsolatedMargin, + UpdateLeverage, UsdSend, }, cancel::{CancelRequest, CancelRequestCloid}, + modify::{ClientModifyRequest, ModifyRequest}, ClientCancelRequest, ClientOrderRequest, }, helpers::{generate_random_key, next_nonce, uuid_to_hex_string}, @@ -58,6 +59,7 @@ pub enum Actions { Order(BulkOrder), Cancel(BulkCancel), CancelByCloid(BulkCancelCloid), + BatchModify(BulkModify), ApproveAgent(ApproveAgent), Withdraw3(Withdraw3), SpotUser(SpotUser), @@ -427,6 +429,42 @@ impl ExchangeClient { self.post(action, signature, timestamp).await } + pub async fn modify( + &self, + modify: ClientModifyRequest, + wallet: Option<&LocalWallet>, + ) -> Result { + self.bulk_modify(vec![modify], wallet).await + } + + pub async fn bulk_modify( + &self, + modifies: Vec, + wallet: Option<&LocalWallet>, + ) -> Result { + let wallet = wallet.unwrap_or(&self.wallet); + let timestamp = next_nonce(); + + let mut transformed_modifies = Vec::new(); + for modify in modifies.into_iter() { + transformed_modifies.push(ModifyRequest { + oid: modify.oid, + order: modify.order.convert(&self.coin_to_asset)?, + }); + } + + let action = Actions::BatchModify(BulkModify { + modifies: transformed_modifies, + }); + let connection_id = action.hash(timestamp, self.vault_address)?; + + let action = serde_json::to_value(&action).map_err(|e| Error::JsonParse(e.to_string()))?; + let is_mainnet = self.http_client.is_mainnet(); + let signature = sign_l1_action(wallet, connection_id, is_mainnet)?; + + self.post(action, signature, timestamp).await + } + pub async fn cancel_by_cloid( &self, cancel: ClientCancelRequestCloid, diff --git a/src/exchange/mod.rs b/src/exchange/mod.rs index 97f8833..97a192a 100644 --- a/src/exchange/mod.rs +++ b/src/exchange/mod.rs @@ -2,12 +2,14 @@ mod actions; mod cancel; mod exchange_client; mod exchange_responses; +mod modify; mod order; pub use actions::*; pub use cancel::{ClientCancelRequest, ClientCancelRequestCloid}; pub use exchange_client::*; pub use exchange_responses::*; +pub use modify::{ClientModifyRequest, ModifyRequest}; pub use order::{ ClientLimit, ClientOrder, ClientOrderRequest, ClientTrigger, MarketCloseParams, MarketOrderParams, Order, diff --git a/src/exchange/modify.rs b/src/exchange/modify.rs new file mode 100644 index 0000000..078fd29 --- /dev/null +++ b/src/exchange/modify.rs @@ -0,0 +1,13 @@ +use super::{order::OrderRequest, ClientOrderRequest}; +use serde::{Deserialize, Serialize}; + +pub struct ClientModifyRequest { + pub oid: u64, + pub order: ClientOrderRequest, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ModifyRequest { + pub oid: u64, + pub order: OrderRequest, +}