@orderly.network/hooks 1.0.29 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +166 -48
- package/dist/index.d.ts +166 -48
- package/dist/index.js +1253 -344
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1254 -348
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -10
package/dist/index.mjs
CHANGED
|
@@ -6,23 +6,23 @@ import useSWRMutation from 'swr/mutation';
|
|
|
6
6
|
import useConstant4 from 'use-constant';
|
|
7
7
|
export { default as useConstant } from 'use-constant';
|
|
8
8
|
import { SimpleDI, Account, EventEmitter, DefaultConfigStore, LocalStorageStore, EtherAdapter, utils } from '@orderly.network/core';
|
|
9
|
-
import { AccountStatusEnum, OrderStatus, OrderSide, chainsInfoMap, ARBITRUM_TESTNET_CHAINID, ARBITRUM_MAINNET_CHAINID,
|
|
9
|
+
import { OrderType, AccountStatusEnum, SDKError, OrderStatus, OrderSide, chainsInfoMap, TestnetChains, ARBITRUM_TESTNET_CHAINID, ARBITRUM_MAINNET_CHAINID, MaxUint256, DEPOSIT_FEE_RATE, WS_WalletStatusEnum } from '@orderly.network/types';
|
|
10
10
|
import useSWRInfinite, { unstable_serialize } from 'swr/infinite';
|
|
11
11
|
import { useDebouncedCallback } from 'use-debounce';
|
|
12
12
|
export * from 'use-debounce';
|
|
13
13
|
import { jsx } from 'react/jsx-runtime';
|
|
14
|
-
import { Decimal, zero, getPrecisionByNumber, timeConvertString } from '@orderly.network/utils';
|
|
14
|
+
import { Decimal, zero, getPrecisionByNumber, timeConvertString, isTestnet } from '@orderly.network/utils';
|
|
15
15
|
import useSWRSubscription from 'swr/subscription';
|
|
16
|
-
import { pathOr, propOr, compose, head, prop, mergeDeepRight, pick, min } from 'ramda';
|
|
16
|
+
import { pathOr, propOr, compose, head, prop, mergeDeepRight, pick, includes, omit, min } from 'ramda';
|
|
17
17
|
import { positions, account, order } from '@orderly.network/perp';
|
|
18
18
|
import { createClient } from '@layerzerolabs/scan-client';
|
|
19
19
|
|
|
20
20
|
// src/version.ts
|
|
21
21
|
if (typeof window !== "undefined") {
|
|
22
22
|
window.__ORDERLY_VERSION__ = window.__ORDERLY_VERSION__ || {};
|
|
23
|
-
window.__ORDERLY_VERSION__["@orderly.network/hooks"] = "1.0
|
|
23
|
+
window.__ORDERLY_VERSION__["@orderly.network/hooks"] = "1.1.0";
|
|
24
24
|
}
|
|
25
|
-
var version_default = "1.0
|
|
25
|
+
var version_default = "1.1.0";
|
|
26
26
|
var fetcher = (url, init = {}, queryOptions) => get(url, init, queryOptions?.formatter);
|
|
27
27
|
var OrderlyContext = createContext({
|
|
28
28
|
// configStore: new MemoryConfigStore(),
|
|
@@ -193,7 +193,6 @@ var signatureMiddleware = (useSWRNext) => {
|
|
|
193
193
|
};
|
|
194
194
|
return useSWRNext(key, extendedFetcher, config);
|
|
195
195
|
} catch (e) {
|
|
196
|
-
console.error("signature error:", e);
|
|
197
196
|
throw e;
|
|
198
197
|
}
|
|
199
198
|
};
|
|
@@ -338,23 +337,16 @@ function useSessionStorage(key, initialValue) {
|
|
|
338
337
|
const item = window.sessionStorage.getItem(key);
|
|
339
338
|
return item ? parseJSON(item) : initialValue;
|
|
340
339
|
} catch (error) {
|
|
341
|
-
console.warn(`Error reading sessionStorage key \u201C${key}\u201D:`, error);
|
|
342
340
|
return initialValue;
|
|
343
341
|
}
|
|
344
342
|
}, [initialValue, key]);
|
|
345
343
|
const [storedValue, setStoredValue] = useState(readValue);
|
|
346
344
|
const setValue = (value) => {
|
|
347
|
-
if (typeof window == "undefined") {
|
|
348
|
-
console.warn(
|
|
349
|
-
`Tried setting sessionStorage key \u201C${key}\u201D even though environment is not a client`
|
|
350
|
-
);
|
|
351
|
-
}
|
|
352
345
|
try {
|
|
353
346
|
const newValue = value instanceof Function ? value(storedValue) : value;
|
|
354
347
|
window.sessionStorage.setItem(key, JSON.stringify(newValue));
|
|
355
348
|
setStoredValue(newValue);
|
|
356
349
|
} catch (error) {
|
|
357
|
-
console.warn(`Error setting sessionStorage key \u201C${key}\u201D:`, error);
|
|
358
350
|
}
|
|
359
351
|
};
|
|
360
352
|
useEffect(() => {
|
|
@@ -389,24 +381,18 @@ function useLocalStorage(key, initialValue) {
|
|
|
389
381
|
const item = window.localStorage.getItem(key);
|
|
390
382
|
return item ? parseJSON(item) : initialValue;
|
|
391
383
|
} catch (error) {
|
|
392
|
-
console.warn(`Error reading localStorage key \u201C${key}\u201D:`, error);
|
|
393
384
|
return initialValue;
|
|
394
385
|
}
|
|
395
386
|
}, [initialValue, key]);
|
|
396
387
|
const [storedValue, setStoredValue] = useState(readValue);
|
|
397
388
|
const setValue = useCallback(
|
|
398
389
|
(value) => {
|
|
399
|
-
if (typeof window === "undefined") {
|
|
400
|
-
console.warn(
|
|
401
|
-
`Tried setting localStorage key \u201C${key}\u201D even though environment is not a client`
|
|
402
|
-
);
|
|
403
|
-
}
|
|
404
390
|
try {
|
|
405
391
|
const newValue = value instanceof Function ? value(storedValue) : value;
|
|
406
392
|
window.localStorage.setItem(key, JSON.stringify(newValue));
|
|
393
|
+
window.dispatchEvent(new Event("storage"));
|
|
407
394
|
setStoredValue(() => newValue);
|
|
408
395
|
} catch (error) {
|
|
409
|
-
console.warn(`Error setting localStorage key \u201C${key}\u201D:`, error);
|
|
410
396
|
}
|
|
411
397
|
},
|
|
412
398
|
[storedValue]
|
|
@@ -414,6 +400,18 @@ function useLocalStorage(key, initialValue) {
|
|
|
414
400
|
useEffect(() => {
|
|
415
401
|
setStoredValue(readValue());
|
|
416
402
|
}, []);
|
|
403
|
+
useEffect(() => {
|
|
404
|
+
const handleStorageChange = (event) => {
|
|
405
|
+
if (event?.key && event.key !== key) {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
setStoredValue(readValue());
|
|
409
|
+
};
|
|
410
|
+
window.addEventListener("storage", handleStorageChange);
|
|
411
|
+
return () => {
|
|
412
|
+
window.removeEventListener("storage", handleStorageChange);
|
|
413
|
+
};
|
|
414
|
+
}, [key]);
|
|
417
415
|
return [storedValue, setValue];
|
|
418
416
|
}
|
|
419
417
|
var WS_NAME = "nativeWebsocketClient";
|
|
@@ -451,36 +449,48 @@ var useWS = () => {
|
|
|
451
449
|
});
|
|
452
450
|
return ws;
|
|
453
451
|
};
|
|
454
|
-
var usePrivateDataObserver = () => {
|
|
452
|
+
var usePrivateDataObserver = (options) => {
|
|
455
453
|
const ws = useWS();
|
|
456
454
|
const { mutate: mutate2 } = useSWRConfig();
|
|
457
455
|
const ee = useEventEmitter();
|
|
458
456
|
const { state } = useAccount();
|
|
459
|
-
const updateOrders = useDebouncedCallback(() => {
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
state.accountId
|
|
470
|
-
])
|
|
471
|
-
);
|
|
457
|
+
const updateOrders = useDebouncedCallback((data) => {
|
|
458
|
+
const map = options.getKeysMap("orders");
|
|
459
|
+
map.forEach((getKey, key) => {
|
|
460
|
+
mutate2(
|
|
461
|
+
unstable_serialize((index, prevData) => [
|
|
462
|
+
getKey(index, prevData),
|
|
463
|
+
state.accountId
|
|
464
|
+
])
|
|
465
|
+
);
|
|
466
|
+
});
|
|
472
467
|
}, 500);
|
|
473
468
|
useEffect(() => {
|
|
474
469
|
if (!state.accountId)
|
|
475
470
|
return;
|
|
476
471
|
const unsubscribe = ws.privateSubscribe("executionreport", {
|
|
477
472
|
onMessage: (data) => {
|
|
478
|
-
updateOrders();
|
|
473
|
+
updateOrders(data);
|
|
479
474
|
ee.emit("orders:changed", data);
|
|
480
475
|
}
|
|
481
476
|
});
|
|
482
477
|
return () => unsubscribe?.();
|
|
483
478
|
}, [state.accountId]);
|
|
479
|
+
useEffect(() => {
|
|
480
|
+
if (!state.accountId)
|
|
481
|
+
return;
|
|
482
|
+
const unsubscribe = ws.privateSubscribe("algoexecutionreport", {
|
|
483
|
+
onMessage: (data) => {
|
|
484
|
+
updateOrders(data);
|
|
485
|
+
if (Array.isArray(data)) {
|
|
486
|
+
data.forEach((item) => ee.emit("orders:changed", { ...item, status: item.algoStatus }));
|
|
487
|
+
} else {
|
|
488
|
+
ee.emit("orders:changed", { ...data, status: data.algoStatus });
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
return () => unsubscribe?.();
|
|
493
|
+
}, [state.accountId]);
|
|
484
494
|
useEffect(() => {
|
|
485
495
|
if (!state.accountId)
|
|
486
496
|
return;
|
|
@@ -539,15 +549,31 @@ var usePrivateDataObserver = () => {
|
|
|
539
549
|
var DataCenterContext = createContext(
|
|
540
550
|
{}
|
|
541
551
|
);
|
|
552
|
+
var useDataCenterContext = () => useContext(DataCenterContext);
|
|
542
553
|
var DataCenterProvider = ({ children }) => {
|
|
543
554
|
const { error, done } = usePreLoadData();
|
|
544
|
-
|
|
555
|
+
const getKeyHandlerMapRef = useRef(/* @__PURE__ */ new Map());
|
|
556
|
+
usePrivateDataObserver({
|
|
557
|
+
getKeysMap(type) {
|
|
558
|
+
return getKeyHandlerMapRef.current;
|
|
559
|
+
}
|
|
560
|
+
});
|
|
545
561
|
if (error) {
|
|
546
562
|
return /* @__PURE__ */ jsx("div", { children: "Data load failed" });
|
|
547
563
|
}
|
|
548
564
|
if (!done)
|
|
549
565
|
return null;
|
|
550
|
-
return /* @__PURE__ */ jsx(
|
|
566
|
+
return /* @__PURE__ */ jsx(
|
|
567
|
+
DataCenterContext.Provider,
|
|
568
|
+
{
|
|
569
|
+
value: {
|
|
570
|
+
regesterKeyHandler: (key, fun) => {
|
|
571
|
+
getKeyHandlerMapRef.current.set(key, fun);
|
|
572
|
+
}
|
|
573
|
+
},
|
|
574
|
+
children
|
|
575
|
+
}
|
|
576
|
+
);
|
|
551
577
|
};
|
|
552
578
|
var OrderlyConfigProvider = (props) => {
|
|
553
579
|
const [account5, setAccount] = React.useState(null);
|
|
@@ -560,9 +586,6 @@ var OrderlyConfigProvider = (props) => {
|
|
|
560
586
|
enableSwapDeposit,
|
|
561
587
|
contracts
|
|
562
588
|
} = props;
|
|
563
|
-
if (!brokerId && typeof configStore === "undefined") {
|
|
564
|
-
console.error("[OrderlyConfigProvider]: brokerId is required");
|
|
565
|
-
}
|
|
566
589
|
const innerConfigStore = useConstant4(() => {
|
|
567
590
|
return configStore || new DefaultConfigStore({ brokerId, networkId });
|
|
568
591
|
});
|
|
@@ -786,7 +809,7 @@ var reduceItems = (depth, level, data, asks = false) => {
|
|
|
786
809
|
const result = [];
|
|
787
810
|
if (typeof depth !== "undefined") {
|
|
788
811
|
const prices = /* @__PURE__ */ new Map();
|
|
789
|
-
for (let i = 0; i < data.length; i++) {
|
|
812
|
+
for (let i = 0; i < min(level, data.length); i++) {
|
|
790
813
|
const [price, quantity] = data[i];
|
|
791
814
|
if (isNaN(price) || isNaN(quantity))
|
|
792
815
|
continue;
|
|
@@ -821,7 +844,8 @@ var reduceItems = (depth, level, data, asks = false) => {
|
|
|
821
844
|
if (isNaN(price) || isNaN(quantity))
|
|
822
845
|
continue;
|
|
823
846
|
const newQuantity = new Decimal(quantity).add(result.length > 0 ? result[result.length - 1][2] : 0).toNumber();
|
|
824
|
-
result.
|
|
847
|
+
const newAmount = new Decimal(quantity * price).add(result.length > 0 ? result[result.length - 1][3] : 0).toNumber();
|
|
848
|
+
result.push([price, quantity, newQuantity, newAmount]);
|
|
825
849
|
}
|
|
826
850
|
return result;
|
|
827
851
|
};
|
|
@@ -852,9 +876,11 @@ var reduceOrderbook = (depth, level, data) => {
|
|
|
852
876
|
}
|
|
853
877
|
}
|
|
854
878
|
asks = asks.reverse();
|
|
879
|
+
asks = asks.length < level ? paddingFn(level - asks.length).concat(asks) : asks;
|
|
880
|
+
bids = bids.length < level ? bids.concat(paddingFn(level - bids.length)) : bids;
|
|
855
881
|
return {
|
|
856
|
-
asks
|
|
857
|
-
bids
|
|
882
|
+
asks,
|
|
883
|
+
bids
|
|
858
884
|
};
|
|
859
885
|
};
|
|
860
886
|
var mergeItems = (data, update) => {
|
|
@@ -894,7 +920,7 @@ var mergeOrderbook = (data, update) => {
|
|
|
894
920
|
var INIT_DATA = { asks: [], bids: [] };
|
|
895
921
|
var useOrderbookStream = (symbol, initial = INIT_DATA, options) => {
|
|
896
922
|
if (!symbol) {
|
|
897
|
-
throw new
|
|
923
|
+
throw new SDKError("useOrderbookStream requires a symbol");
|
|
898
924
|
}
|
|
899
925
|
const level = options?.level ?? 10;
|
|
900
926
|
const [requestData, setRequestData] = useState(null);
|
|
@@ -1002,6 +1028,12 @@ var useOrderbookStream = (symbol, initial = INIT_DATA, options) => {
|
|
|
1002
1028
|
asks: [...data.asks],
|
|
1003
1029
|
bids: [...data.bids]
|
|
1004
1030
|
});
|
|
1031
|
+
useEffect(() => {
|
|
1032
|
+
eventEmitter.emit("orderbook:update", [
|
|
1033
|
+
reducedData.asks[0][0],
|
|
1034
|
+
reducedData.bids[0][0]
|
|
1035
|
+
]);
|
|
1036
|
+
}, [reducedData.asks[0][0], reducedData.bids[0][0]]);
|
|
1005
1037
|
return [
|
|
1006
1038
|
{
|
|
1007
1039
|
asks: reducedData.asks.slice(-level),
|
|
@@ -1012,13 +1044,28 @@ var useOrderbookStream = (symbol, initial = INIT_DATA, options) => {
|
|
|
1012
1044
|
{ onDepthChange, depth, allDepths: depths, isLoading, onItemClick }
|
|
1013
1045
|
];
|
|
1014
1046
|
};
|
|
1015
|
-
var needNumberOnlyFields = [
|
|
1047
|
+
var needNumberOnlyFields = [
|
|
1048
|
+
"order_quantity",
|
|
1049
|
+
"order_price",
|
|
1050
|
+
"total"
|
|
1051
|
+
];
|
|
1052
|
+
var cleanStringStyle = (str) => {
|
|
1053
|
+
if (typeof str !== "string") {
|
|
1054
|
+
str = str.toString();
|
|
1055
|
+
}
|
|
1056
|
+
str = str.replace(/,/g, "");
|
|
1057
|
+
str = str.replace(/[^\d.]/g, "").replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
|
|
1058
|
+
return str;
|
|
1059
|
+
};
|
|
1016
1060
|
function baseInputHandle(inputs) {
|
|
1017
1061
|
let [values, input, value, markPrice, config] = inputs;
|
|
1062
|
+
needNumberOnlyFields.forEach((field) => {
|
|
1063
|
+
if (typeof values[field] !== "undefined") {
|
|
1064
|
+
values[field] = cleanStringStyle(values[field]);
|
|
1065
|
+
}
|
|
1066
|
+
});
|
|
1018
1067
|
if (needNumberOnlyFields.includes(input)) {
|
|
1019
|
-
value = value
|
|
1020
|
-
value = value.replace(/,/g, "");
|
|
1021
|
-
value = value.replace(/[^\d.]/g, "");
|
|
1068
|
+
value = cleanStringStyle(value);
|
|
1022
1069
|
}
|
|
1023
1070
|
return [
|
|
1024
1071
|
{
|
|
@@ -1048,15 +1095,23 @@ function priceInputHandle(inputs) {
|
|
|
1048
1095
|
values.order_price = price.toDecimalPlaces(config.quoteDP).toString();
|
|
1049
1096
|
}
|
|
1050
1097
|
price.toDecimalPlaces(Math.min(priceDP, config.quoteDP));
|
|
1051
|
-
if (!values.order_quantity) {
|
|
1098
|
+
if (!values.order_quantity && !values.total) {
|
|
1052
1099
|
return [values, input, value, markPrice, config];
|
|
1053
1100
|
}
|
|
1054
|
-
const
|
|
1101
|
+
const newValue = {
|
|
1102
|
+
...values
|
|
1103
|
+
};
|
|
1104
|
+
if (values.order_quantity) {
|
|
1105
|
+
newValue.total = price.mul(values.order_quantity).todp(2).toString();
|
|
1106
|
+
} else if (values.total) {
|
|
1107
|
+
newValue.order_quantity = new Decimal(values.total).div(price).todp(config.baseDP).toString();
|
|
1108
|
+
}
|
|
1055
1109
|
return [
|
|
1056
|
-
{
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
},
|
|
1110
|
+
// {
|
|
1111
|
+
// ...values,
|
|
1112
|
+
// total: total.todp(2).toString(),
|
|
1113
|
+
// },
|
|
1114
|
+
newValue,
|
|
1060
1115
|
input,
|
|
1061
1116
|
value,
|
|
1062
1117
|
markPrice,
|
|
@@ -1074,11 +1129,11 @@ function quantityInputHandle(inputs) {
|
|
|
1074
1129
|
quantity = quantity.toDecimalPlaces(config.baseDP);
|
|
1075
1130
|
values.order_quantity = quantity.toNumber();
|
|
1076
1131
|
}
|
|
1077
|
-
if (values.order_type === OrderType.MARKET) {
|
|
1132
|
+
if (values.order_type === OrderType.MARKET || values.order_type === OrderType.STOP_MARKET) {
|
|
1078
1133
|
const price = markPrice;
|
|
1079
1134
|
values.total = quantity.mul(price).todp(2).toNumber();
|
|
1080
1135
|
}
|
|
1081
|
-
if (values.order_type === OrderType.LIMIT) {
|
|
1136
|
+
if (values.order_type === OrderType.LIMIT || values.order_type === OrderType.STOP_LIMIT) {
|
|
1082
1137
|
if (values.order_price) {
|
|
1083
1138
|
const price = Number(values.order_price);
|
|
1084
1139
|
const total = quantity.mul(price);
|
|
@@ -1104,7 +1159,7 @@ function totalInputHandle(inputs) {
|
|
|
1104
1159
|
return [{ ...values, order_quantity: "" }, input, value, markPrice, config];
|
|
1105
1160
|
}
|
|
1106
1161
|
let price = markPrice;
|
|
1107
|
-
if (values.order_type === OrderType.LIMIT && !!values.order_price) {
|
|
1162
|
+
if ((values.order_type === OrderType.LIMIT || values.order_type === OrderType.STOP_LIMIT) && !!values.order_price) {
|
|
1108
1163
|
price = Number(values.order_price);
|
|
1109
1164
|
}
|
|
1110
1165
|
let total = new Decimal(value);
|
|
@@ -1212,6 +1267,60 @@ var parseHolding = (holding, markPrices) => {
|
|
|
1212
1267
|
});
|
|
1213
1268
|
return [USDC_holding, nonUSDC];
|
|
1214
1269
|
};
|
|
1270
|
+
var useMarketsStream = () => {
|
|
1271
|
+
const ws = useWS();
|
|
1272
|
+
const { data: futures } = useQuery(`/v1/public/futures`, {
|
|
1273
|
+
revalidateOnFocus: false
|
|
1274
|
+
});
|
|
1275
|
+
const { data: tickers } = useSWRSubscription("tickers", (_, { next }) => {
|
|
1276
|
+
const unsubscribe = ws.subscribe(
|
|
1277
|
+
// { event: "subscribe", topic: "markprices" },
|
|
1278
|
+
"tickers",
|
|
1279
|
+
{
|
|
1280
|
+
onMessage: (message) => {
|
|
1281
|
+
next(null, message);
|
|
1282
|
+
}
|
|
1283
|
+
// onUnsubscribe: () => {
|
|
1284
|
+
// return "markprices";
|
|
1285
|
+
// },
|
|
1286
|
+
// onError: (error: any) => {
|
|
1287
|
+
//
|
|
1288
|
+
// },
|
|
1289
|
+
}
|
|
1290
|
+
);
|
|
1291
|
+
return () => {
|
|
1292
|
+
unsubscribe?.();
|
|
1293
|
+
};
|
|
1294
|
+
});
|
|
1295
|
+
const value = useMemo(() => {
|
|
1296
|
+
if (!futures)
|
|
1297
|
+
return null;
|
|
1298
|
+
if (!tickers)
|
|
1299
|
+
return futures;
|
|
1300
|
+
return futures.map((item) => {
|
|
1301
|
+
const ticker = tickers.find(
|
|
1302
|
+
(t) => t.symbol === item.symbol
|
|
1303
|
+
);
|
|
1304
|
+
if (ticker) {
|
|
1305
|
+
const data = {
|
|
1306
|
+
...item,
|
|
1307
|
+
["24h_close"]: ticker.close,
|
|
1308
|
+
["24h_open"]: ticker.open,
|
|
1309
|
+
["24h_volumn"]: ticker.volume,
|
|
1310
|
+
change: 0
|
|
1311
|
+
};
|
|
1312
|
+
if (ticker.close !== void 0 && ticker.open !== void 0) {
|
|
1313
|
+
data["change"] = new Decimal(ticker.close).minus(ticker.open).div(ticker.open).toNumber();
|
|
1314
|
+
}
|
|
1315
|
+
return data;
|
|
1316
|
+
}
|
|
1317
|
+
return item;
|
|
1318
|
+
});
|
|
1319
|
+
}, [futures, tickers]);
|
|
1320
|
+
return { data: value };
|
|
1321
|
+
};
|
|
1322
|
+
|
|
1323
|
+
// src/orderly/usePositionStream.ts
|
|
1215
1324
|
var usePositionStream = (symbol, options) => {
|
|
1216
1325
|
const symbolInfo = useSymbolsInfo();
|
|
1217
1326
|
const { data: accountInfo } = usePrivateQuery("/v1/client/info");
|
|
@@ -1227,7 +1336,7 @@ var usePositionStream = (symbol, options) => {
|
|
|
1227
1336
|
const {
|
|
1228
1337
|
data,
|
|
1229
1338
|
error,
|
|
1230
|
-
mutate:
|
|
1339
|
+
mutate: refreshPositions
|
|
1231
1340
|
} = usePrivateQuery(`/v1/positions`, {
|
|
1232
1341
|
// revalidateOnFocus: false,
|
|
1233
1342
|
// revalidateOnReconnect: false,
|
|
@@ -1240,6 +1349,20 @@ var usePositionStream = (symbol, options) => {
|
|
|
1240
1349
|
}
|
|
1241
1350
|
});
|
|
1242
1351
|
const { data: markPrices } = useMarkPricesStream();
|
|
1352
|
+
const [priceMode, setPriceMode] = useState(options?.calcMode || "markPrice");
|
|
1353
|
+
useEffect(() => {
|
|
1354
|
+
if (options?.calcMode && priceMode !== options?.calcMode) {
|
|
1355
|
+
setPriceMode(options?.calcMode);
|
|
1356
|
+
}
|
|
1357
|
+
}, [options?.calcMode]);
|
|
1358
|
+
const { data: tickers } = useMarketsStream();
|
|
1359
|
+
const tickerPrices = useMemo(() => {
|
|
1360
|
+
const data2 = /* @__PURE__ */ Object.create(null);
|
|
1361
|
+
tickers?.forEach((item) => {
|
|
1362
|
+
data2[item.symbol] = item["24h_close"];
|
|
1363
|
+
});
|
|
1364
|
+
return data2;
|
|
1365
|
+
}, [tickers]);
|
|
1243
1366
|
const formatedPositions = useMemo(() => {
|
|
1244
1367
|
if (!data?.rows || !symbolInfo || !accountInfo)
|
|
1245
1368
|
return null;
|
|
@@ -1248,6 +1371,11 @@ var usePositionStream = (symbol, options) => {
|
|
|
1248
1371
|
});
|
|
1249
1372
|
let unrealPnL_total = zero, notional_total = zero, unsettlementPnL_total = zero;
|
|
1250
1373
|
const formatted = filteredData.map((item) => {
|
|
1374
|
+
const unRealizedPrice = propOr(
|
|
1375
|
+
item.mark_price,
|
|
1376
|
+
item.symbol,
|
|
1377
|
+
priceMode === "markPrice" ? markPrices : tickerPrices
|
|
1378
|
+
);
|
|
1251
1379
|
const price = propOr(
|
|
1252
1380
|
item.mark_price,
|
|
1253
1381
|
item.symbol,
|
|
@@ -1257,8 +1385,8 @@ var usePositionStream = (symbol, options) => {
|
|
|
1257
1385
|
const notional = positions.notional(item.position_qty, price);
|
|
1258
1386
|
const unrealPnl = positions.unrealizedPnL({
|
|
1259
1387
|
qty: item.position_qty,
|
|
1260
|
-
openPrice: item
|
|
1261
|
-
markPrice:
|
|
1388
|
+
openPrice: item?.average_open_price,
|
|
1389
|
+
markPrice: unRealizedPrice
|
|
1262
1390
|
});
|
|
1263
1391
|
const imr = account.IMR({
|
|
1264
1392
|
maxLeverage: accountInfo.max_leverage,
|
|
@@ -1305,7 +1433,16 @@ var usePositionStream = (symbol, options) => {
|
|
|
1305
1433
|
unsettledPnL: unsettlementPnL_total.toNumber()
|
|
1306
1434
|
}
|
|
1307
1435
|
];
|
|
1308
|
-
}, [
|
|
1436
|
+
}, [
|
|
1437
|
+
data?.rows,
|
|
1438
|
+
symbolInfo,
|
|
1439
|
+
accountInfo,
|
|
1440
|
+
markPrices,
|
|
1441
|
+
priceMode,
|
|
1442
|
+
tickerPrices,
|
|
1443
|
+
symbol,
|
|
1444
|
+
holding
|
|
1445
|
+
]);
|
|
1309
1446
|
const [totalCollateral, totalValue, totalUnrealizedROI] = useMemo(() => {
|
|
1310
1447
|
if (!holding || !markPrices) {
|
|
1311
1448
|
return [zero, zero, 0];
|
|
@@ -1335,7 +1472,7 @@ var usePositionStream = (symbol, options) => {
|
|
|
1335
1472
|
if (!symbolInfo || !accountInfo)
|
|
1336
1473
|
return formatedPositions[0];
|
|
1337
1474
|
const total = totalCollateral.toNumber();
|
|
1338
|
-
|
|
1475
|
+
let rows = formatedPositions[0].filter((item) => item.position_qty !== 0).map((item) => {
|
|
1339
1476
|
const info = symbolInfo?.[item.symbol];
|
|
1340
1477
|
const MMR = positions.MMR({
|
|
1341
1478
|
baseMMR: info("base_mmr"),
|
|
@@ -1351,15 +1488,29 @@ var usePositionStream = (symbol, options) => {
|
|
|
1351
1488
|
markPrice: item.mark_price,
|
|
1352
1489
|
MMR
|
|
1353
1490
|
}),
|
|
1354
|
-
est_liq_price: positions.liqPrice({
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
}),
|
|
1360
|
-
MMR
|
|
1491
|
+
// est_liq_price: positions.liqPrice({
|
|
1492
|
+
// markPrice: item.mark_price,
|
|
1493
|
+
// totalCollateral: total,
|
|
1494
|
+
// positionQty: item.position_qty,
|
|
1495
|
+
// MMR,
|
|
1496
|
+
// }),
|
|
1497
|
+
mmr: MMR
|
|
1498
|
+
};
|
|
1499
|
+
});
|
|
1500
|
+
rows = rows.map((item) => {
|
|
1501
|
+
const est_liq_price = positions.liqPrice({
|
|
1502
|
+
markPrice: item.mark_price,
|
|
1503
|
+
totalCollateral: total,
|
|
1504
|
+
positionQty: item.position_qty,
|
|
1505
|
+
positions: rows,
|
|
1506
|
+
MMR: item.mmr
|
|
1507
|
+
});
|
|
1508
|
+
return {
|
|
1509
|
+
...item,
|
|
1510
|
+
est_liq_price
|
|
1361
1511
|
};
|
|
1362
1512
|
});
|
|
1513
|
+
return rows;
|
|
1363
1514
|
}, [formatedPositions, symbolInfo, accountInfo, totalCollateral]);
|
|
1364
1515
|
return [
|
|
1365
1516
|
{
|
|
@@ -1378,10 +1529,8 @@ var usePositionStream = (symbol, options) => {
|
|
|
1378
1529
|
loading: false,
|
|
1379
1530
|
// showSymbol,
|
|
1380
1531
|
error,
|
|
1381
|
-
loadMore: () => {
|
|
1382
|
-
|
|
1383
|
-
refresh: () => {
|
|
1384
|
-
}
|
|
1532
|
+
// loadMore: () => {},
|
|
1533
|
+
refresh: refreshPositions
|
|
1385
1534
|
}
|
|
1386
1535
|
];
|
|
1387
1536
|
};
|
|
@@ -1442,6 +1591,7 @@ var useHoldingStream = () => {
|
|
|
1442
1591
|
var useOrderStream = (params) => {
|
|
1443
1592
|
const { status, symbol, side, size = 100 } = params;
|
|
1444
1593
|
const { data: markPrices = {} } = useMarkPricesStream();
|
|
1594
|
+
const { regesterKeyHandler } = useDataCenterContext();
|
|
1445
1595
|
const [
|
|
1446
1596
|
doCancelOrder,
|
|
1447
1597
|
{ error: cancelOrderError, isMutating: cancelMutating }
|
|
@@ -1450,58 +1600,113 @@ var useOrderStream = (params) => {
|
|
|
1450
1600
|
doUpdateOrder,
|
|
1451
1601
|
{ error: updateOrderError, isMutating: updateMutating }
|
|
1452
1602
|
] = useMutation("/v1/order", "PUT");
|
|
1453
|
-
const
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
}
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
},
|
|
1472
|
-
{
|
|
1473
|
-
initialSize: 1,
|
|
1474
|
-
// revalidateFirstPage: false,
|
|
1475
|
-
// onError: (err) => {
|
|
1476
|
-
// console.error("fetch failed::::", err);
|
|
1477
|
-
// },
|
|
1478
|
-
formatter: (data) => data
|
|
1603
|
+
const [
|
|
1604
|
+
doCanceAlgolOrder,
|
|
1605
|
+
{ error: cancelAlgoOrderError, isMutating: cancelAlgoMutating }
|
|
1606
|
+
] = useMutation("/v1/algo/order", "DELETE");
|
|
1607
|
+
const [
|
|
1608
|
+
doUpdateAlgoOrder,
|
|
1609
|
+
{ error: updateAlgoOrderError, isMutating: updateAlgoMutating }
|
|
1610
|
+
] = useMutation("/v1/algo/order", "PUT");
|
|
1611
|
+
const getKey = (pageIndex, previousPageData) => {
|
|
1612
|
+
if (previousPageData && !previousPageData.rows?.length)
|
|
1613
|
+
return null;
|
|
1614
|
+
const search = new URLSearchParams([
|
|
1615
|
+
["size", size.toString()],
|
|
1616
|
+
["page", `${pageIndex + 1}`],
|
|
1617
|
+
["source_type", "ALL"]
|
|
1618
|
+
]);
|
|
1619
|
+
if (status) {
|
|
1620
|
+
search.set(`status`, status);
|
|
1479
1621
|
}
|
|
1480
|
-
|
|
1481
|
-
|
|
1622
|
+
if (symbol) {
|
|
1623
|
+
search.set(`symbol`, symbol);
|
|
1624
|
+
}
|
|
1625
|
+
if (side) {
|
|
1626
|
+
search.set(`side`, side);
|
|
1627
|
+
}
|
|
1628
|
+
return `/v1/orders?${search.toString()}`;
|
|
1629
|
+
};
|
|
1630
|
+
useEffect(() => {
|
|
1631
|
+
const key = `orders:${status}:${symbol}:${side}`;
|
|
1632
|
+
regesterKeyHandler(key, getKey);
|
|
1633
|
+
}, [status, symbol, side]);
|
|
1634
|
+
const ordersResponse = usePrivateInfiniteQuery(getKey, {
|
|
1635
|
+
initialSize: 1,
|
|
1636
|
+
// revalidateFirstPage: false,
|
|
1637
|
+
// onError: (err) => {
|
|
1638
|
+
// console.error("fetch failed::::", err);
|
|
1639
|
+
// },
|
|
1640
|
+
formatter: (data) => data
|
|
1641
|
+
});
|
|
1642
|
+
const flattenOrders = useMemo(() => {
|
|
1482
1643
|
if (!ordersResponse.data) {
|
|
1483
1644
|
return null;
|
|
1484
1645
|
}
|
|
1485
|
-
return ordersResponse.data?.map((item) => item.rows)?.flat()
|
|
1646
|
+
return ordersResponse.data?.map((item) => item.rows)?.flat();
|
|
1647
|
+
}, [ordersResponse.data]);
|
|
1648
|
+
const orders = useMemo(() => {
|
|
1649
|
+
if (!flattenOrders) {
|
|
1650
|
+
return null;
|
|
1651
|
+
}
|
|
1652
|
+
if (status !== OrderStatus.NEW && status !== OrderStatus.INCOMPLETE) {
|
|
1653
|
+
return flattenOrders;
|
|
1654
|
+
}
|
|
1655
|
+
return flattenOrders.map((item) => {
|
|
1486
1656
|
return {
|
|
1487
1657
|
...item,
|
|
1488
1658
|
mark_price: markPrices[item.symbol] ?? 0
|
|
1489
1659
|
};
|
|
1490
1660
|
});
|
|
1491
|
-
}, [
|
|
1661
|
+
}, [flattenOrders, markPrices, status]);
|
|
1492
1662
|
const total = useMemo(() => {
|
|
1493
1663
|
return ordersResponse.data?.[0]?.meta?.total || 0;
|
|
1494
1664
|
}, [ordersResponse.data?.[0]?.meta?.total]);
|
|
1495
1665
|
const cancelAllOrders = useCallback(() => {
|
|
1496
1666
|
}, [ordersResponse.data]);
|
|
1497
|
-
const updateOrder = useCallback((orderId,
|
|
1498
|
-
|
|
1667
|
+
const updateOrder = useCallback((orderId, order3) => {
|
|
1668
|
+
if (order3.algo_order_id !== void 0) {
|
|
1669
|
+
return doUpdateAlgoOrder({
|
|
1670
|
+
order_id: orderId,
|
|
1671
|
+
price: order3["order_price"],
|
|
1672
|
+
quantity: order3["order_quantity"],
|
|
1673
|
+
trigger_price: order3["trigger_price"]
|
|
1674
|
+
});
|
|
1675
|
+
}
|
|
1676
|
+
return doUpdateOrder({ ...order3, order_id: orderId });
|
|
1499
1677
|
}, []);
|
|
1500
1678
|
const cancelOrder = useCallback((orderId, symbol2) => {
|
|
1679
|
+
let isAlgoOrder = false;
|
|
1680
|
+
let order_id;
|
|
1681
|
+
if (typeof orderId === "number") {
|
|
1682
|
+
isAlgoOrder = false;
|
|
1683
|
+
order_id = orderId;
|
|
1684
|
+
} else {
|
|
1685
|
+
order_id = orderId?.order_id;
|
|
1686
|
+
if (orderId?.algo_order_id !== void 0) {
|
|
1687
|
+
isAlgoOrder = true;
|
|
1688
|
+
order_id = orderId?.algo_order_id;
|
|
1689
|
+
}
|
|
1690
|
+
}
|
|
1691
|
+
if (isAlgoOrder) {
|
|
1692
|
+
return doCanceAlgolOrder(null, {
|
|
1693
|
+
// @ts-ignore
|
|
1694
|
+
order_id,
|
|
1695
|
+
symbol: symbol2,
|
|
1696
|
+
source: `SDK${version_default}`
|
|
1697
|
+
}).then((res) => {
|
|
1698
|
+
if (res.success) {
|
|
1699
|
+
ordersResponse.mutate();
|
|
1700
|
+
return res;
|
|
1701
|
+
} else {
|
|
1702
|
+
throw new Error(res.message);
|
|
1703
|
+
}
|
|
1704
|
+
});
|
|
1705
|
+
}
|
|
1501
1706
|
return doCancelOrder(null, {
|
|
1502
|
-
order_id
|
|
1707
|
+
order_id,
|
|
1503
1708
|
symbol: symbol2,
|
|
1504
|
-
source:
|
|
1709
|
+
source: `SDK_${version_default}`
|
|
1505
1710
|
}).then((res) => {
|
|
1506
1711
|
if (res.success) {
|
|
1507
1712
|
return res;
|
|
@@ -1518,17 +1723,22 @@ var useOrderStream = (params) => {
|
|
|
1518
1723
|
{
|
|
1519
1724
|
total,
|
|
1520
1725
|
isLoading: ordersResponse.isLoading,
|
|
1726
|
+
refresh: ordersResponse.mutate,
|
|
1521
1727
|
loadMore,
|
|
1522
1728
|
cancelAllOrders,
|
|
1523
1729
|
updateOrder,
|
|
1524
1730
|
cancelOrder,
|
|
1525
1731
|
errors: {
|
|
1526
1732
|
cancelOrder: cancelOrderError,
|
|
1527
|
-
updateOrder: updateOrderError
|
|
1733
|
+
updateOrder: updateOrderError,
|
|
1734
|
+
cancelAlgoOrder: cancelAlgoOrderError,
|
|
1735
|
+
updateAlgoOrder: updateAlgoOrderError
|
|
1528
1736
|
},
|
|
1529
1737
|
submitting: {
|
|
1530
1738
|
cancelOrder: cancelMutating,
|
|
1531
|
-
updateOrder: updateMutating
|
|
1739
|
+
updateOrder: updateMutating,
|
|
1740
|
+
cancelAlgoOrder: cancelAlgoMutating,
|
|
1741
|
+
updateAlglOrder: updateAlgoMutating
|
|
1532
1742
|
}
|
|
1533
1743
|
}
|
|
1534
1744
|
];
|
|
@@ -1539,31 +1749,32 @@ var positionsPath = pathOr([], [0, "rows"]);
|
|
|
1539
1749
|
pathOr(0, [0, "totalCollateral"]);
|
|
1540
1750
|
var useCollateral = (options = { dp: 6 }) => {
|
|
1541
1751
|
const { dp } = options;
|
|
1542
|
-
const
|
|
1752
|
+
const positions3 = usePositionStream();
|
|
1543
1753
|
const [orders] = useOrderStream({ status: OrderStatus.NEW });
|
|
1544
1754
|
const { data: accountInfo } = usePrivateQuery("/v1/client/info");
|
|
1545
1755
|
const symbolInfo = useSymbolsInfo();
|
|
1546
1756
|
const { data: markPrices } = useMarkPricesStream();
|
|
1547
1757
|
const { usdc } = useHoldingStream();
|
|
1758
|
+
const filterAlgoOrders = orders?.filter((item) => item.algo_order_id === void 0) ?? [];
|
|
1548
1759
|
const [totalCollateral, totalValue] = useMemo(() => {
|
|
1549
1760
|
return [
|
|
1550
|
-
pathOr(zero, [0, "totalCollateral"],
|
|
1551
|
-
pathOr(zero, [0, "totalValue"],
|
|
1761
|
+
pathOr(zero, [0, "totalCollateral"], positions3),
|
|
1762
|
+
pathOr(zero, [0, "totalValue"], positions3)
|
|
1552
1763
|
];
|
|
1553
|
-
}, [
|
|
1764
|
+
}, [positions3, markPrices]);
|
|
1554
1765
|
const totalInitialMarginWithOrders = useMemo(() => {
|
|
1555
1766
|
if (!accountInfo || !symbolInfo || !markPrices) {
|
|
1556
1767
|
return 0;
|
|
1557
1768
|
}
|
|
1558
1769
|
return account.totalInitialMarginWithOrders({
|
|
1559
|
-
positions: positionsPath(
|
|
1560
|
-
orders:
|
|
1770
|
+
positions: positionsPath(positions3),
|
|
1771
|
+
orders: filterAlgoOrders,
|
|
1561
1772
|
markPrices,
|
|
1562
1773
|
IMR_Factors: accountInfo.imr_factor,
|
|
1563
1774
|
maxLeverage: accountInfo.max_leverage,
|
|
1564
1775
|
symbolInfo
|
|
1565
1776
|
});
|
|
1566
|
-
}, [
|
|
1777
|
+
}, [positions3, filterAlgoOrders, markPrices, accountInfo, symbolInfo]);
|
|
1567
1778
|
const freeCollateral = useMemo(() => {
|
|
1568
1779
|
return account.freeCollateral({
|
|
1569
1780
|
totalCollateral,
|
|
@@ -1573,15 +1784,18 @@ var useCollateral = (options = { dp: 6 }) => {
|
|
|
1573
1784
|
const availableBalance = useMemo(() => {
|
|
1574
1785
|
return account.availableBalance({
|
|
1575
1786
|
USDCHolding: usdc?.holding ?? 0,
|
|
1576
|
-
unsettlementPnL: pathOr_unsettledPnLPathOr(
|
|
1787
|
+
unsettlementPnL: pathOr_unsettledPnLPathOr(positions3)
|
|
1577
1788
|
});
|
|
1578
|
-
}, [usdc, pathOr_unsettledPnLPathOr(
|
|
1789
|
+
}, [usdc?.holding, pathOr_unsettledPnLPathOr(positions3)]);
|
|
1579
1790
|
return {
|
|
1580
1791
|
totalCollateral: totalCollateral.toDecimalPlaces(dp).toNumber(),
|
|
1581
1792
|
freeCollateral: freeCollateral.toDecimalPlaces(dp).toNumber(),
|
|
1582
1793
|
totalValue: totalValue.toDecimalPlaces(dp).toNumber(),
|
|
1583
1794
|
availableBalance,
|
|
1584
|
-
unsettledPnL: pathOr_unsettledPnLPathOr(
|
|
1795
|
+
unsettledPnL: pathOr_unsettledPnLPathOr(positions3),
|
|
1796
|
+
accountInfo,
|
|
1797
|
+
// @hidden
|
|
1798
|
+
positions: positionsPath(positions3)
|
|
1585
1799
|
};
|
|
1586
1800
|
};
|
|
1587
1801
|
var positionsPath2 = pathOr([], [0, "rows"]);
|
|
@@ -1595,8 +1809,8 @@ var useMaxQty = (symbol, side, reduceOnly = false) => {
|
|
|
1595
1809
|
const maxQty = useMemo(() => {
|
|
1596
1810
|
if (!symbol)
|
|
1597
1811
|
return 0;
|
|
1598
|
-
const
|
|
1599
|
-
const positionQty = account.getQtyFromPositions(
|
|
1812
|
+
const positions3 = positionsPath2(positionsData);
|
|
1813
|
+
const positionQty = account.getQtyFromPositions(positions3, symbol);
|
|
1600
1814
|
if (reduceOnly) {
|
|
1601
1815
|
if (positionQty > 0) {
|
|
1602
1816
|
if (side === OrderSide.BUY) {
|
|
@@ -1617,20 +1831,21 @@ var useMaxQty = (symbol, side, reduceOnly = false) => {
|
|
|
1617
1831
|
if (!markPrices || !markPrices[symbol] || !orders || !accountInfo)
|
|
1618
1832
|
return 0;
|
|
1619
1833
|
const getSymbolInfo = symbolInfo[symbol];
|
|
1834
|
+
const filterAlgoOrders = orders.filter((item) => item.algo_order_id === void 0);
|
|
1620
1835
|
const buyOrdersQty = account.getQtyFromOrdersBySide(
|
|
1621
|
-
|
|
1836
|
+
filterAlgoOrders,
|
|
1622
1837
|
symbol,
|
|
1623
1838
|
OrderSide.BUY
|
|
1624
1839
|
);
|
|
1625
1840
|
const sellOrdersQty = account.getQtyFromOrdersBySide(
|
|
1626
|
-
|
|
1841
|
+
filterAlgoOrders,
|
|
1627
1842
|
symbol,
|
|
1628
1843
|
OrderSide.SELL
|
|
1629
1844
|
);
|
|
1630
|
-
const otherPositions =
|
|
1845
|
+
const otherPositions = positions3.filter(
|
|
1631
1846
|
(item) => item.symbol !== symbol
|
|
1632
1847
|
);
|
|
1633
|
-
const otherOrders =
|
|
1848
|
+
const otherOrders = filterAlgoOrders.filter(
|
|
1634
1849
|
(item) => item.symbol !== symbol
|
|
1635
1850
|
);
|
|
1636
1851
|
const otherIMs = account.otherIMs({
|
|
@@ -1666,27 +1881,36 @@ var useMaxQty = (symbol, side, reduceOnly = false) => {
|
|
|
1666
1881
|
totalCollateral,
|
|
1667
1882
|
reduceOnly
|
|
1668
1883
|
]);
|
|
1669
|
-
return maxQty;
|
|
1884
|
+
return Math.max(maxQty, 0);
|
|
1670
1885
|
};
|
|
1671
|
-
var { maxPrice, minPrice } = order;
|
|
1886
|
+
var { maxPrice, minPrice, scropePrice } = order;
|
|
1672
1887
|
var BaseOrderCreator = class {
|
|
1673
1888
|
baseOrder(data) {
|
|
1674
|
-
const
|
|
1675
|
-
|
|
1889
|
+
const order3 = {
|
|
1890
|
+
symbol: data.symbol,
|
|
1676
1891
|
order_type: data.order_type === OrderType.LIMIT ? !!data.order_type_ext ? data.order_type_ext : data.order_type : data.order_type,
|
|
1677
1892
|
side: data.side,
|
|
1678
1893
|
reduce_only: data.reduce_only,
|
|
1679
|
-
order_quantity: data.order_quantity
|
|
1894
|
+
order_quantity: data.order_quantity,
|
|
1895
|
+
total: data.total
|
|
1680
1896
|
};
|
|
1681
1897
|
if (data.visible_quantity === 0) {
|
|
1682
|
-
|
|
1898
|
+
order3.visible_quantity = data.visible_quantity;
|
|
1683
1899
|
}
|
|
1684
|
-
return
|
|
1900
|
+
return order3;
|
|
1685
1901
|
}
|
|
1686
1902
|
baseValidate(values, configs) {
|
|
1687
1903
|
const errors = {};
|
|
1688
1904
|
const { maxQty } = configs;
|
|
1689
|
-
|
|
1905
|
+
let { order_quantity, total, order_price } = values;
|
|
1906
|
+
if (!order_quantity) {
|
|
1907
|
+
if (total && order_price) {
|
|
1908
|
+
const { quote_dp } = configs.symbol;
|
|
1909
|
+
const totalNumber = new Decimal(total);
|
|
1910
|
+
const qty = totalNumber.dividedBy(order_price).toFixed(quote_dp);
|
|
1911
|
+
order_quantity = qty;
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1690
1914
|
if (!order_quantity) {
|
|
1691
1915
|
errors.order_quantity = {
|
|
1692
1916
|
type: "required",
|
|
@@ -1732,13 +1956,28 @@ var BaseOrderCreator = class {
|
|
|
1732
1956
|
}
|
|
1733
1957
|
return Promise.resolve(errors);
|
|
1734
1958
|
}
|
|
1959
|
+
fixOrderQuantity(order3, config) {
|
|
1960
|
+
if (!order3.order_quantity && order3.total && order3.order_price) {
|
|
1961
|
+
const { base_dp } = config.symbol;
|
|
1962
|
+
const totalNumber = new Decimal(order3.total);
|
|
1963
|
+
const qty = totalNumber.div(order3.order_price).toDecimalPlaces(base_dp);
|
|
1964
|
+
order3.order_quantity = qty.toNumber();
|
|
1965
|
+
delete order3.total;
|
|
1966
|
+
}
|
|
1967
|
+
return order3;
|
|
1968
|
+
}
|
|
1735
1969
|
};
|
|
1736
1970
|
var LimitOrderCreator = class extends BaseOrderCreator {
|
|
1737
|
-
create(values) {
|
|
1738
|
-
|
|
1971
|
+
create(values, config) {
|
|
1972
|
+
const order3 = {
|
|
1739
1973
|
...this.baseOrder(values),
|
|
1740
1974
|
order_price: values.order_price
|
|
1741
1975
|
};
|
|
1976
|
+
this.fixOrderQuantity(order3, config);
|
|
1977
|
+
delete order3["total"];
|
|
1978
|
+
delete order3["trigger_price"];
|
|
1979
|
+
delete order3["isStopOrder"];
|
|
1980
|
+
return order3;
|
|
1742
1981
|
}
|
|
1743
1982
|
validate(values, config) {
|
|
1744
1983
|
return this.baseValidate(values, config).then((errors) => {
|
|
@@ -1751,22 +1990,34 @@ var LimitOrderCreator = class extends BaseOrderCreator {
|
|
|
1751
1990
|
} else {
|
|
1752
1991
|
const price = new Decimal(order_price);
|
|
1753
1992
|
const { symbol } = config;
|
|
1754
|
-
const { price_range } = symbol;
|
|
1993
|
+
const { price_range, price_scope } = symbol;
|
|
1755
1994
|
const maxPriceNumber = maxPrice(config.markPrice, price_range);
|
|
1756
1995
|
const minPriceNumber = minPrice(config.markPrice, price_range);
|
|
1757
|
-
|
|
1758
|
-
|
|
1996
|
+
const scropePriceNumbere = scropePrice(
|
|
1997
|
+
config.markPrice,
|
|
1998
|
+
price_scope,
|
|
1999
|
+
side
|
|
2000
|
+
);
|
|
2001
|
+
const priceRange = side === "BUY" ? {
|
|
2002
|
+
min: scropePriceNumbere,
|
|
2003
|
+
max: maxPriceNumber
|
|
2004
|
+
} : {
|
|
2005
|
+
min: minPriceNumber,
|
|
2006
|
+
max: scropePriceNumbere
|
|
2007
|
+
};
|
|
2008
|
+
if (price.gt(priceRange.max)) {
|
|
1759
2009
|
errors.order_price = {
|
|
1760
2010
|
type: "max",
|
|
1761
|
-
message: `
|
|
1762
|
-
|
|
2011
|
+
message: `Price must be less than ${new Decimal(
|
|
2012
|
+
priceRange.max
|
|
1763
2013
|
).todp(symbol.quote_dp)}`
|
|
1764
2014
|
};
|
|
1765
|
-
}
|
|
2015
|
+
}
|
|
2016
|
+
if (price.lt(priceRange.min)) {
|
|
1766
2017
|
errors.order_price = {
|
|
1767
2018
|
type: "min",
|
|
1768
|
-
message: `
|
|
1769
|
-
|
|
2019
|
+
message: `Price must be greater than ${new Decimal(
|
|
2020
|
+
priceRange.min
|
|
1770
2021
|
).todp(symbol.quote_dp)}`
|
|
1771
2022
|
};
|
|
1772
2023
|
}
|
|
@@ -1779,6 +2030,9 @@ var MarketOrderCreator = class extends BaseOrderCreator {
|
|
|
1779
2030
|
create(values) {
|
|
1780
2031
|
const data = this.baseOrder(values);
|
|
1781
2032
|
delete data["order_price"];
|
|
2033
|
+
delete data["total"];
|
|
2034
|
+
delete data["trigger_price"];
|
|
2035
|
+
delete data["isStopOrder"];
|
|
1782
2036
|
return {
|
|
1783
2037
|
...data
|
|
1784
2038
|
};
|
|
@@ -1793,6 +2047,110 @@ var FOKOrderCreator = class extends LimitOrderCreator {
|
|
|
1793
2047
|
};
|
|
1794
2048
|
var IOCOrderCreator = class extends LimitOrderCreator {
|
|
1795
2049
|
};
|
|
2050
|
+
var StopLimitOrderCreator = class extends LimitOrderCreator {
|
|
2051
|
+
create(values, config) {
|
|
2052
|
+
const order3 = {
|
|
2053
|
+
...this.baseOrder(values),
|
|
2054
|
+
order_price: values.order_price,
|
|
2055
|
+
trigger_price: values.trigger_price,
|
|
2056
|
+
algo_type: "STOP",
|
|
2057
|
+
type: "LIMIT",
|
|
2058
|
+
quantity: values["order_quantity"],
|
|
2059
|
+
price: values["order_price"],
|
|
2060
|
+
trigger_price_type: "MARK_PRICE"
|
|
2061
|
+
};
|
|
2062
|
+
this.fixOrderQuantity(order3, config);
|
|
2063
|
+
delete order3["order_quantity"];
|
|
2064
|
+
delete order3["order_price"];
|
|
2065
|
+
delete order3["isStopOrder"];
|
|
2066
|
+
delete order3["total"];
|
|
2067
|
+
return order3;
|
|
2068
|
+
}
|
|
2069
|
+
validate(values, config) {
|
|
2070
|
+
return this.baseValidate(values, config).then((errors) => {
|
|
2071
|
+
const { order_price, trigger_price, side } = values;
|
|
2072
|
+
if (!order_price) {
|
|
2073
|
+
errors.order_price = {
|
|
2074
|
+
type: "required",
|
|
2075
|
+
message: "price is required"
|
|
2076
|
+
};
|
|
2077
|
+
}
|
|
2078
|
+
if (!trigger_price) {
|
|
2079
|
+
errors.trigger_price = {
|
|
2080
|
+
type: "required",
|
|
2081
|
+
message: "Trigger price is required"
|
|
2082
|
+
};
|
|
2083
|
+
}
|
|
2084
|
+
if (trigger_price && order_price) {
|
|
2085
|
+
const price = new Decimal(order_price);
|
|
2086
|
+
const { symbol } = config;
|
|
2087
|
+
const { price_range, price_scope } = symbol;
|
|
2088
|
+
const maxPriceNumber = maxPrice(trigger_price, price_range);
|
|
2089
|
+
const minPriceNumber = minPrice(trigger_price, price_range);
|
|
2090
|
+
const scropePriceNumbere = scropePrice(
|
|
2091
|
+
trigger_price,
|
|
2092
|
+
price_scope,
|
|
2093
|
+
side
|
|
2094
|
+
);
|
|
2095
|
+
const priceRange = side === "BUY" ? {
|
|
2096
|
+
min: scropePriceNumbere,
|
|
2097
|
+
max: maxPriceNumber
|
|
2098
|
+
} : {
|
|
2099
|
+
min: minPriceNumber,
|
|
2100
|
+
max: scropePriceNumbere
|
|
2101
|
+
};
|
|
2102
|
+
if (price.gt(priceRange.max)) {
|
|
2103
|
+
errors.order_price = {
|
|
2104
|
+
type: "max",
|
|
2105
|
+
message: `Price must be less than ${new Decimal(
|
|
2106
|
+
priceRange.max
|
|
2107
|
+
).todp(symbol.quote_dp)}`
|
|
2108
|
+
};
|
|
2109
|
+
}
|
|
2110
|
+
if (price.lt(priceRange.min)) {
|
|
2111
|
+
errors.order_price = {
|
|
2112
|
+
type: "min",
|
|
2113
|
+
message: `Price must be greater than ${new Decimal(
|
|
2114
|
+
priceRange.min
|
|
2115
|
+
).todp(symbol.quote_dp)}`
|
|
2116
|
+
};
|
|
2117
|
+
}
|
|
2118
|
+
}
|
|
2119
|
+
return errors;
|
|
2120
|
+
});
|
|
2121
|
+
}
|
|
2122
|
+
};
|
|
2123
|
+
var StopMarketOrderCreator = class extends LimitOrderCreator {
|
|
2124
|
+
create(values, _) {
|
|
2125
|
+
const result = {
|
|
2126
|
+
...this.baseOrder(values),
|
|
2127
|
+
order_price: values.order_price,
|
|
2128
|
+
trigger_price: values.trigger_price,
|
|
2129
|
+
algo_type: "STOP",
|
|
2130
|
+
type: "MARKET",
|
|
2131
|
+
quantity: values["order_quantity"],
|
|
2132
|
+
price: values["order_price"],
|
|
2133
|
+
trigger_price_type: "MARK_PRICE"
|
|
2134
|
+
};
|
|
2135
|
+
delete result["order_quantity"];
|
|
2136
|
+
delete result["order_price"];
|
|
2137
|
+
delete result["isStopOrder"];
|
|
2138
|
+
delete result["total"];
|
|
2139
|
+
return result;
|
|
2140
|
+
}
|
|
2141
|
+
validate(values, config) {
|
|
2142
|
+
return this.baseValidate(values, config).then((errors) => {
|
|
2143
|
+
const { order_price, trigger_price, side } = values;
|
|
2144
|
+
if (!trigger_price) {
|
|
2145
|
+
errors.trigger_price = {
|
|
2146
|
+
type: "required",
|
|
2147
|
+
message: "Trigger price is required"
|
|
2148
|
+
};
|
|
2149
|
+
}
|
|
2150
|
+
return errors;
|
|
2151
|
+
});
|
|
2152
|
+
}
|
|
2153
|
+
};
|
|
1796
2154
|
var GeneralOrderCreator = class extends BaseOrderCreator {
|
|
1797
2155
|
create(data) {
|
|
1798
2156
|
return {
|
|
@@ -1805,6 +2163,15 @@ var GeneralOrderCreator = class extends BaseOrderCreator {
|
|
|
1805
2163
|
return super.baseValidate(values, configs);
|
|
1806
2164
|
}
|
|
1807
2165
|
};
|
|
2166
|
+
var availableOrderTypes = [
|
|
2167
|
+
OrderType.LIMIT,
|
|
2168
|
+
OrderType.MARKET,
|
|
2169
|
+
OrderType.IOC,
|
|
2170
|
+
OrderType.FOK,
|
|
2171
|
+
OrderType.POST_ONLY,
|
|
2172
|
+
OrderType.STOP_LIMIT,
|
|
2173
|
+
OrderType.STOP_MARKET
|
|
2174
|
+
];
|
|
1808
2175
|
var OrderFactory = class {
|
|
1809
2176
|
static create(type) {
|
|
1810
2177
|
switch (type) {
|
|
@@ -1818,17 +2185,68 @@ var OrderFactory = class {
|
|
|
1818
2185
|
return new FOKOrderCreator();
|
|
1819
2186
|
case OrderType.POST_ONLY:
|
|
1820
2187
|
return new PostOnlyOrderCreator();
|
|
2188
|
+
case OrderType.STOP_LIMIT:
|
|
2189
|
+
return new StopLimitOrderCreator();
|
|
2190
|
+
case OrderType.STOP_MARKET:
|
|
2191
|
+
return new StopMarketOrderCreator();
|
|
1821
2192
|
default:
|
|
1822
2193
|
return new GeneralOrderCreator();
|
|
1823
2194
|
}
|
|
1824
2195
|
}
|
|
1825
2196
|
};
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
2197
|
+
function useOrderEntry(symbolOrOrder, sideOrOptions, reduceOnly, options) {
|
|
2198
|
+
if (typeof symbolOrOrder === "object") {
|
|
2199
|
+
if (!symbolOrOrder.symbol) {
|
|
2200
|
+
throw new SDKError("symbol is required");
|
|
2201
|
+
}
|
|
2202
|
+
if (!symbolOrOrder.side) {
|
|
2203
|
+
throw new SDKError("Order side is required");
|
|
2204
|
+
}
|
|
2205
|
+
if (!symbolOrOrder.order_type) {
|
|
2206
|
+
throw new SDKError("order_type is required");
|
|
2207
|
+
}
|
|
2208
|
+
}
|
|
2209
|
+
const prevOrderData = useRef(null);
|
|
2210
|
+
const orderDataCache = useRef(null);
|
|
2211
|
+
const notSupportData = useRef({});
|
|
2212
|
+
const [doCreateOrder, { data, error, reset, isMutating }] = useMutation(orderDataCache?.current?.isStopOrder ? "/v1/algo/order" : "/v1/order");
|
|
2213
|
+
const [errors, setErrors] = useState(null);
|
|
2214
|
+
const ee = useEventEmitter();
|
|
2215
|
+
const fieldDirty = useRef({});
|
|
2216
|
+
const submitted = useRef(false);
|
|
2217
|
+
const askAndBid = useRef([]);
|
|
2218
|
+
const onOrderbookUpdate = useDebouncedCallback((data2) => {
|
|
2219
|
+
askAndBid.current = data2;
|
|
2220
|
+
}, 200);
|
|
2221
|
+
const { freeCollateral, totalCollateral, positions: positions3, accountInfo } = useCollateral();
|
|
1831
2222
|
const symbolInfo = useSymbolsInfo();
|
|
2223
|
+
const symbol = useMemo(() => {
|
|
2224
|
+
if (typeof symbolOrOrder === "string") {
|
|
2225
|
+
return symbolOrOrder;
|
|
2226
|
+
}
|
|
2227
|
+
return symbolOrOrder.symbol;
|
|
2228
|
+
}, [symbolOrOrder]);
|
|
2229
|
+
const optionsValue = useMemo(() => {
|
|
2230
|
+
if (typeof sideOrOptions === "object") {
|
|
2231
|
+
return sideOrOptions;
|
|
2232
|
+
}
|
|
2233
|
+
return options;
|
|
2234
|
+
}, [sideOrOptions]);
|
|
2235
|
+
const isReduceOnly = useMemo(() => {
|
|
2236
|
+
if (typeof reduceOnly === "boolean") {
|
|
2237
|
+
return reduceOnly;
|
|
2238
|
+
}
|
|
2239
|
+
if (typeof symbolOrOrder === "object") {
|
|
2240
|
+
return !!symbolOrOrder.reduce_only;
|
|
2241
|
+
}
|
|
2242
|
+
return false;
|
|
2243
|
+
}, [symbolOrOrder, reduceOnly]);
|
|
2244
|
+
const sideValue = useMemo(() => {
|
|
2245
|
+
if (typeof symbolOrOrder === "object") {
|
|
2246
|
+
return symbolOrOrder.side;
|
|
2247
|
+
}
|
|
2248
|
+
return sideOrOptions;
|
|
2249
|
+
}, [symbolOrOrder, sideOrOptions]);
|
|
1832
2250
|
const baseDP = useMemo(
|
|
1833
2251
|
() => getPrecisionByNumber(symbolInfo[symbol]("base_tick", 0)),
|
|
1834
2252
|
[symbolInfo]
|
|
@@ -1836,42 +2254,123 @@ var useOrderEntry = (symbol, side, reduceOnly = false, options) => {
|
|
|
1836
2254
|
const quoteDP = useMemo(() => {
|
|
1837
2255
|
return getPrecisionByNumber(symbolInfo[symbol]("quote_tick", 0));
|
|
1838
2256
|
}, [symbolInfo]);
|
|
2257
|
+
const baseIMR = useMemo(() => symbolInfo[symbol]("base_imr"), [symbolInfo]);
|
|
2258
|
+
const baseMMR = useMemo(() => symbolInfo[symbol]("base_mmr"), [symbolInfo]);
|
|
1839
2259
|
const { data: markPrice } = useMarkPrice(symbol);
|
|
1840
|
-
const
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
2260
|
+
const diffOrderEntry = (prev, current) => {
|
|
2261
|
+
if (!prev)
|
|
2262
|
+
return null;
|
|
2263
|
+
let key, value;
|
|
2264
|
+
const keys = Object.keys(current);
|
|
2265
|
+
for (let i = 0; i < keys.length; i++) {
|
|
2266
|
+
const k = keys[i];
|
|
2267
|
+
let preveValue = prev[k];
|
|
2268
|
+
let currentValue = current[k];
|
|
2269
|
+
if (typeof preveValue === "undefined" && typeof currentValue === "undefined")
|
|
2270
|
+
continue;
|
|
2271
|
+
if (preveValue !== currentValue) {
|
|
2272
|
+
key = k;
|
|
2273
|
+
value = currentValue;
|
|
2274
|
+
break;
|
|
2275
|
+
}
|
|
2276
|
+
}
|
|
2277
|
+
if (!key)
|
|
2278
|
+
return null;
|
|
2279
|
+
return { key, value };
|
|
2280
|
+
};
|
|
2281
|
+
const maxQty = useMaxQty(symbol, sideValue, isReduceOnly);
|
|
2282
|
+
const parsedData = useMemo(() => {
|
|
2283
|
+
if (typeof symbolOrOrder === "string") {
|
|
2284
|
+
return null;
|
|
2285
|
+
}
|
|
2286
|
+
if (typeof symbolOrOrder.order_quantity === "string") {
|
|
2287
|
+
symbolOrOrder.order_quantity = symbolOrOrder.order_quantity.replace(
|
|
2288
|
+
/,/g,
|
|
2289
|
+
""
|
|
2290
|
+
);
|
|
2291
|
+
}
|
|
2292
|
+
if (typeof symbolOrOrder.order_price === "string") {
|
|
2293
|
+
symbolOrOrder.order_price = symbolOrOrder.order_price.replace(/,/g, "");
|
|
2294
|
+
}
|
|
2295
|
+
if (typeof symbolOrOrder.total === "string") {
|
|
2296
|
+
symbolOrOrder.total = symbolOrOrder.total.replace(/,/g, "");
|
|
2297
|
+
}
|
|
2298
|
+
if (typeof symbolOrOrder.order_quantity === "number") {
|
|
2299
|
+
symbolOrOrder.order_quantity = new Decimal(symbolOrOrder.order_quantity).toDecimalPlaces(baseDP).toString();
|
|
2300
|
+
}
|
|
2301
|
+
return symbolOrOrder;
|
|
2302
|
+
}, [symbolOrOrder]);
|
|
2303
|
+
const createOrder = (values) => {
|
|
2304
|
+
if (!values.symbol) {
|
|
2305
|
+
throw new SDKError("symbol is error");
|
|
2306
|
+
}
|
|
2307
|
+
if (!values.side) {
|
|
2308
|
+
throw new SDKError("side is error");
|
|
2309
|
+
}
|
|
2310
|
+
if (!values || typeof values.order_type === "undefined" || !includes(values.order_type, availableOrderTypes)) {
|
|
2311
|
+
throw new SDKError("order_type is error");
|
|
1849
2312
|
}
|
|
1850
2313
|
const orderCreator = OrderFactory.create(
|
|
1851
|
-
|
|
2314
|
+
values.order_type_ext ? values.order_type_ext : values.order_type
|
|
1852
2315
|
);
|
|
1853
2316
|
if (!orderCreator) {
|
|
1854
|
-
return Promise.reject(new
|
|
2317
|
+
return Promise.reject(new SDKError("orderCreator is null"));
|
|
1855
2318
|
}
|
|
1856
|
-
return
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
2319
|
+
return new Promise((resolve, reject) => {
|
|
2320
|
+
return orderCreator.validate(values, {
|
|
2321
|
+
symbol: symbolInfo[symbol](),
|
|
2322
|
+
// token: tokenInfo[symbol](),
|
|
2323
|
+
maxQty,
|
|
2324
|
+
markPrice
|
|
2325
|
+
}).then((errors2) => {
|
|
2326
|
+
submitted.current = true;
|
|
2327
|
+
if (errors2.order_price || errors2.order_quantity || errors2.trigger_price) {
|
|
2328
|
+
setErrors(errors2);
|
|
2329
|
+
reject(
|
|
2330
|
+
errors2.order_price?.message || errors2.order_quantity?.message
|
|
2331
|
+
);
|
|
2332
|
+
} else {
|
|
2333
|
+
const data2 = orderCreator.create(values, {
|
|
2334
|
+
symbol: symbolInfo[symbol](),
|
|
2335
|
+
maxQty,
|
|
2336
|
+
markPrice
|
|
2337
|
+
});
|
|
2338
|
+
return doCreateOrder(
|
|
2339
|
+
omit(["order_type_ext"], {
|
|
2340
|
+
// ...values,
|
|
2341
|
+
// ...omit(["order_price"], values),
|
|
2342
|
+
...data2
|
|
2343
|
+
})
|
|
2344
|
+
).then((res) => {
|
|
2345
|
+
if (res.success) {
|
|
2346
|
+
resolve(res.data);
|
|
2347
|
+
} else {
|
|
2348
|
+
reject(res);
|
|
2349
|
+
}
|
|
2350
|
+
}, reject);
|
|
2351
|
+
}
|
|
1872
2352
|
});
|
|
1873
2353
|
});
|
|
1874
2354
|
};
|
|
2355
|
+
const onSubmit = (values) => {
|
|
2356
|
+
if (typeof reduceOnly === "boolean" && reduceOnly && !values.reduce_only) {
|
|
2357
|
+
return Promise.reject(
|
|
2358
|
+
new SDKError(
|
|
2359
|
+
"The reduceOny parameter of hook does not match your order data"
|
|
2360
|
+
)
|
|
2361
|
+
);
|
|
2362
|
+
}
|
|
2363
|
+
return createOrder({
|
|
2364
|
+
...values,
|
|
2365
|
+
symbol
|
|
2366
|
+
});
|
|
2367
|
+
};
|
|
2368
|
+
const submit = useCallback(() => {
|
|
2369
|
+
if (typeof symbolOrOrder === "string") {
|
|
2370
|
+
throw new SDKError("Function is not supported, please use onSubmit()");
|
|
2371
|
+
}
|
|
2372
|
+
return createOrder(symbolOrOrder);
|
|
2373
|
+
}, [symbolOrOrder]);
|
|
1875
2374
|
const calculate = useCallback(
|
|
1876
2375
|
(values, field, value) => {
|
|
1877
2376
|
const fieldHandler = getCalculateHandler(field);
|
|
@@ -1894,75 +2393,407 @@ var useOrderEntry = (symbol, side, reduceOnly = false, options) => {
|
|
|
1894
2393
|
markPrice
|
|
1895
2394
|
});
|
|
1896
2395
|
};
|
|
2396
|
+
const formattedOrder = useMemo(() => {
|
|
2397
|
+
if (!parsedData) {
|
|
2398
|
+
return notSupportData.current;
|
|
2399
|
+
}
|
|
2400
|
+
if (!prevOrderData.current) {
|
|
2401
|
+
prevOrderData.current = parsedData;
|
|
2402
|
+
orderDataCache.current = {
|
|
2403
|
+
...parsedData,
|
|
2404
|
+
total: ""
|
|
2405
|
+
};
|
|
2406
|
+
return orderDataCache.current;
|
|
2407
|
+
}
|
|
2408
|
+
const item = diffOrderEntry(prevOrderData.current, parsedData);
|
|
2409
|
+
if (!item) {
|
|
2410
|
+
return orderDataCache.current;
|
|
2411
|
+
}
|
|
2412
|
+
if (typeof parsedData.order_price !== "undefined") {
|
|
2413
|
+
fieldDirty.current.order_price = true;
|
|
2414
|
+
}
|
|
2415
|
+
if (typeof parsedData.order_quantity !== "undefined") {
|
|
2416
|
+
fieldDirty.current.order_quantity = true;
|
|
2417
|
+
}
|
|
2418
|
+
const values = calculate(parsedData, item.key, item.value);
|
|
2419
|
+
values.isStopOrder = values.order_type?.startsWith("STOP") || false;
|
|
2420
|
+
values.total = values.total || "";
|
|
2421
|
+
prevOrderData.current = parsedData;
|
|
2422
|
+
orderDataCache.current = values;
|
|
2423
|
+
return values;
|
|
2424
|
+
}, [
|
|
2425
|
+
parsedData?.order_price,
|
|
2426
|
+
parsedData?.side,
|
|
2427
|
+
parsedData?.order_quantity,
|
|
2428
|
+
parsedData?.visible_quantity,
|
|
2429
|
+
parsedData?.order_type,
|
|
2430
|
+
parsedData?.order_type_ext,
|
|
2431
|
+
parsedData?.symbol,
|
|
2432
|
+
parsedData?.total,
|
|
2433
|
+
parsedData?.reduce_only,
|
|
2434
|
+
parsedData?.trigger_price,
|
|
2435
|
+
markPrice
|
|
2436
|
+
]);
|
|
2437
|
+
useEffect(() => {
|
|
2438
|
+
if (!markPrice)
|
|
2439
|
+
return;
|
|
2440
|
+
validator(formattedOrder)?.then((err) => {
|
|
2441
|
+
setErrors(err);
|
|
2442
|
+
});
|
|
2443
|
+
}, [
|
|
2444
|
+
formattedOrder.broker_id,
|
|
2445
|
+
formattedOrder.order_quantity,
|
|
2446
|
+
formattedOrder.total,
|
|
2447
|
+
formattedOrder.trigger_price,
|
|
2448
|
+
markPrice
|
|
2449
|
+
]);
|
|
2450
|
+
useEffect(() => {
|
|
2451
|
+
if (!optionsValue?.watchOrderbook)
|
|
2452
|
+
return;
|
|
2453
|
+
ee.on("orderbook:update", onOrderbookUpdate);
|
|
2454
|
+
return () => {
|
|
2455
|
+
ee.off("orderbook_update", onOrderbookUpdate);
|
|
2456
|
+
};
|
|
2457
|
+
}, [optionsValue?.watchOrderbook]);
|
|
2458
|
+
useEffect(() => {
|
|
2459
|
+
askAndBid.current = [];
|
|
2460
|
+
}, [parsedData?.symbol]);
|
|
2461
|
+
const getPriceAndQty = (symbolOrOrder2) => {
|
|
2462
|
+
let quantity = Number(symbolOrOrder2.order_quantity);
|
|
2463
|
+
const orderPrice = Number(symbolOrOrder2.order_price);
|
|
2464
|
+
if (isNaN(quantity) || quantity <= 0 || askAndBid.current.length === 0)
|
|
2465
|
+
return null;
|
|
2466
|
+
if ((symbolOrOrder2.order_type === OrderType.LIMIT || symbolOrOrder2.order_type === OrderType.STOP_LIMIT) && isNaN(orderPrice))
|
|
2467
|
+
return null;
|
|
2468
|
+
let price;
|
|
2469
|
+
if (symbolOrOrder2.order_type === OrderType.MARKET || symbolOrOrder2.order_type === OrderType.STOP_MARKET) {
|
|
2470
|
+
if (symbolOrOrder2.side === OrderSide.BUY) {
|
|
2471
|
+
price = askAndBid.current[0];
|
|
2472
|
+
} else {
|
|
2473
|
+
price = askAndBid.current[1];
|
|
2474
|
+
}
|
|
2475
|
+
} else {
|
|
2476
|
+
if (symbolOrOrder2.side === OrderSide.BUY) {
|
|
2477
|
+
if (orderPrice >= askAndBid.current[0]) {
|
|
2478
|
+
price = askAndBid.current[0];
|
|
2479
|
+
} else {
|
|
2480
|
+
price = orderPrice;
|
|
2481
|
+
}
|
|
2482
|
+
} else {
|
|
2483
|
+
if (orderPrice <= askAndBid.current[1]) {
|
|
2484
|
+
price = askAndBid.current[1];
|
|
2485
|
+
} else {
|
|
2486
|
+
price = orderPrice;
|
|
2487
|
+
}
|
|
2488
|
+
}
|
|
2489
|
+
}
|
|
2490
|
+
if (symbolOrOrder2.side === OrderSide.SELL) {
|
|
2491
|
+
quantity = -quantity;
|
|
2492
|
+
}
|
|
2493
|
+
return { price, quantity };
|
|
2494
|
+
};
|
|
2495
|
+
const estLiqPrice = useMemo(() => {
|
|
2496
|
+
if (!accountInfo || !parsedData || !markPrice)
|
|
2497
|
+
return null;
|
|
2498
|
+
const result = getPriceAndQty(formattedOrder);
|
|
2499
|
+
if (result === null)
|
|
2500
|
+
return null;
|
|
2501
|
+
const { price, quantity } = result;
|
|
2502
|
+
if (!price || !quantity)
|
|
2503
|
+
return null;
|
|
2504
|
+
const liqPrice = order.estLiqPrice({
|
|
2505
|
+
markPrice,
|
|
2506
|
+
baseIMR,
|
|
2507
|
+
baseMMR,
|
|
2508
|
+
totalCollateral,
|
|
2509
|
+
positions: positions3,
|
|
2510
|
+
IMR_Factor: accountInfo["imr_factor"][symbol],
|
|
2511
|
+
newOrder: {
|
|
2512
|
+
qty: quantity,
|
|
2513
|
+
price,
|
|
2514
|
+
symbol: parsedData.symbol
|
|
2515
|
+
}
|
|
2516
|
+
});
|
|
2517
|
+
if (liqPrice <= 0)
|
|
2518
|
+
return null;
|
|
2519
|
+
return liqPrice;
|
|
2520
|
+
}, [
|
|
2521
|
+
markPrice,
|
|
2522
|
+
baseIMR,
|
|
2523
|
+
baseMMR,
|
|
2524
|
+
totalCollateral,
|
|
2525
|
+
formattedOrder?.order_price,
|
|
2526
|
+
formattedOrder?.order_quantity,
|
|
2527
|
+
formattedOrder?.total,
|
|
2528
|
+
formattedOrder?.trigger_price,
|
|
2529
|
+
accountInfo
|
|
2530
|
+
]);
|
|
2531
|
+
const estLeverage = useMemo(() => {
|
|
2532
|
+
if (!accountInfo || !parsedData)
|
|
2533
|
+
return null;
|
|
2534
|
+
const result = getPriceAndQty(formattedOrder);
|
|
2535
|
+
if (result === null || !result.price || !result.quantity)
|
|
2536
|
+
return null;
|
|
2537
|
+
const leverage = order.estLeverage({
|
|
2538
|
+
totalCollateral,
|
|
2539
|
+
positions: positions3,
|
|
2540
|
+
newOrder: {
|
|
2541
|
+
symbol: parsedData.symbol,
|
|
2542
|
+
qty: result.quantity,
|
|
2543
|
+
price: result.price
|
|
2544
|
+
}
|
|
2545
|
+
});
|
|
2546
|
+
return leverage;
|
|
2547
|
+
}, [
|
|
2548
|
+
baseIMR,
|
|
2549
|
+
baseMMR,
|
|
2550
|
+
totalCollateral,
|
|
2551
|
+
positions3,
|
|
2552
|
+
formattedOrder?.order_price,
|
|
2553
|
+
formattedOrder?.order_quantity,
|
|
2554
|
+
formattedOrder?.total,
|
|
2555
|
+
formattedOrder?.trigger_price
|
|
2556
|
+
]);
|
|
1897
2557
|
return {
|
|
1898
2558
|
maxQty,
|
|
1899
2559
|
freeCollateral,
|
|
1900
2560
|
markPrice,
|
|
1901
2561
|
onSubmit,
|
|
2562
|
+
submit,
|
|
1902
2563
|
submitting: isMutating,
|
|
2564
|
+
formattedOrder,
|
|
2565
|
+
// errors,
|
|
2566
|
+
estLiqPrice,
|
|
2567
|
+
estLeverage,
|
|
1903
2568
|
helper: {
|
|
1904
2569
|
calculate,
|
|
1905
2570
|
validator
|
|
2571
|
+
// clearErrors,
|
|
2572
|
+
},
|
|
2573
|
+
metaState: {
|
|
2574
|
+
dirty: fieldDirty.current,
|
|
2575
|
+
submitted: submitted.current,
|
|
2576
|
+
errors
|
|
1906
2577
|
},
|
|
1907
2578
|
symbolConfig: symbolInfo[symbol]()
|
|
1908
2579
|
};
|
|
1909
|
-
}
|
|
2580
|
+
}
|
|
1910
2581
|
|
|
1911
2582
|
// src/orderly/useAccountInfo.ts
|
|
1912
2583
|
var useAccountInfo = () => {
|
|
1913
2584
|
return usePrivateQuery("/v1/client/info");
|
|
1914
2585
|
};
|
|
1915
|
-
var
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
2586
|
+
var MarketsType = /* @__PURE__ */ ((MarketsType2) => {
|
|
2587
|
+
MarketsType2[MarketsType2["FAVORITES"] = 0] = "FAVORITES";
|
|
2588
|
+
MarketsType2[MarketsType2["RECENT"] = 1] = "RECENT";
|
|
2589
|
+
MarketsType2[MarketsType2["ALL"] = 2] = "ALL";
|
|
2590
|
+
return MarketsType2;
|
|
2591
|
+
})(MarketsType || {});
|
|
2592
|
+
var useMarkets = (type) => {
|
|
2593
|
+
const marketsKey = "markets";
|
|
2594
|
+
const { data } = useMarketsStream();
|
|
2595
|
+
const { configStore } = useContext(OrderlyContext);
|
|
2596
|
+
const publicInfo = useSymbolsInfo();
|
|
2597
|
+
if (!configStore.get(marketsKey)) {
|
|
2598
|
+
const jsonStr = localStorage.getItem(marketsKey);
|
|
2599
|
+
if (jsonStr) {
|
|
2600
|
+
configStore.set(marketsKey, JSON.parse(jsonStr));
|
|
2601
|
+
} else {
|
|
2602
|
+
const defaultTab = { name: "Popular", id: 1 };
|
|
2603
|
+
configStore.set(marketsKey, {
|
|
2604
|
+
recent: [],
|
|
2605
|
+
favorites: [
|
|
2606
|
+
{ name: "PERP_ETH_USDC", tabs: [{ ...defaultTab }] },
|
|
2607
|
+
{ name: "PERP_BTC_USDC", tabs: [{ ...defaultTab }] }
|
|
2608
|
+
],
|
|
2609
|
+
favoriteTabs: [{ ...defaultTab }],
|
|
2610
|
+
lastSelectFavoriteTab: { ...defaultTab }
|
|
2611
|
+
});
|
|
2612
|
+
}
|
|
2613
|
+
}
|
|
2614
|
+
const getFavoriteTabs = useMemo(() => {
|
|
2615
|
+
const tabs2 = configStore.get(marketsKey)["favoriteTabs"];
|
|
2616
|
+
return tabs2 || [{ name: "Popular", id: 1 }];
|
|
2617
|
+
}, []);
|
|
2618
|
+
const getFavorites = useMemo(() => {
|
|
2619
|
+
const curData = configStore.get(marketsKey)["favorites"] || [];
|
|
2620
|
+
const tabs2 = getFavoriteTabs;
|
|
2621
|
+
const result = [];
|
|
2622
|
+
for (let index = 0; index < curData.length; index++) {
|
|
2623
|
+
const favData = curData[index];
|
|
2624
|
+
var favTabs = favData.tabs.filter((tab) => tabs2.findIndex((item) => tab.id === item.id) !== -1);
|
|
2625
|
+
if (favTabs.length > 0) {
|
|
2626
|
+
result.push({ ...favData, tabs: favTabs });
|
|
1934
2627
|
}
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
2628
|
+
}
|
|
2629
|
+
configStore.set(marketsKey, { ...configStore.getOr(marketsKey, {}), favorites: result });
|
|
2630
|
+
return result;
|
|
2631
|
+
}, [configStore]);
|
|
2632
|
+
const getRecent = useMemo(() => {
|
|
2633
|
+
const curData = configStore.get(marketsKey)["recent"];
|
|
2634
|
+
return (curData || []).filter((e) => e);
|
|
2635
|
+
}, []);
|
|
2636
|
+
const [favoriteTabs, setFavoriteTabs] = useState(getFavoriteTabs);
|
|
2637
|
+
const [favorites, setFavorites] = useState(getFavorites);
|
|
2638
|
+
const [recent, setRecent] = useState(getRecent);
|
|
2639
|
+
const updateFavoriteTabs = (tab, operator) => {
|
|
2640
|
+
const saveTabs = (tabs3) => {
|
|
2641
|
+
setFavoriteTabs(tabs3);
|
|
2642
|
+
configStore.set(marketsKey, {
|
|
2643
|
+
...configStore.getOr(marketsKey, {}),
|
|
2644
|
+
"favoriteTabs": tabs3
|
|
2645
|
+
});
|
|
1938
2646
|
};
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
)
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
2647
|
+
if (Array.isArray(tab)) {
|
|
2648
|
+
saveTabs(tab);
|
|
2649
|
+
return;
|
|
2650
|
+
}
|
|
2651
|
+
var tabs2 = [...favoriteTabs];
|
|
2652
|
+
const index = tabs2.findIndex((item) => item.id === tab.id);
|
|
2653
|
+
if (operator?.add) {
|
|
2654
|
+
tabs2.push(tab);
|
|
2655
|
+
} else if (operator?.update) {
|
|
2656
|
+
if (index !== -1) {
|
|
2657
|
+
tabs2[index] = tab;
|
|
2658
|
+
}
|
|
2659
|
+
} else if (operator?.delete) {
|
|
2660
|
+
if (index !== -1) {
|
|
2661
|
+
tabs2.splice(index, 1);
|
|
2662
|
+
}
|
|
2663
|
+
}
|
|
2664
|
+
saveTabs(tabs2);
|
|
2665
|
+
};
|
|
2666
|
+
const setRecentData = (symbol) => {
|
|
2667
|
+
const curData = [...recent];
|
|
2668
|
+
const index = curData.findIndex((item) => item.name == symbol.symbol);
|
|
2669
|
+
if (index !== -1) {
|
|
2670
|
+
curData.splice(index, 1);
|
|
2671
|
+
}
|
|
2672
|
+
curData.unshift({ name: symbol.symbol });
|
|
2673
|
+
configStore.set(marketsKey, {
|
|
2674
|
+
...configStore.getOr(marketsKey, {}),
|
|
2675
|
+
"recent": curData
|
|
2676
|
+
});
|
|
2677
|
+
setRecent(curData);
|
|
2678
|
+
};
|
|
2679
|
+
const setFavoritesData = (symbol, tab, remove = false) => {
|
|
2680
|
+
const curData = [...favorites];
|
|
2681
|
+
const index = curData.findIndex((item) => item.name == symbol.symbol);
|
|
2682
|
+
if (index === -1) {
|
|
2683
|
+
if (Array.isArray(tab)) {
|
|
2684
|
+
if (tab.length > 0) {
|
|
2685
|
+
curData.unshift({ name: symbol.symbol, tabs: tab });
|
|
2686
|
+
}
|
|
2687
|
+
} else {
|
|
2688
|
+
if (!remove) {
|
|
2689
|
+
curData.unshift({ name: symbol.symbol, tabs: [tab] });
|
|
1959
2690
|
}
|
|
1960
|
-
return data;
|
|
1961
2691
|
}
|
|
1962
|
-
|
|
2692
|
+
} else {
|
|
2693
|
+
const favorite = curData[index];
|
|
2694
|
+
if (Array.isArray(tab)) {
|
|
2695
|
+
if (tab.length === 0) {
|
|
2696
|
+
curData.splice(index, 1);
|
|
2697
|
+
} else {
|
|
2698
|
+
curData[index] = { ...favorite, tabs: tab };
|
|
2699
|
+
}
|
|
2700
|
+
} else {
|
|
2701
|
+
if (remove) {
|
|
2702
|
+
const tabs2 = favorite.tabs.filter((tab2) => tab2.id != tab2.id);
|
|
2703
|
+
if (tabs2.length === 0) {
|
|
2704
|
+
curData.splice(index, 1);
|
|
2705
|
+
} else {
|
|
2706
|
+
curData[index] = { ...favorite, tabs: tabs2 };
|
|
2707
|
+
}
|
|
2708
|
+
} else {
|
|
2709
|
+
const tabs2 = favorite.tabs;
|
|
2710
|
+
tabs2.push(tab);
|
|
2711
|
+
curData[index] = { ...favorite, tabs: tabs2 };
|
|
2712
|
+
}
|
|
2713
|
+
}
|
|
2714
|
+
}
|
|
2715
|
+
configStore.set(marketsKey, {
|
|
2716
|
+
...configStore.getOr(marketsKey, {}),
|
|
2717
|
+
"favorites": curData
|
|
1963
2718
|
});
|
|
1964
|
-
|
|
1965
|
-
|
|
2719
|
+
setFavorites(() => curData);
|
|
2720
|
+
};
|
|
2721
|
+
const getData = (type2) => {
|
|
2722
|
+
const localData = type2 === 0 /* FAVORITES */ ? [...favorites] : [...recent];
|
|
2723
|
+
const keys = localData.map((item) => item.name);
|
|
2724
|
+
const filter = type2 == 2 /* ALL */ ? data : data?.filter((item) => keys.includes(item.symbol));
|
|
2725
|
+
const favoritesData = [...favorites];
|
|
2726
|
+
const favoriteKeys = favoritesData.map((item) => item.name);
|
|
2727
|
+
if (filter) {
|
|
2728
|
+
for (let index = 0; index < filter.length; index++) {
|
|
2729
|
+
const element = filter[index];
|
|
2730
|
+
const isFavorite = type2 == 0 /* FAVORITES */ ? true : favoriteKeys.includes(element.symbol);
|
|
2731
|
+
const fIndex = favoritesData.findIndex((item) => item.name === element.symbol);
|
|
2732
|
+
const tabs2 = fIndex === -1 ? [] : favoritesData[fIndex].tabs;
|
|
2733
|
+
let imr = void 0;
|
|
2734
|
+
if (publicInfo) {
|
|
2735
|
+
imr = publicInfo?.[element.symbol]("base_imr");
|
|
2736
|
+
}
|
|
2737
|
+
filter[index] = {
|
|
2738
|
+
...filter[index],
|
|
2739
|
+
// @ts-ignore
|
|
2740
|
+
isFavorite,
|
|
2741
|
+
tabs: tabs2,
|
|
2742
|
+
leverage: imr ? 1 / imr : void 0
|
|
2743
|
+
};
|
|
2744
|
+
}
|
|
2745
|
+
}
|
|
2746
|
+
return filter;
|
|
2747
|
+
};
|
|
2748
|
+
const addToHistory = (symbol) => {
|
|
2749
|
+
setRecentData(symbol);
|
|
2750
|
+
};
|
|
2751
|
+
const updateSymbolFavoriteState = (symbol, tab, del = false) => {
|
|
2752
|
+
setFavoritesData(symbol, tab, del);
|
|
2753
|
+
};
|
|
2754
|
+
const markets = getData(type);
|
|
2755
|
+
const pinToTop = (symbol) => {
|
|
2756
|
+
const index = favorites.findIndex((item) => item.name === symbol.symbol);
|
|
2757
|
+
if (index !== -1) {
|
|
2758
|
+
const element = favorites[index];
|
|
2759
|
+
const list = [...favorites];
|
|
2760
|
+
list.splice(index, 1);
|
|
2761
|
+
list.unshift(element);
|
|
2762
|
+
configStore.set(marketsKey, {
|
|
2763
|
+
...configStore.getOr(marketsKey, {}),
|
|
2764
|
+
"favorites": list
|
|
2765
|
+
});
|
|
2766
|
+
setFavorites(list);
|
|
2767
|
+
}
|
|
2768
|
+
};
|
|
2769
|
+
const tabs = useMemo(() => {
|
|
2770
|
+
return favoriteTabs;
|
|
2771
|
+
}, [favoriteTabs]);
|
|
2772
|
+
const getLastSelFavTab = () => {
|
|
2773
|
+
const curData = configStore.get(marketsKey)["lastSelectedFavoriteTab"];
|
|
2774
|
+
return curData || { name: "Popular", id: 1 };
|
|
2775
|
+
};
|
|
2776
|
+
const updateSelectedFavoriteTab = (tab) => {
|
|
2777
|
+
configStore.set(marketsKey, {
|
|
2778
|
+
...configStore.getOr(marketsKey, {}),
|
|
2779
|
+
lastSelectedFavoriteTab: tab
|
|
2780
|
+
});
|
|
2781
|
+
};
|
|
2782
|
+
return [
|
|
2783
|
+
markets || [],
|
|
2784
|
+
{
|
|
2785
|
+
favoriteTabs: tabs,
|
|
2786
|
+
favorites,
|
|
2787
|
+
recent,
|
|
2788
|
+
addToHistory,
|
|
2789
|
+
// updateFavoriteTabs("tab", operator: {add/update/delete})
|
|
2790
|
+
updateFavoriteTabs,
|
|
2791
|
+
updateSymbolFavoriteState,
|
|
2792
|
+
pinToTop,
|
|
2793
|
+
getLastSelFavTab,
|
|
2794
|
+
updateSelectedFavoriteTab
|
|
2795
|
+
}
|
|
2796
|
+
];
|
|
1966
2797
|
};
|
|
1967
2798
|
var useLeverage = () => {
|
|
1968
2799
|
const { data, mutate: mutate2 } = usePrivateQuery("/v1/client/info");
|
|
@@ -2083,7 +2914,7 @@ var useMarketTradeStream = (symbol, options = {}) => {
|
|
|
2083
2914
|
return { data: trades, isLoading };
|
|
2084
2915
|
};
|
|
2085
2916
|
var useMarginRatio = () => {
|
|
2086
|
-
const [{ rows }] = usePositionStream();
|
|
2917
|
+
const [{ rows, aggregated }] = usePositionStream();
|
|
2087
2918
|
const { data: markPrices } = useMarkPricesStream();
|
|
2088
2919
|
const { totalCollateral } = useCollateral();
|
|
2089
2920
|
const marginRatio = useMemo(() => {
|
|
@@ -2100,7 +2931,20 @@ var useMarginRatio = () => {
|
|
|
2100
2931
|
const currentLeverage = useMemo(() => {
|
|
2101
2932
|
return account.currentLeverage(marginRatio);
|
|
2102
2933
|
}, [marginRatio]);
|
|
2103
|
-
|
|
2934
|
+
const mmr = useMemo(() => {
|
|
2935
|
+
if (!rows || rows.length <= 0)
|
|
2936
|
+
return null;
|
|
2937
|
+
let positionsMM = zero;
|
|
2938
|
+
for (let index = 0; index < rows.length; index++) {
|
|
2939
|
+
const item = rows[index];
|
|
2940
|
+
positionsMM = positionsMM.add(item.mm);
|
|
2941
|
+
}
|
|
2942
|
+
return account.MMR({
|
|
2943
|
+
positionsMMR: positionsMM.toNumber(),
|
|
2944
|
+
positionsNotional: aggregated.notional
|
|
2945
|
+
});
|
|
2946
|
+
}, [rows, aggregated]);
|
|
2947
|
+
return { marginRatio, currentLeverage, mmr };
|
|
2104
2948
|
};
|
|
2105
2949
|
|
|
2106
2950
|
// src/woo/constants.ts
|
|
@@ -3116,53 +3960,41 @@ var woofiDexCrossChainRouterAbi = [
|
|
|
3116
3960
|
];
|
|
3117
3961
|
var nativeTokenAddress = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
|
|
3118
3962
|
var isNativeTokenChecker = (address) => address === nativeTokenAddress;
|
|
3119
|
-
|
|
3120
|
-
// src/orderly/useChains.ts
|
|
3121
3963
|
var useChains = (networkId, options = {}) => {
|
|
3122
|
-
const {
|
|
3123
|
-
const { configStore
|
|
3964
|
+
const { pick: pick3, crossEnabled, wooSwapEnabled, ...swrOptions } = options;
|
|
3965
|
+
const { configStore } = useContext(OrderlyContext);
|
|
3124
3966
|
const field = options?.pick;
|
|
3967
|
+
const filterFun = useRef(options?.filter);
|
|
3968
|
+
filterFun.current = options?.filter;
|
|
3125
3969
|
const map = useRef(
|
|
3126
3970
|
/* @__PURE__ */ new Map()
|
|
3127
3971
|
);
|
|
3128
|
-
const
|
|
3972
|
+
const commonSwrOpts = {
|
|
3973
|
+
revalidateIfStale: false,
|
|
3974
|
+
revalidateOnFocus: false,
|
|
3975
|
+
revalidateOnReconnect: false,
|
|
3976
|
+
// If false, undefined data gets cached against the key.
|
|
3977
|
+
revalidateOnMount: true,
|
|
3978
|
+
// dont duplicate a request w/ same key for 1hr
|
|
3979
|
+
dedupingInterval: 36e5,
|
|
3980
|
+
...swrOptions
|
|
3981
|
+
};
|
|
3982
|
+
const { data: wooSupportData, error: swapSupportError } = useSWR(
|
|
3129
3983
|
() => wooSwapEnabled ? `${configStore.get("swapSupportApiUrl")}/swap_support` : null,
|
|
3130
|
-
// `${configStore.get("swapSupportApiUrl")}/swap_support`,
|
|
3131
3984
|
(url) => fetch(url).then((res) => res.json()),
|
|
3132
|
-
{
|
|
3133
|
-
revalidateIfStale: false,
|
|
3134
|
-
revalidateOnFocus: false,
|
|
3135
|
-
revalidateOnReconnect: false,
|
|
3136
|
-
revalidateOnMount: true,
|
|
3137
|
-
// If false, undefined data gets cached against the key.
|
|
3138
|
-
dedupingInterval: 36e5,
|
|
3139
|
-
// dont duplicate a request w/ same key for 1hr
|
|
3140
|
-
...swrOptions
|
|
3141
|
-
}
|
|
3985
|
+
{ ...commonSwrOpts, ...swrOptions }
|
|
3142
3986
|
);
|
|
3143
3987
|
const { data: chainInfos, error: chainInfoErr } = useQuery(
|
|
3144
3988
|
"/v1/public/chain_info",
|
|
3145
3989
|
{
|
|
3146
|
-
|
|
3147
|
-
|
|
3148
|
-
revalidateOnReconnect: false,
|
|
3149
|
-
revalidateOnMount: true,
|
|
3150
|
-
dedupingInterval: 36e5,
|
|
3151
|
-
formatter: (data2) => data2.rows
|
|
3990
|
+
...commonSwrOpts,
|
|
3991
|
+
formatter: (data) => data.rows
|
|
3152
3992
|
}
|
|
3153
3993
|
);
|
|
3154
3994
|
const { data: orderlyChains, error: tokenError } = useQuery(
|
|
3155
|
-
// wooSwapEnabled ? "/v1/public/token" :
|
|
3156
3995
|
"https://api-evm.orderly.org/v1/public/token",
|
|
3157
|
-
{
|
|
3158
|
-
revalidateIfStale: false,
|
|
3159
|
-
revalidateOnFocus: false,
|
|
3160
|
-
revalidateOnReconnect: false,
|
|
3161
|
-
revalidateOnMount: true,
|
|
3162
|
-
dedupingInterval: 36e5
|
|
3163
|
-
}
|
|
3996
|
+
{ ...commonSwrOpts }
|
|
3164
3997
|
);
|
|
3165
|
-
configStore.get("apiBaseUrl");
|
|
3166
3998
|
const chains = useMemo(() => {
|
|
3167
3999
|
let orderlyChainsArr = [];
|
|
3168
4000
|
const orderlyChainIds = /* @__PURE__ */ new Set();
|
|
@@ -3177,6 +4009,7 @@ var useChains = (networkId, options = {}) => {
|
|
|
3177
4009
|
// "public_rpc_url": "https://arb1.arbitrum.io/rpc",
|
|
3178
4010
|
chain_id: chainId,
|
|
3179
4011
|
withdrawal_fee: chain.withdrawal_fee,
|
|
4012
|
+
cross_chain_withdrawal_fee: chain.cross_chain_withdrawal_fee,
|
|
3180
4013
|
bridgeless: true
|
|
3181
4014
|
},
|
|
3182
4015
|
token_infos: [
|
|
@@ -3187,13 +4020,13 @@ var useChains = (networkId, options = {}) => {
|
|
|
3187
4020
|
}
|
|
3188
4021
|
]
|
|
3189
4022
|
};
|
|
3190
|
-
if (typeof
|
|
3191
|
-
if (!
|
|
4023
|
+
if (typeof filterFun.current === "function") {
|
|
4024
|
+
if (!filterFun.current(_chain))
|
|
3192
4025
|
return;
|
|
3193
4026
|
}
|
|
3194
|
-
if (_chain.chain_id
|
|
3195
|
-
const index = testnetArr
|
|
3196
|
-
(item2) => item2.network_infos.chain_id
|
|
4027
|
+
if (isTestnet(_chain.chain_id)) {
|
|
4028
|
+
const index = testnetArr?.findIndex(
|
|
4029
|
+
(item2) => isTestnet(item2.network_infos.chain_id)
|
|
3197
4030
|
);
|
|
3198
4031
|
if (index > -1) {
|
|
3199
4032
|
testnetArr[index] = _chain;
|
|
@@ -3203,40 +4036,16 @@ var useChains = (networkId, options = {}) => {
|
|
|
3203
4036
|
orderlyChainsArr.push(_chain);
|
|
3204
4037
|
});
|
|
3205
4038
|
});
|
|
3206
|
-
let testnetArr = [
|
|
3207
|
-
|
|
3208
|
-
|
|
3209
|
-
|
|
3210
|
-
name: "Arbitrum Goerli",
|
|
3211
|
-
shortName: "Arbitrum Goerli",
|
|
3212
|
-
public_rpc_url: "https://goerli-rollup.arbitrum.io/rpc",
|
|
3213
|
-
chain_id: 421613,
|
|
3214
|
-
currency_symbol: "ETH",
|
|
3215
|
-
bridge_enable: true,
|
|
3216
|
-
mainnet: false,
|
|
3217
|
-
explorer_base_url: "https://goerli.arbiscan.io/",
|
|
3218
|
-
est_txn_mins: null,
|
|
3219
|
-
woofi_dex_cross_chain_router: "",
|
|
3220
|
-
woofi_dex_depositor: ""
|
|
3221
|
-
},
|
|
3222
|
-
token_infos: [
|
|
3223
|
-
{
|
|
3224
|
-
symbol: "USDC",
|
|
3225
|
-
address: "0xfd064A18f3BF249cf1f87FC203E90D8f650f2d63",
|
|
3226
|
-
decimals: 6,
|
|
3227
|
-
swap_enable: false,
|
|
3228
|
-
woofi_dex_precision: 2
|
|
3229
|
-
}
|
|
3230
|
-
]
|
|
3231
|
-
}
|
|
3232
|
-
];
|
|
4039
|
+
let testnetArr = [...TestnetChains];
|
|
4040
|
+
testnetArr.forEach((chain) => {
|
|
4041
|
+
map.current.set(chain.network_infos?.chain_id, chain);
|
|
4042
|
+
});
|
|
3233
4043
|
let mainnetArr = [];
|
|
3234
|
-
map.current.set(421613, testnetArr[0]);
|
|
3235
4044
|
if (wooSwapEnabled) {
|
|
3236
|
-
if (!
|
|
3237
|
-
return
|
|
3238
|
-
Object.keys(
|
|
3239
|
-
const chain =
|
|
4045
|
+
if (!wooSupportData || !wooSupportData.data)
|
|
4046
|
+
return wooSupportData;
|
|
4047
|
+
Object.keys(wooSupportData.data).forEach((key) => {
|
|
4048
|
+
const chain = wooSupportData.data[key];
|
|
3240
4049
|
const item = mergeDeepRight(chain, {
|
|
3241
4050
|
name: key,
|
|
3242
4051
|
network_infos: {
|
|
@@ -3250,8 +4059,8 @@ var useChains = (networkId, options = {}) => {
|
|
|
3250
4059
|
if (item.token_infos?.length === 0)
|
|
3251
4060
|
return;
|
|
3252
4061
|
map.current.set(item.network_infos.chain_id, item);
|
|
3253
|
-
if (typeof
|
|
3254
|
-
if (!
|
|
4062
|
+
if (typeof filterFun.current === "function") {
|
|
4063
|
+
if (!filterFun.current(item))
|
|
3255
4064
|
return;
|
|
3256
4065
|
}
|
|
3257
4066
|
if (item.network_infos.mainnet) {
|
|
@@ -3289,24 +4098,16 @@ var useChains = (networkId, options = {}) => {
|
|
|
3289
4098
|
};
|
|
3290
4099
|
}
|
|
3291
4100
|
map.current.set(_chain.network_infos.chain_id, _chain);
|
|
3292
|
-
if (_chain.network_infos.chain_id
|
|
3293
|
-
const index = testnetArr.findIndex(
|
|
3294
|
-
(item) => item.network_infos.chain_id === 421613
|
|
3295
|
-
);
|
|
3296
|
-
if (index > -1) {
|
|
3297
|
-
testnetArr[index] = _chain;
|
|
3298
|
-
}
|
|
3299
|
-
}
|
|
3300
|
-
if (_chain.network_infos.chain_id === 420) {
|
|
4101
|
+
if (isTestnet(_chain.network_infos.chain_id)) {
|
|
3301
4102
|
const index = testnetArr.findIndex(
|
|
3302
|
-
(item) => item.network_infos.chain_id
|
|
4103
|
+
(item) => isTestnet(item.network_infos.chain_id)
|
|
3303
4104
|
);
|
|
3304
4105
|
if (index > -1) {
|
|
3305
4106
|
testnetArr[index] = _chain;
|
|
3306
4107
|
}
|
|
3307
4108
|
}
|
|
3308
|
-
if (typeof
|
|
3309
|
-
if (!
|
|
4109
|
+
if (typeof filterFun.current === "function") {
|
|
4110
|
+
if (!filterFun.current(_chain))
|
|
3310
4111
|
return;
|
|
3311
4112
|
}
|
|
3312
4113
|
mainnetArr.push(_chain);
|
|
@@ -3333,10 +4134,9 @@ var useChains = (networkId, options = {}) => {
|
|
|
3333
4134
|
mainnet: mainnetArr
|
|
3334
4135
|
};
|
|
3335
4136
|
}, [
|
|
3336
|
-
|
|
4137
|
+
wooSupportData,
|
|
3337
4138
|
networkId,
|
|
3338
4139
|
field,
|
|
3339
|
-
options,
|
|
3340
4140
|
orderlyChains,
|
|
3341
4141
|
wooSwapEnabled,
|
|
3342
4142
|
chainInfos
|
|
@@ -3347,7 +4147,9 @@ var useChains = (networkId, options = {}) => {
|
|
|
3347
4147
|
if (chain) {
|
|
3348
4148
|
chain.nativeToken = chain.token_infos?.find(
|
|
3349
4149
|
(item) => item.address === nativeTokenAddress
|
|
3350
|
-
)
|
|
4150
|
+
) || {
|
|
4151
|
+
symbol: chain.network_infos?.currency_symbol
|
|
4152
|
+
};
|
|
3351
4153
|
}
|
|
3352
4154
|
if (typeof field2 === "string") {
|
|
3353
4155
|
return prop(field2, chain);
|
|
@@ -3401,7 +4203,21 @@ var useWithdraw = () => {
|
|
|
3401
4203
|
const maxAmount = useMemo(() => {
|
|
3402
4204
|
return freeCollateral;
|
|
3403
4205
|
}, [freeCollateral]);
|
|
3404
|
-
|
|
4206
|
+
const availableWithdraw = useMemo(() => {
|
|
4207
|
+
if (unsettledPnL < 0) {
|
|
4208
|
+
return freeCollateral;
|
|
4209
|
+
} else {
|
|
4210
|
+
return freeCollateral - unsettledPnL;
|
|
4211
|
+
}
|
|
4212
|
+
}, [freeCollateral, unsettledPnL]);
|
|
4213
|
+
return {
|
|
4214
|
+
withdraw,
|
|
4215
|
+
isLoading,
|
|
4216
|
+
maxAmount,
|
|
4217
|
+
availableBalance,
|
|
4218
|
+
availableWithdraw,
|
|
4219
|
+
unsettledPnL
|
|
4220
|
+
};
|
|
3405
4221
|
};
|
|
3406
4222
|
var useDeposit = (options) => {
|
|
3407
4223
|
const { enableSwapDeposit } = useContext(OrderlyContext);
|
|
@@ -3411,28 +4227,41 @@ var useDeposit = (options) => {
|
|
|
3411
4227
|
const [_, { findByChainId }] = useChains(void 0, {
|
|
3412
4228
|
wooSwapEnabled: enableSwapDeposit
|
|
3413
4229
|
});
|
|
4230
|
+
const [quantity, setQuantity] = useState("");
|
|
4231
|
+
const [depositFee, setDepositFee] = useState(0n);
|
|
4232
|
+
const [depositFeeRevalidating, setDepositFeeRevalidating] = useState(false);
|
|
3414
4233
|
const [balance, setBalance] = useState("0");
|
|
3415
4234
|
const [allowance, setAllowance] = useState("0");
|
|
3416
4235
|
const { account: account5, state } = useAccount();
|
|
3417
4236
|
const prevAddress = useRef();
|
|
3418
4237
|
const getBalanceListener = useRef();
|
|
4238
|
+
const targetChain = useMemo(() => {
|
|
4239
|
+
let chain;
|
|
4240
|
+
if (networkId === "testnet") {
|
|
4241
|
+
chain = findByChainId(ARBITRUM_TESTNET_CHAINID);
|
|
4242
|
+
} else {
|
|
4243
|
+
chain = findByChainId(options?.srcChainId);
|
|
4244
|
+
if (!chain?.network_infos?.bridgeless) {
|
|
4245
|
+
chain = findByChainId(ARBITRUM_MAINNET_CHAINID);
|
|
4246
|
+
}
|
|
4247
|
+
}
|
|
4248
|
+
return chain;
|
|
4249
|
+
}, [networkId, findByChainId, options?.srcChainId]);
|
|
3419
4250
|
const dst = useMemo(() => {
|
|
3420
|
-
|
|
3421
|
-
const USDC = chain?.token_infos.find(
|
|
3422
|
-
(token) => token.symbol === "USDC"
|
|
3423
|
-
);
|
|
3424
|
-
if (!chain) {
|
|
4251
|
+
if (!targetChain) {
|
|
3425
4252
|
throw new Error("dst chain not found");
|
|
3426
4253
|
}
|
|
4254
|
+
const USDC = targetChain?.token_infos.find(
|
|
4255
|
+
(token) => token.symbol === "USDC"
|
|
4256
|
+
);
|
|
3427
4257
|
return {
|
|
3428
4258
|
symbol: "USDC",
|
|
3429
4259
|
address: USDC?.address,
|
|
3430
4260
|
decimals: USDC?.decimals,
|
|
3431
|
-
chainId:
|
|
3432
|
-
network:
|
|
3433
|
-
// chainId: 42161,
|
|
4261
|
+
chainId: targetChain.network_infos.chain_id,
|
|
4262
|
+
network: targetChain.network_infos.shortName
|
|
3434
4263
|
};
|
|
3435
|
-
}, [
|
|
4264
|
+
}, [targetChain]);
|
|
3436
4265
|
const isNativeToken = useMemo(
|
|
3437
4266
|
() => isNativeTokenChecker(options?.address || ""),
|
|
3438
4267
|
[options?.address]
|
|
@@ -3459,7 +4288,6 @@ var useDeposit = (options) => {
|
|
|
3459
4288
|
const balance2 = await fetchBalanceHandler(address, decimals);
|
|
3460
4289
|
setBalance(() => balance2);
|
|
3461
4290
|
} catch (e) {
|
|
3462
|
-
console.warn("----- refresh balance error -----", e);
|
|
3463
4291
|
setBalance(() => "0");
|
|
3464
4292
|
}
|
|
3465
4293
|
},
|
|
@@ -3509,18 +4337,30 @@ var useDeposit = (options) => {
|
|
|
3509
4337
|
}
|
|
3510
4338
|
}
|
|
3511
4339
|
}, [options, dst]);
|
|
4340
|
+
const queryBalance = useDebouncedCallback(
|
|
4341
|
+
(tokenAddress, decimals) => {
|
|
4342
|
+
fetchBalance(options?.address, options?.decimals).finally(() => {
|
|
4343
|
+
setBalanceRevalidating(false);
|
|
4344
|
+
});
|
|
4345
|
+
},
|
|
4346
|
+
100
|
|
4347
|
+
);
|
|
4348
|
+
const queryAllowance = useDebouncedCallback(
|
|
4349
|
+
(tokenAddress, vaultAddress) => {
|
|
4350
|
+
getAllowance(tokenAddress, vaultAddress);
|
|
4351
|
+
},
|
|
4352
|
+
100
|
|
4353
|
+
);
|
|
3512
4354
|
useEffect(() => {
|
|
3513
4355
|
if (state.status < AccountStatusEnum.Connected)
|
|
3514
4356
|
return;
|
|
3515
4357
|
setBalanceRevalidating(true);
|
|
3516
|
-
|
|
3517
|
-
setBalanceRevalidating(false);
|
|
3518
|
-
});
|
|
4358
|
+
queryBalance(options?.address, options?.decimals);
|
|
3519
4359
|
if (dst.chainId !== options?.srcChainId) {
|
|
3520
|
-
|
|
4360
|
+
queryAllowance(options?.address, options?.crossChainRouteAddress);
|
|
3521
4361
|
} else {
|
|
3522
4362
|
if (dst.symbol !== options?.srcToken) {
|
|
3523
|
-
|
|
4363
|
+
queryAllowance(options?.address, options?.depositorAddress);
|
|
3524
4364
|
} else {
|
|
3525
4365
|
getAllowanceByDefaultAddress(options?.address);
|
|
3526
4366
|
}
|
|
@@ -3537,41 +4377,72 @@ var useDeposit = (options) => {
|
|
|
3537
4377
|
dst.symbol
|
|
3538
4378
|
]);
|
|
3539
4379
|
const approve = useCallback(
|
|
3540
|
-
(amount) => {
|
|
4380
|
+
async (amount) => {
|
|
3541
4381
|
if (!options?.address) {
|
|
3542
4382
|
throw new Error("address is required");
|
|
3543
4383
|
}
|
|
3544
4384
|
const vaultAddress = getVaultAddress();
|
|
3545
4385
|
return account5.assetsManager.approve(options.address, amount, vaultAddress).then((result) => {
|
|
3546
4386
|
if (typeof amount !== "undefined") {
|
|
3547
|
-
setAllowance(
|
|
4387
|
+
setAllowance(
|
|
4388
|
+
(value) => new Decimal(value).add(amount || MaxUint256.toString()).toString()
|
|
4389
|
+
);
|
|
3548
4390
|
}
|
|
3549
4391
|
return result;
|
|
3550
4392
|
});
|
|
3551
4393
|
},
|
|
3552
4394
|
[account5, getAllowance, options?.address]
|
|
3553
4395
|
);
|
|
3554
|
-
const deposit = useCallback(
|
|
3555
|
-
(
|
|
3556
|
-
|
|
3557
|
-
|
|
3558
|
-
|
|
3559
|
-
|
|
3560
|
-
|
|
3561
|
-
},
|
|
3562
|
-
[account5, fetchBalance, getAllowance]
|
|
3563
|
-
);
|
|
4396
|
+
const deposit = useCallback(async () => {
|
|
4397
|
+
return account5.assetsManager.deposit(quantity, depositFee).then((res) => {
|
|
4398
|
+
setAllowance((value) => new Decimal(value).sub(quantity).toString());
|
|
4399
|
+
setBalance((value) => new Decimal(value).sub(quantity).toString());
|
|
4400
|
+
return res;
|
|
4401
|
+
});
|
|
4402
|
+
}, [account5, fetchBalance, getAllowance, quantity, depositFee]);
|
|
3564
4403
|
const loopGetBalance = async () => {
|
|
3565
4404
|
getBalanceListener.current && clearTimeout(getBalanceListener.current);
|
|
3566
4405
|
getBalanceListener.current = setTimeout(async () => {
|
|
3567
|
-
|
|
3568
|
-
|
|
3569
|
-
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
|
|
4406
|
+
try {
|
|
4407
|
+
const balance2 = await fetchBalanceHandler(
|
|
4408
|
+
options?.address,
|
|
4409
|
+
options?.decimals
|
|
4410
|
+
);
|
|
4411
|
+
setBalance(balance2);
|
|
4412
|
+
loopGetBalance();
|
|
4413
|
+
} catch (err) {
|
|
4414
|
+
}
|
|
3573
4415
|
}, 3e3);
|
|
3574
4416
|
};
|
|
4417
|
+
const getDepositFee = useCallback(
|
|
4418
|
+
async (quantity2) => {
|
|
4419
|
+
return account5.assetsManager.getDepositFee(
|
|
4420
|
+
quantity2,
|
|
4421
|
+
targetChain?.network_infos
|
|
4422
|
+
);
|
|
4423
|
+
},
|
|
4424
|
+
[account5, targetChain]
|
|
4425
|
+
);
|
|
4426
|
+
const enquiryDepositFee = useCallback(() => {
|
|
4427
|
+
if (isNaN(Number(quantity)) || !quantity) {
|
|
4428
|
+
setDepositFee(0n);
|
|
4429
|
+
setDepositFeeRevalidating(false);
|
|
4430
|
+
return;
|
|
4431
|
+
}
|
|
4432
|
+
setDepositFeeRevalidating(true);
|
|
4433
|
+
getDepositFee(quantity).then((res = 0n) => {
|
|
4434
|
+
const fee = BigInt(
|
|
4435
|
+
new Decimal(res.toString()).mul(DEPOSIT_FEE_RATE).toFixed(0, Decimal.ROUND_UP).toString()
|
|
4436
|
+
);
|
|
4437
|
+
setDepositFee(fee);
|
|
4438
|
+
}).catch((error) => {
|
|
4439
|
+
}).finally(() => {
|
|
4440
|
+
setDepositFeeRevalidating(false);
|
|
4441
|
+
});
|
|
4442
|
+
}, [quantity]);
|
|
4443
|
+
useEffect(() => {
|
|
4444
|
+
enquiryDepositFee();
|
|
4445
|
+
}, [quantity]);
|
|
3575
4446
|
useEffect(() => {
|
|
3576
4447
|
if (!options?.address) {
|
|
3577
4448
|
return;
|
|
@@ -3582,16 +4453,25 @@ var useDeposit = (options) => {
|
|
|
3582
4453
|
};
|
|
3583
4454
|
}, [options?.address, options?.decimals]);
|
|
3584
4455
|
return {
|
|
4456
|
+
/** orderly support chain dst */
|
|
3585
4457
|
dst,
|
|
3586
4458
|
balance,
|
|
3587
4459
|
allowance,
|
|
3588
4460
|
isNativeToken,
|
|
3589
4461
|
balanceRevalidating,
|
|
3590
4462
|
allowanceRevalidating,
|
|
4463
|
+
/** input quantiy */
|
|
4464
|
+
quantity,
|
|
4465
|
+
/** orderly deposit fee, unit: wei */
|
|
4466
|
+
depositFee,
|
|
4467
|
+
/** enquiring depositFee status on chain */
|
|
4468
|
+
depositFeeRevalidating,
|
|
3591
4469
|
approve,
|
|
3592
4470
|
deposit,
|
|
3593
4471
|
fetchBalances,
|
|
3594
|
-
fetchBalance: fetchBalanceHandler
|
|
4472
|
+
fetchBalance: fetchBalanceHandler,
|
|
4473
|
+
/** set input quantity */
|
|
4474
|
+
setQuantity
|
|
3595
4475
|
};
|
|
3596
4476
|
};
|
|
3597
4477
|
var useWalletSubscription = (options) => {
|
|
@@ -3634,6 +4514,32 @@ var useSettleSubscription = (options) => {
|
|
|
3634
4514
|
return () => unsubscribe();
|
|
3635
4515
|
});
|
|
3636
4516
|
};
|
|
4517
|
+
var useSymbolPriceRange = (symbol, side, price) => {
|
|
4518
|
+
const config = useSymbolsInfo();
|
|
4519
|
+
const priceRange = config?.[symbol]("price_range");
|
|
4520
|
+
const priceScrope = config?.[symbol]("price_scope");
|
|
4521
|
+
const { data: prices } = useMarkPricesStream();
|
|
4522
|
+
const markPrice = price || prices?.[symbol];
|
|
4523
|
+
const range = useMemo(() => {
|
|
4524
|
+
if (config === void 0 || markPrice === void 0) {
|
|
4525
|
+
return void 0;
|
|
4526
|
+
}
|
|
4527
|
+
if (priceRange === void 0 || Number.isNaN(markPrice)) {
|
|
4528
|
+
return void 0;
|
|
4529
|
+
}
|
|
4530
|
+
if (side === "BUY") {
|
|
4531
|
+
return {
|
|
4532
|
+
max: new Decimal(markPrice).mul(1 + priceRange).toNumber(),
|
|
4533
|
+
min: new Decimal(markPrice).mul(1 - priceScrope).toNumber()
|
|
4534
|
+
};
|
|
4535
|
+
}
|
|
4536
|
+
return {
|
|
4537
|
+
max: new Decimal(markPrice).mul(1 + priceScrope).toNumber(),
|
|
4538
|
+
min: new Decimal(markPrice).mul(1 - priceRange).toNumber()
|
|
4539
|
+
};
|
|
4540
|
+
}, [symbol, side, priceRange, markPrice]);
|
|
4541
|
+
return range;
|
|
4542
|
+
};
|
|
3637
4543
|
function useMediaQuery(query) {
|
|
3638
4544
|
const getMatches = (query2) => {
|
|
3639
4545
|
if (typeof window !== "undefined") {
|
|
@@ -3673,8 +4579,8 @@ var useWooSwapQuery = () => {
|
|
|
3673
4579
|
return;
|
|
3674
4580
|
start();
|
|
3675
4581
|
const params = {
|
|
3676
|
-
|
|
3677
|
-
network: "arbitrum",
|
|
4582
|
+
network: inputs.srcNetwork,
|
|
4583
|
+
// network: "arbitrum",
|
|
3678
4584
|
from_token: inputs.srcToken,
|
|
3679
4585
|
to_token: inputs.dstToken,
|
|
3680
4586
|
//account.assetsManager.usdcAddress,
|
|
@@ -4265,6 +5171,6 @@ var useSwap = () => {
|
|
|
4265
5171
|
};
|
|
4266
5172
|
};
|
|
4267
5173
|
|
|
4268
|
-
export { OrderlyConfigProvider, OrderlyContext, OrderlyProvider, WalletConnectorContext, useAccount, useAccountInfo, useAccountInstance, useBoolean, useChain, useChains, useCollateral, useConfig, useCrossSwap, useDeposit, useEventEmitter, useFundingRate, useHoldingStream, useIndexPrice, useLazyQuery, useLeverage, useLocalStorage, useMarginRatio, useMarkPrice, useMarkPricesStream, useMarketTradeStream, useMarketsStream, useMaxQty, useMediaQuery, useMutation, useOrderEntry, useOrderStream, useOrderbookStream, usePositionStream, usePreLoadData, usePrivateDataObserver, usePrivateInfiniteQuery, usePrivateQuery, useQuery, useSessionStorage, useSettleSubscription, useSwap, useSymbolsInfo, useTickerStream, useWS, useWalletConnector, useWalletSubscription, useWithdraw, useWooCrossSwapQuery, useWooSwapQuery, version_default as version };
|
|
5174
|
+
export { MarketsType, OrderlyConfigProvider, OrderlyContext, OrderlyProvider, WalletConnectorContext, useAccount, useAccountInfo, useAccountInstance, useBoolean, useChain, useChains, useCollateral, useConfig, useCrossSwap, useDeposit, useEventEmitter, useFundingRate, useHoldingStream, useIndexPrice, useLazyQuery, useLeverage, useLocalStorage, useMarginRatio, useMarkPrice, useMarkPricesStream, useMarketTradeStream, useMarkets, useMarketsStream, useMaxQty, useMediaQuery, useMutation, useOrderEntry, useOrderStream, useOrderbookStream, usePositionStream, usePreLoadData, usePrivateDataObserver, usePrivateInfiniteQuery, usePrivateQuery, useQuery, useSessionStorage, useSettleSubscription, useSwap, useSymbolPriceRange, useSymbolsInfo, useTickerStream, useWS, useWalletConnector, useWalletSubscription, useWithdraw, useWooCrossSwapQuery, useWooSwapQuery, version_default as version };
|
|
4269
5175
|
//# sourceMappingURL=out.js.map
|
|
4270
5176
|
//# sourceMappingURL=index.mjs.map
|