@@ -14,11 +14,12 @@ type IExchangeAPI interface {
14
14
// Open orders
15
15
BulkOrders (requests []OrderRequest , grouping Grouping ) (* PlaceOrderResponse , error )
16
16
Order (request OrderRequest , grouping Grouping ) (* PlaceOrderResponse , error )
17
- MarketOrder (coin string , size float64 , slippage * float64 ) (* PlaceOrderResponse , error )
18
- LimitOrder (orderType string , coin string , size float64 , px float64 , isBuy bool , reduceOnly bool ) (* PlaceOrderResponse , error )
17
+ MarketOrder (coin string , size float64 , slippage * float64 , clientOID ... string ) (* PlaceOrderResponse , error )
18
+ LimitOrder (orderType string , coin string , size float64 , px float64 , isBuy bool , reduceOnly bool , clientOID ... string ) (* PlaceOrderResponse , error )
19
19
20
20
// Order management
21
21
CancelOrderByOID (coin string , orderID int ) (any , error )
22
+ CancelOrderByCloid (coin string , clientOID string ) (any , error )
22
23
BulkCancelOrders (cancels []CancelOidWire ) (any , error )
23
24
CancelAllOrdersByCoin (coin string ) (any , error )
24
25
CancelAllOrders () (any , error )
@@ -98,7 +99,7 @@ func (api *ExchangeAPI) SlippagePriceSpot(coin string, isBuy bool, slippage floa
98
99
// MarketOrder("BTC", 0.1, nil) // Buy 0.1 BTC
99
100
// MarketOrder("BTC", -0.1, nil) // Sell 0.1 BTC
100
101
// MarketOrder("BTC", 0.1, &slippage) // Buy 0.1 BTC with slippage
101
- func (api * ExchangeAPI ) MarketOrder (coin string , size float64 , slippage * float64 ) (* PlaceOrderResponse , error ) {
102
+ func (api * ExchangeAPI ) MarketOrder (coin string , size float64 , slippage * float64 , clientOID ... string ) (* PlaceOrderResponse , error ) {
102
103
slpg := GetSlippage (slippage )
103
104
isBuy := IsBuy (size )
104
105
finalPx := api .SlippagePrice (coin , isBuy , slpg )
@@ -115,6 +116,9 @@ func (api *ExchangeAPI) MarketOrder(coin string, size float64, slippage *float64
115
116
OrderType : orderType ,
116
117
ReduceOnly : false ,
117
118
}
119
+ if len (clientOID ) > 0 {
120
+ orderRequest .Cloid = clientOID [0 ]
121
+ }
118
122
return api .Order (orderRequest , GroupingNa )
119
123
}
120
124
@@ -150,7 +154,7 @@ func (api *ExchangeAPI) MarketOrderSpot(coin string, size float64, slippage *flo
150
154
// Order type can be Gtc, Ioc, Alo.
151
155
// Size determines the amount of the coin to buy/sell.
152
156
// See the constants TifGtc, TifIoc, TifAlo.
153
- func (api * ExchangeAPI ) LimitOrder (orderType string , coin string , size float64 , px float64 , reduceOnly bool ) (* PlaceOrderResponse , error ) {
157
+ func (api * ExchangeAPI ) LimitOrder (orderType string , coin string , size float64 , px float64 , reduceOnly bool , clientOID ... string ) (* PlaceOrderResponse , error ) {
154
158
// check if the order type is valid
155
159
if orderType != TifGtc && orderType != TifIoc && orderType != TifAlo {
156
160
return nil , APIError {Message : fmt .Sprintf ("Invalid order type: %s. Available types: %s, %s, %s" , orderType , TifGtc , TifIoc , TifAlo )}
@@ -168,6 +172,9 @@ func (api *ExchangeAPI) LimitOrder(orderType string, coin string, size float64,
168
172
OrderType : orderTypeZ ,
169
173
ReduceOnly : reduceOnly ,
170
174
}
175
+ if len (clientOID ) > 0 {
176
+ orderRequest .Cloid = clientOID [0 ]
177
+ }
171
178
return api .Order (orderRequest , GroupingNa )
172
179
}
173
180
@@ -304,6 +311,33 @@ func (api *ExchangeAPI) CancelOrderByOID(coin string, orderID int64) (*CancelOrd
304
311
return api .BulkCancelOrders ([]CancelOidWire {{Asset : api .meta [coin ].AssetId , Oid : int (orderID )}})
305
312
}
306
313
314
+ // Cancel exact order by Client Order Id
315
+ // https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s-by-cloid
316
+ func (api * ExchangeAPI ) CancelOrderByCloid (coin string , clientOID string ) (* CancelOrderResponse , error ) {
317
+ timestamp := GetNonce ()
318
+ action := CancelCloidOrderAction {
319
+ Type : "cancelByCloid" ,
320
+ Cancels : []CancelCloidWire {
321
+ {
322
+ Asset : api .meta [coin ].AssetId ,
323
+ Cloid : clientOID ,
324
+ },
325
+ },
326
+ }
327
+ v , r , s , err := api .SignL1Action (action , timestamp )
328
+ if err != nil {
329
+ api .debug ("Error signing L1 action: %s" , err )
330
+ return nil , err
331
+ }
332
+ request := ExchangeRequest {
333
+ Action : action ,
334
+ Nonce : timestamp ,
335
+ Signature : ToTypedSig (r , s , v ),
336
+ VaultAddress : nil ,
337
+ }
338
+ return MakeUniversalRequest [CancelOrderResponse ](api , request )
339
+ }
340
+
307
341
// Cancel all orders for a given coin
308
342
func (api * ExchangeAPI ) CancelAllOrdersByCoin (coin string ) (* CancelOrderResponse , error ) {
309
343
orders , err := api .infoAPI .GetOpenOrders (api .AccountAddress ())
0 commit comments