@@ -16,8 +16,13 @@ import {
16
16
FuturesPotentialTradeDetails ,
17
17
FuturesVolumes ,
18
18
PositionSide ,
19
+ PotentialTradeStatus ,
19
20
} from 'sdk/types/futures' ;
20
- import { calculateCrossMarginFee , serializePotentialTrade } from 'sdk/utils/futures' ;
21
+ import {
22
+ calculateCrossMarginFee ,
23
+ getTradeStatusMessage ,
24
+ serializePotentialTrade ,
25
+ } from 'sdk/utils/futures' ;
21
26
import { unserializeGasPrice } from 'state/app/helpers' ;
22
27
import { setOpenModal } from 'state/app/reducer' ;
23
28
import { fetchBalances } from 'state/balances/actions' ;
@@ -46,7 +51,7 @@ import {
46
51
handleIsolatedMarginPreviewError ,
47
52
handleTransactionError ,
48
53
setCrossMarginFees ,
49
- setCrossMarginLeverage ,
54
+ setCrossMarginLeverageForAsset ,
50
55
setCrossMarginMarginDelta ,
51
56
setCrossMarginOrderPrice ,
52
57
setCrossMarginOrderPriceInvalidLabel ,
@@ -66,6 +71,7 @@ import {
66
71
} from './reducer' ;
67
72
import {
68
73
selectCrossMarginAccount ,
74
+ selectCrossMarginBalanceInfo ,
69
75
selectCrossMarginMarginDelta ,
70
76
selectCrossMarginOrderPrice ,
71
77
selectCrossMarginSelectedLeverage ,
@@ -81,6 +87,7 @@ import {
81
87
selectLeverageSide ,
82
88
selectMarketAssetRate ,
83
89
selectMarketInfo ,
90
+ selectMarketKey ,
84
91
selectOrderType ,
85
92
selectPosition ,
86
93
selectTradeSizeInputs ,
@@ -304,6 +311,8 @@ export const fetchCrossMarginTradePreview = createAsyncThunk<
304
311
async ( inputs , { dispatch, getState, extra : { sdk } } ) => {
305
312
const marketInfo = selectMarketInfo ( getState ( ) ) ;
306
313
const account = selectFuturesAccount ( getState ( ) ) ;
314
+ const marginDelta = selectCrossMarginMarginDelta ( getState ( ) ) ;
315
+ const { freeMargin } = selectCrossMarginBalanceInfo ( getState ( ) ) ;
307
316
if ( ! account ) throw new Error ( 'No account to fetch orders' ) ;
308
317
if ( ! marketInfo ) throw new Error ( 'No market info' ) ;
309
318
const leverageSide = selectLeverageSide ( getState ( ) ) ;
@@ -314,6 +323,14 @@ export const fetchCrossMarginTradePreview = createAsyncThunk<
314
323
marketInfo . market ,
315
324
{ ...inputs , leverageSide }
316
325
) ;
326
+ if ( marginDelta . gt ( freeMargin ) && preview . status === 0 ) {
327
+ // Show insufficient margin message
328
+ preview . status = PotentialTradeStatus . INSUFFICIENT_FREE_MARGIN ;
329
+ preview . statusMessage = getTradeStatusMessage (
330
+ PotentialTradeStatus . INSUFFICIENT_FREE_MARGIN
331
+ ) ;
332
+ preview . showStatus = true ;
333
+ }
317
334
return serializePotentialTrade ( preview ) ;
318
335
} catch ( err ) {
319
336
dispatch ( handleCrossMarginPreviewError ( err . message ) ) ;
@@ -368,6 +385,7 @@ export const editCrossMarginSize = (size: string, currencyType: 'usd' | 'native'
368
385
const stageCrossMarginSizeChange = createAsyncThunk < void , void , ThunkConfig > (
369
386
'futures/stageCrossMarginSizeChange' ,
370
387
async ( _ , { dispatch, getState } ) => {
388
+ dispatch ( calculateCrossMarginFees ( ) ) ;
371
389
const tradeInputs = selectCrossMarginTradeInputs ( getState ( ) ) ;
372
390
const fees = selectCrossMarginTradeFees ( getState ( ) ) ;
373
391
const rate = selectMarketAssetRate ( getState ( ) ) ;
@@ -388,32 +406,29 @@ const stageCrossMarginSizeChange = createAsyncThunk<void, void, ThunkConfig>(
388
406
)
389
407
: wei ( 0 ) ;
390
408
dispatch ( setCrossMarginMarginDelta ( marginDelta . toString ( ) ) ) ;
391
- dispatch ( calculateCrossMarginFees ( ) ) ;
392
409
debouncedPrepareCrossMarginTradePreview ( dispatch ) ;
393
410
}
394
411
) ;
395
412
396
413
export const editExistingPositionLeverage = createAsyncThunk < void , string , ThunkConfig > (
397
414
'futures/editExistingPositionLeverage' ,
398
415
async ( leverage , { dispatch, getState } ) => {
399
- const tradeInputs = selectCrossMarginTradeInputs ( getState ( ) ) ;
416
+ dispatch ( calculateCrossMarginFees ( ) ) ;
400
417
const fees = selectCrossMarginTradeFees ( getState ( ) ) ;
401
418
const position = selectPosition ( getState ( ) ) ;
402
419
const rate = selectMarketAssetRate ( getState ( ) ) ;
403
420
const price = selectCrossMarginOrderPrice ( getState ( ) ) ;
404
- dispatch ( setCrossMarginLeverage ( leverage ) ) ;
405
421
const marginDelta = await calculateMarginDelta (
406
422
{
407
- susdSizeDelta : tradeInputs . susdSizeDelta ,
408
- nativeSizeDelta : tradeInputs . nativeSizeDelta ,
423
+ susdSizeDelta : wei ( 0 ) ,
424
+ nativeSizeDelta : wei ( 0 ) ,
409
425
price : price ? wei ( price ) : rate ,
410
426
leverage : wei ( leverage ) ,
411
427
} ,
412
428
fees ,
413
429
position
414
430
) ;
415
431
dispatch ( setCrossMarginMarginDelta ( marginDelta . toString ( ) ) ) ;
416
- dispatch ( calculateCrossMarginFees ( ) ) ;
417
432
debouncedPrepareCrossMarginTradePreview ( dispatch ) ;
418
433
}
419
434
) ;
@@ -471,6 +486,11 @@ export const changeLeverageSide = (side: PositionSide): AppThunk => (dispatch, g
471
486
dispatch ( editTradeSizeInput ( nativeSizeString , 'native' ) ) ;
472
487
} ;
473
488
489
+ export const setCrossMarginLeverage = ( leverage : string ) : AppThunk => ( dispatch , getState ) => {
490
+ const marketKey = selectMarketKey ( getState ( ) ) ;
491
+ dispatch ( setCrossMarginLeverageForAsset ( { marketKey : marketKey , leverage : leverage } ) ) ;
492
+ } ;
493
+
474
494
export const debouncedPrepareCrossMarginTradePreview = debounce ( ( dispatch ) => {
475
495
dispatch ( prepareCrossMarginTradePreview ( ) ) ;
476
496
} , 500 ) ;
0 commit comments