@orderly.network/hooks 1.2.0 → 1.3.2
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/esm/configProvider.d.ts +7 -1
- package/esm/configProvider.d.ts.map +1 -1
- package/esm/configProvider.js +44 -18
- package/esm/configProvider.js.map +1 -0
- package/esm/dataProvider.js +24 -19
- package/esm/dataProvider.js.map +1 -0
- package/esm/index.d.ts +1 -0
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +4 -1
- package/esm/index.js.map +1 -0
- package/esm/middleware/signatureMiddleware.js +9 -8
- package/esm/middleware/signatureMiddleware.js.map +1 -0
- package/esm/orderly/orderbook.service.js +39 -28
- package/esm/orderly/orderbook.service.js.map +1 -0
- package/esm/orderly/orderlyHooks.d.ts +3 -0
- package/esm/orderly/orderlyHooks.d.ts.map +1 -1
- package/esm/orderly/orderlyHooks.js +2 -0
- package/esm/orderly/orderlyHooks.js.map +1 -0
- package/esm/orderly/useAccountInfo.js +3 -1
- package/esm/orderly/useAccountInfo.js.map +1 -0
- package/esm/orderly/useChain.js +16 -9
- package/esm/orderly/useChain.js.map +1 -0
- package/esm/orderly/useChains.d.ts +11 -12
- package/esm/orderly/useChains.d.ts.map +1 -1
- package/esm/orderly/useChains.js +68 -46
- package/esm/orderly/useChains.js.map +1 -0
- package/esm/orderly/useCollateral.d.ts +3 -4
- package/esm/orderly/useCollateral.d.ts.map +1 -1
- package/esm/orderly/useCollateral.js +53 -20
- package/esm/orderly/useCollateral.js.map +1 -0
- package/esm/orderly/useDeposit.js +123 -125
- package/esm/orderly/useDeposit.js.map +1 -0
- package/esm/orderly/useFundingRate.js +14 -13
- package/esm/orderly/useFundingRate.js.map +1 -0
- package/esm/orderly/useFundingRates.js +6 -4
- package/esm/orderly/useFundingRates.js.map +1 -0
- package/esm/orderly/useHoldingStream.js +19 -15
- package/esm/orderly/useHoldingStream.js.map +1 -0
- package/esm/orderly/useIndexPrice.js +7 -5
- package/esm/orderly/useIndexPrice.js.map +1 -0
- package/esm/orderly/useLeverage.js +9 -12
- package/esm/orderly/useLeverage.js.map +1 -0
- package/esm/orderly/useMarginRatio.js +27 -13
- package/esm/orderly/useMarginRatio.js.map +1 -0
- package/esm/orderly/useMarkPrice.js +13 -7
- package/esm/orderly/useMarkPrice.js.map +1 -0
- package/esm/orderly/useMarkPricesStream.d.ts +1 -1
- package/esm/orderly/useMarkPricesStream.d.ts.map +1 -1
- package/esm/orderly/useMarkPricesStream.js +9 -8
- package/esm/orderly/useMarkPricesStream.js.map +1 -0
- package/esm/orderly/useMarketTradeStream.js +33 -18
- package/esm/orderly/useMarketTradeStream.js.map +1 -0
- package/esm/orderly/useMarkets.js +144 -81
- package/esm/orderly/useMarkets.js.map +1 -0
- package/esm/orderly/useMarketsStream.js +23 -28
- package/esm/orderly/useMarketsStream.js.map +1 -0
- package/esm/orderly/useMaxQty.d.ts +6 -0
- package/esm/orderly/useMaxQty.d.ts.map +1 -1
- package/esm/orderly/useMaxQty.js +26 -18
- package/esm/orderly/useMaxQty.js.map +1 -0
- package/esm/orderly/useOpenInterest.js +7 -5
- package/esm/orderly/useOpenInterest.js.map +1 -0
- package/esm/orderly/useOrderEntry.js +182 -160
- package/esm/orderly/useOrderEntry.js.map +1 -0
- package/esm/orderly/useOrderStream.js +85 -66
- package/esm/orderly/useOrderStream.js.map +1 -0
- package/esm/orderly/useOrderbookStream.d.ts +2 -3
- package/esm/orderly/useOrderbookStream.d.ts.map +1 -1
- package/esm/orderly/useOrderbookStream.js +173 -103
- package/esm/orderly/useOrderbookStream.js.map +1 -0
- package/esm/orderly/usePositionStream.js +82 -62
- package/esm/orderly/usePositionStream.js.map +1 -0
- package/esm/orderly/usePrivateDataObserver.js +55 -48
- package/esm/orderly/usePrivateDataObserver.js.map +1 -0
- package/esm/orderly/useSettleSubscription.js +8 -6
- package/esm/orderly/useSettleSubscription.js.map +1 -0
- package/esm/orderly/useSymbolPriceRange.js +14 -8
- package/esm/orderly/useSymbolPriceRange.js.map +1 -0
- package/esm/orderly/useSymbolsInfo.js +7 -5
- package/esm/orderly/useSymbolsInfo.js.map +1 -0
- package/esm/orderly/useTickerStream.d.ts +5 -1
- package/esm/orderly/useTickerStream.d.ts.map +1 -1
- package/esm/orderly/useTickerStream.js +26 -29
- package/esm/orderly/useTickerStream.js.map +1 -0
- package/esm/orderly/useWalletSubscription.js +8 -6
- package/esm/orderly/useWalletSubscription.js.map +1 -0
- package/esm/orderly/useWithdraw.js +19 -11
- package/esm/orderly/useWithdraw.js.map +1 -0
- package/esm/orderlyContext.d.ts +8 -1
- package/esm/orderlyContext.d.ts.map +1 -1
- package/esm/orderlyContext.js +2 -1
- package/esm/orderlyContext.js.map +1 -0
- package/esm/services/dataCenter.js +10 -8
- package/esm/services/dataCenter.js.map +1 -0
- package/esm/services/painter/backgroundPaint.js +11 -14
- package/esm/services/painter/backgroundPaint.js.map +1 -0
- package/esm/services/painter/basePaint.js +5 -1
- package/esm/services/painter/basePaint.js.map +1 -0
- package/esm/services/painter/dataPaint.js +53 -50
- package/esm/services/painter/dataPaint.js.map +1 -0
- package/esm/services/painter/layout.config.js +15 -13
- package/esm/services/painter/layout.config.js.map +1 -0
- package/esm/services/painter/painter.js +14 -13
- package/esm/services/painter/painter.js.map +1 -0
- package/esm/services/painter/resource.js +6 -4
- package/esm/services/painter/resource.js.map +1 -0
- package/esm/statusProvider.js +10 -3
- package/esm/statusProvider.js.map +1 -0
- package/esm/unuse/apiPrefixMiddleware.js +18 -16
- package/esm/unuse/apiPrefixMiddleware.js.map +1 -0
- package/esm/unuse/fn.js +3 -1
- package/esm/unuse/fn.js.map +1 -0
- package/esm/unuse/useBalance.js +6 -4
- package/esm/unuse/useBalance.js.map +1 -0
- package/esm/unuse/useFetures.js +26 -18
- package/esm/unuse/useFetures.js.map +1 -0
- package/esm/unuse/useRunOnce.js +10 -7
- package/esm/unuse/useRunOnce.js.map +1 -0
- package/esm/unuse/useSyncEnd.js +5 -4
- package/esm/unuse/useSyncEnd.js.map +1 -0
- package/esm/unuse/useTokenInfo.js +7 -5
- package/esm/unuse/useTokenInfo.js.map +1 -0
- package/esm/unuse/useUnsettlementPnL.js +7 -3
- package/esm/unuse/useUnsettlementPnL.js.map +1 -0
- package/esm/useAccount.js +18 -21
- package/esm/useAccount.js.map +1 -0
- package/esm/useAccountInstance.js +6 -7
- package/esm/useAccountInstance.js.map +1 -0
- package/esm/useBoolean.js +14 -5
- package/esm/useBoolean.js.map +1 -0
- package/esm/useConfig.js +3 -1
- package/esm/useConfig.js.map +1 -0
- package/esm/useEventEmitter.js +4 -2
- package/esm/useEventEmitter.js.map +1 -0
- package/esm/useLazyQuery.js +6 -7
- package/esm/useLazyQuery.js.map +1 -0
- package/esm/useLocalStorage.js +30 -20
- package/esm/useLocalStorage.js.map +1 -0
- package/esm/useMediaQuery.js +11 -9
- package/esm/useMediaQuery.js.map +1 -0
- package/esm/useMutation.js +26 -37
- package/esm/useMutation.js.map +1 -0
- package/esm/useObserve.js +4 -4
- package/esm/useObserve.js.map +1 -0
- package/esm/useParamsCheck.js +8 -10
- package/esm/useParamsCheck.js.map +1 -0
- package/esm/usePoster.js +56 -45
- package/esm/usePoster.js.map +1 -0
- package/esm/usePreloadData.js +9 -5
- package/esm/usePreloadData.js.map +1 -0
- package/esm/usePrivateInfiniteQuery.js +15 -9
- package/esm/usePrivateInfiniteQuery.js.map +1 -0
- package/esm/usePrivateQuery.js +15 -8
- package/esm/usePrivateQuery.js.map +1 -0
- package/esm/useQuery.js +6 -5
- package/esm/useQuery.js.map +1 -0
- package/esm/useSessionStorage.js +28 -19
- package/esm/useSessionStorage.js.map +1 -0
- package/esm/useWS.js +15 -13
- package/esm/useWS.js.map +1 -0
- package/esm/useWsStatus.js +12 -12
- package/esm/useWsStatus.js.map +1 -0
- package/esm/utils/createGetter.js +8 -8
- package/esm/utils/createGetter.js.map +1 -0
- package/esm/utils/createOrder.d.ts +1 -0
- package/esm/utils/createOrder.d.ts.map +1 -1
- package/esm/utils/createOrder.js +59 -43
- package/esm/utils/createOrder.js.map +1 -0
- package/esm/utils/dev.js +6 -4
- package/esm/utils/dev.js.map +1 -0
- package/esm/utils/fetcher.js +3 -1
- package/esm/utils/fetcher.js.map +1 -0
- package/esm/utils/json.js +3 -2
- package/esm/utils/json.js.map +1 -0
- package/esm/utils/orderEntryHelper.js +92 -63
- package/esm/utils/orderEntryHelper.js.map +1 -0
- package/esm/utils/parseHolding.js +10 -6
- package/esm/utils/parseHolding.js.map +1 -0
- package/esm/utils/swr.js +114 -104
- package/esm/utils/swr.js.map +1 -0
- package/esm/version.d.ts +1 -1
- package/esm/version.js +4 -3
- package/esm/version.js.map +1 -0
- package/esm/walletConnectorContext.js +4 -2
- package/esm/walletConnectorContext.js.map +1 -0
- package/lib/configProvider.d.ts +7 -1
- package/lib/configProvider.d.ts.map +1 -1
- package/lib/configProvider.js +108 -56
- package/lib/configProvider.js.map +1 -0
- package/lib/dataProvider.js +50 -29
- package/lib/dataProvider.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +191 -88
- package/lib/index.js.map +1 -0
- package/lib/middleware/signatureMiddleware.js +22 -15
- package/lib/middleware/signatureMiddleware.js.map +1 -0
- package/lib/orderly/orderbook.service.js +59 -33
- package/lib/orderly/orderbook.service.js.map +1 -0
- package/lib/orderly/orderlyHooks.d.ts +3 -0
- package/lib/orderly/orderlyHooks.d.ts.map +1 -1
- package/lib/orderly/orderlyHooks.js +124 -57
- package/lib/orderly/orderlyHooks.js.map +1 -0
- package/lib/orderly/useAccountInfo.js +14 -6
- package/lib/orderly/useAccountInfo.js.map +1 -0
- package/lib/orderly/useChain.js +30 -17
- package/lib/orderly/useChain.js.map +1 -0
- package/lib/orderly/useChains.d.ts +11 -12
- package/lib/orderly/useChains.d.ts.map +1 -1
- package/lib/orderly/useChains.js +100 -59
- package/lib/orderly/useChains.js.map +1 -0
- package/lib/orderly/useCollateral.d.ts +3 -4
- package/lib/orderly/useCollateral.d.ts.map +1 -1
- package/lib/orderly/useCollateral.js +81 -42
- package/lib/orderly/useCollateral.js.map +1 -0
- package/lib/orderly/useDeposit.js +154 -150
- package/lib/orderly/useDeposit.js.map +1 -0
- package/lib/orderly/useFundingRate.js +29 -22
- package/lib/orderly/useFundingRate.js.map +1 -0
- package/lib/orderly/useFundingRates.js +19 -11
- package/lib/orderly/useFundingRates.js.map +1 -0
- package/lib/orderly/useHoldingStream.js +39 -27
- package/lib/orderly/useHoldingStream.js.map +1 -0
- package/lib/orderly/useIndexPrice.js +24 -14
- package/lib/orderly/useIndexPrice.js.map +1 -0
- package/lib/orderly/useLeverage.js +27 -24
- package/lib/orderly/useLeverage.js.map +1 -0
- package/lib/orderly/useMarginRatio.js +49 -29
- package/lib/orderly/useMarginRatio.js.map +1 -0
- package/lib/orderly/useMarkPrice.js +26 -15
- package/lib/orderly/useMarkPrice.js.map +1 -0
- package/lib/orderly/useMarkPricesStream.d.ts +1 -1
- package/lib/orderly/useMarkPricesStream.d.ts.map +1 -1
- package/lib/orderly/useMarkPricesStream.js +26 -17
- package/lib/orderly/useMarkPricesStream.js.map +1 -0
- package/lib/orderly/useMarketTradeStream.js +47 -26
- package/lib/orderly/useMarketTradeStream.js.map +1 -0
- package/lib/orderly/useMarkets.js +172 -95
- package/lib/orderly/useMarkets.js.map +1 -0
- package/lib/orderly/useMarketsStream.js +44 -41
- package/lib/orderly/useMarketsStream.js.map +1 -0
- package/lib/orderly/useMaxQty.d.ts +6 -0
- package/lib/orderly/useMaxQty.d.ts.map +1 -1
- package/lib/orderly/useMaxQty.js +52 -43
- package/lib/orderly/useMaxQty.js.map +1 -0
- package/lib/orderly/useOpenInterest.js +24 -14
- package/lib/orderly/useOpenInterest.js.map +1 -0
- package/lib/orderly/useOrderEntry.js +238 -210
- package/lib/orderly/useOrderEntry.js.map +1 -0
- package/lib/orderly/useOrderStream.js +111 -84
- package/lib/orderly/useOrderStream.js.map +1 -0
- package/lib/orderly/useOrderbookStream.d.ts +2 -3
- package/lib/orderly/useOrderbookStream.d.ts.map +1 -1
- package/lib/orderly/useOrderbookStream.js +227 -148
- package/lib/orderly/useOrderbookStream.js.map +1 -0
- package/lib/orderly/usePositionStream.js +134 -100
- package/lib/orderly/usePositionStream.js.map +1 -0
- package/lib/orderly/usePrivateDataObserver.js +76 -63
- package/lib/orderly/usePrivateDataObserver.js.map +1 -0
- package/lib/orderly/useSettleSubscription.js +25 -15
- package/lib/orderly/useSettleSubscription.js.map +1 -0
- package/lib/orderly/useSymbolPriceRange.js +29 -23
- package/lib/orderly/useSymbolPriceRange.js.map +1 -0
- package/lib/orderly/useSymbolsInfo.js +23 -15
- package/lib/orderly/useSymbolsInfo.js.map +1 -0
- package/lib/orderly/useTickerStream.d.ts +5 -1
- package/lib/orderly/useTickerStream.d.ts.map +1 -1
- package/lib/orderly/useTickerStream.js +51 -48
- package/lib/orderly/useTickerStream.js.map +1 -0
- package/lib/orderly/useWalletSubscription.js +25 -15
- package/lib/orderly/useWalletSubscription.js.map +1 -0
- package/lib/orderly/useWithdraw.js +36 -22
- package/lib/orderly/useWithdraw.js.map +1 -0
- package/lib/orderlyContext.d.ts +8 -1
- package/lib/orderlyContext.d.ts.map +1 -1
- package/lib/orderlyContext.js +22 -6
- package/lib/orderlyContext.js.map +1 -0
- package/lib/services/dataCenter.js +15 -11
- package/lib/services/dataCenter.js.map +1 -0
- package/lib/services/painter/backgroundPaint.js +21 -18
- package/lib/services/painter/backgroundPaint.js.map +1 -0
- package/lib/services/painter/basePaint.js +14 -4
- package/lib/services/painter/basePaint.js.map +1 -0
- package/lib/services/painter/dataPaint.js +67 -58
- package/lib/services/painter/dataPaint.js.map +1 -0
- package/lib/services/painter/layout.config.js +25 -16
- package/lib/services/painter/layout.config.js.map +1 -0
- package/lib/services/painter/painter.js +27 -20
- package/lib/services/painter/painter.js.map +1 -0
- package/lib/services/painter/resource.js +15 -7
- package/lib/services/painter/resource.js.map +1 -0
- package/lib/statusProvider.js +31 -10
- package/lib/statusProvider.js.map +1 -0
- package/lib/unuse/apiPrefixMiddleware.js +30 -22
- package/lib/unuse/apiPrefixMiddleware.js.map +1 -0
- package/lib/unuse/fn.js +14 -5
- package/lib/unuse/fn.js.map +1 -0
- package/lib/unuse/useBalance.js +23 -13
- package/lib/unuse/useBalance.js.map +1 -0
- package/lib/unuse/useFetures.js +41 -28
- package/lib/unuse/useFetures.js.map +1 -0
- package/lib/unuse/useRunOnce.js +61 -11
- package/lib/unuse/useRunOnce.js.map +1 -0
- package/lib/unuse/useSyncEnd.js +17 -10
- package/lib/unuse/useSyncEnd.js.map +1 -0
- package/lib/unuse/useTokenInfo.js +20 -12
- package/lib/unuse/useTokenInfo.js.map +1 -0
- package/lib/unuse/useUnsettlementPnL.js +21 -11
- package/lib/unuse/useUnsettlementPnL.js.map +1 -0
- package/lib/useAccount.js +32 -29
- package/lib/useAccount.js.map +1 -0
- package/lib/useAccountInstance.js +27 -20
- package/lib/useAccountInstance.js.map +1 -0
- package/lib/useBoolean.js +25 -10
- package/lib/useBoolean.js.map +1 -0
- package/lib/useConfig.js +15 -7
- package/lib/useConfig.js.map +1 -0
- package/lib/useEventEmitter.js +23 -13
- package/lib/useEventEmitter.js.map +1 -0
- package/lib/useLazyQuery.js +25 -23
- package/lib/useLazyQuery.js.map +1 -0
- package/lib/useLocalStorage.js +44 -28
- package/lib/useLocalStorage.js.map +1 -0
- package/lib/useMediaQuery.js +22 -14
- package/lib/useMediaQuery.js.map +1 -0
- package/lib/useMutation.js +47 -52
- package/lib/useMutation.js.map +1 -0
- package/lib/useObserve.js +22 -8
- package/lib/useObserve.js.map +1 -0
- package/lib/useParamsCheck.js +18 -14
- package/lib/useParamsCheck.js.map +1 -0
- package/lib/usePoster.js +80 -74
- package/lib/usePoster.js.map +1 -0
- package/lib/usePreloadData.js +21 -11
- package/lib/usePreloadData.js.map +1 -0
- package/lib/usePrivateInfiniteQuery.js +36 -22
- package/lib/usePrivateInfiniteQuery.js.map +1 -0
- package/lib/usePrivateQuery.js +35 -25
- package/lib/usePrivateQuery.js.map +1 -0
- package/lib/useQuery.js +24 -20
- package/lib/useQuery.js.map +1 -0
- package/lib/useSessionStorage.js +41 -26
- package/lib/useSessionStorage.js.map +1 -0
- package/lib/useWS.js +42 -32
- package/lib/useWS.js.map +1 -0
- package/lib/useWsStatus.js +34 -20
- package/lib/useWsStatus.js.map +1 -0
- package/lib/utils/createGetter.js +19 -14
- package/lib/utils/createGetter.js.map +1 -0
- package/lib/utils/createOrder.d.ts +1 -0
- package/lib/utils/createOrder.d.ts.map +1 -1
- package/lib/utils/createOrder.js +133 -82
- package/lib/utils/createOrder.js.map +1 -0
- package/lib/utils/dev.js +13 -9
- package/lib/utils/dev.js.map +1 -0
- package/lib/utils/fetcher.js +13 -5
- package/lib/utils/fetcher.js.map +1 -0
- package/lib/utils/json.js +12 -5
- package/lib/utils/json.js.map +1 -0
- package/lib/utils/orderEntryHelper.js +125 -82
- package/lib/utils/orderEntryHelper.js.map +1 -0
- package/lib/utils/parseHolding.js +19 -9
- package/lib/utils/parseHolding.js.map +1 -0
- package/lib/utils/swr.js +134 -111
- package/lib/utils/swr.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +13 -4
- package/lib/version.js.map +1 -0
- package/lib/walletConnectorContext.js +23 -7
- package/lib/walletConnectorContext.js.map +1 -0
- package/package.json +17 -9
|
@@ -4,39 +4,44 @@ import { useMarkPrice } from "./useMarkPrice";
|
|
|
4
4
|
import { useWS } from "../useWS";
|
|
5
5
|
import { useEventEmitter } from "../useEventEmitter";
|
|
6
6
|
import { useSymbolsInfo } from "./useSymbolsInfo";
|
|
7
|
-
import { Decimal } from "@orderly.network/utils";
|
|
7
|
+
import { Decimal, removeTrailingZeros } from "@orderly.network/utils";
|
|
8
8
|
import { min } from "ramda";
|
|
9
9
|
import { SDKError } from "@orderly.network/types";
|
|
10
10
|
import orderbooksService from './orderbook.service';
|
|
11
|
-
const paddingFn = (len)
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
const paddingFn = (len)=>Array(len).fill([
|
|
12
|
+
Number.NaN,
|
|
13
|
+
Number.NaN,
|
|
14
|
+
Number.NaN,
|
|
15
|
+
Number.NaN
|
|
16
|
+
]);
|
|
17
|
+
const asksSortFn = (a, b)=>a[0] - b[0];
|
|
18
|
+
const bidsSortFn = (a, b)=>b[0] - a[0];
|
|
14
19
|
// const commonSortFn = (a: OrderBookItem, b: OrderBookItem) => b[0] - a[0];
|
|
15
|
-
const reduceItems = (depth, level, data, asks = false)
|
|
20
|
+
const reduceItems = (depth, level, data, asks = false)=>{
|
|
16
21
|
if (!Array.isArray(data) || data.length === 0) {
|
|
17
22
|
return [];
|
|
18
23
|
}
|
|
19
|
-
let newData = [
|
|
24
|
+
let newData = [
|
|
25
|
+
...data
|
|
26
|
+
];
|
|
20
27
|
const result = [];
|
|
21
28
|
//
|
|
22
29
|
if (typeof depth !== "undefined") {
|
|
23
30
|
const prices = new Map();
|
|
24
|
-
for
|
|
31
|
+
for(let i = 0; i < data.length; i++){
|
|
25
32
|
const [price, quantity] = data[i];
|
|
26
|
-
if (isNaN(price) || isNaN(quantity))
|
|
27
|
-
continue;
|
|
33
|
+
if (isNaN(price) || isNaN(quantity)) continue;
|
|
28
34
|
let priceKey;
|
|
29
35
|
if (asks) {
|
|
30
36
|
priceKey = new Decimal(Math.ceil(price / depth)).mul(depth).toNumber();
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
37
|
+
} else {
|
|
33
38
|
priceKey = new Decimal(Math.floor(price / depth)).mul(depth).toNumber();
|
|
34
39
|
}
|
|
35
40
|
if (depth < 1 && depth > 0 && priceKey.toString().indexOf(".") !== -1) {
|
|
36
41
|
const priceStr = price.toString();
|
|
37
42
|
const index = priceStr.indexOf(".");
|
|
38
43
|
const decimal = priceStr.slice(index + 1);
|
|
39
|
-
const decimalDepth = depth.toString().slice(2).length;
|
|
44
|
+
const decimalDepth = removeTrailingZeros(depth).toString().slice(2).length;
|
|
40
45
|
const decimalStr = decimal.slice(0, min(decimal.length, decimalDepth));
|
|
41
46
|
priceKey = new Decimal(priceStr.slice(0, index) + "." + decimalStr).toNumber();
|
|
42
47
|
}
|
|
@@ -46,30 +51,35 @@ const reduceItems = (depth, level, data, asks = false) => {
|
|
|
46
51
|
const item = prices.get(priceKey);
|
|
47
52
|
const itemPrice = new Decimal(item[1]).add(quantity).toNumber();
|
|
48
53
|
// prices.push([price, quantity]);
|
|
49
|
-
prices.set(priceKey, [
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
54
|
+
prices.set(priceKey, [
|
|
55
|
+
priceKey,
|
|
56
|
+
itemPrice
|
|
57
|
+
]);
|
|
58
|
+
} else {
|
|
59
|
+
prices.set(priceKey, [
|
|
60
|
+
priceKey,
|
|
61
|
+
quantity
|
|
62
|
+
]);
|
|
53
63
|
}
|
|
54
64
|
}
|
|
55
65
|
newData = Array.from(prices.values());
|
|
56
66
|
}
|
|
57
|
-
for
|
|
67
|
+
for(let i = 0; i < newData.length; i++){
|
|
58
68
|
const [price, quantity] = newData[i];
|
|
59
|
-
if (isNaN(price) || isNaN(quantity))
|
|
60
|
-
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
69
|
+
if (isNaN(price) || isNaN(quantity)) continue;
|
|
70
|
+
const newQuantity = new Decimal(quantity).add(result.length > 0 ? result[result.length - 1][2] : 0).toNumber();
|
|
71
|
+
const newAmount = new Decimal(quantity * price).add(result.length > 0 ? result[result.length - 1][3] : 0).toNumber();
|
|
72
|
+
result.push([
|
|
73
|
+
price,
|
|
74
|
+
quantity,
|
|
75
|
+
newQuantity,
|
|
76
|
+
newAmount
|
|
77
|
+
]);
|
|
78
|
+
// if the total is greater than the level, break
|
|
79
|
+
// TODO:
|
|
80
|
+
// if (i + 1 >= level) {
|
|
81
|
+
// break;
|
|
82
|
+
// }
|
|
73
83
|
}
|
|
74
84
|
return result;
|
|
75
85
|
};
|
|
@@ -78,8 +88,7 @@ const reduceItems = (depth, level, data, asks = false) => {
|
|
|
78
88
|
* @param depth
|
|
79
89
|
* @param level
|
|
80
90
|
* @param data
|
|
81
|
-
*/
|
|
82
|
-
export const reduceOrderbook = (depth, level, padding, data) => {
|
|
91
|
+
*/ export const reduceOrderbook = (depth, level, padding, data)=>{
|
|
83
92
|
let asks = reduceItems(depth, level, data.asks, true);
|
|
84
93
|
let bids = reduceItems(depth, level, data.bids);
|
|
85
94
|
/// not empty and asks.price <= bids.price
|
|
@@ -87,17 +96,21 @@ export const reduceOrderbook = (depth, level, padding, data) => {
|
|
|
87
96
|
if (asks.length === 1) {
|
|
88
97
|
const [price, qty, newQuantity, newAmount] = asks[0];
|
|
89
98
|
asks.shift();
|
|
90
|
-
asks.push([
|
|
91
|
-
|
|
92
|
-
|
|
99
|
+
asks.push([
|
|
100
|
+
price + (depth === undefined ? 0 : depth),
|
|
101
|
+
qty,
|
|
102
|
+
newQuantity,
|
|
103
|
+
newAmount
|
|
104
|
+
]);
|
|
105
|
+
} else {
|
|
93
106
|
const [bidPrice] = bids[0];
|
|
94
|
-
while
|
|
107
|
+
while(asks.length > 0){
|
|
95
108
|
const [askPrice, askQty, newQuantity, newAmount] = asks[0];
|
|
96
109
|
if (askPrice <= bidPrice) {
|
|
97
110
|
// console.log("xxxxxxxxxxx reset ask list begin", [...asks], { ...asks[0] });
|
|
98
111
|
asks.shift();
|
|
99
112
|
let logStr = "";
|
|
100
|
-
for
|
|
113
|
+
for(let index = 0; index < asks.length; index++){
|
|
101
114
|
if (index === 0) {
|
|
102
115
|
const quantity = asks[index][1] + askQty;
|
|
103
116
|
asks[index][1] = quantity;
|
|
@@ -105,17 +118,15 @@ export const reduceOrderbook = (depth, level, padding, data) => {
|
|
|
105
118
|
// asks[index][3] += newAmount;
|
|
106
119
|
// FIXME: fix this code later
|
|
107
120
|
asks[index][3] = Math.ceil(quantity) * asks[index][0];
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
121
|
+
} else {
|
|
110
122
|
// asks[index][3] += newAmount;
|
|
111
123
|
// FIXME: fix this code later
|
|
112
124
|
asks[index][3] = asks[index][0] * asks[index][1] + asks[index - 1][3];
|
|
113
125
|
}
|
|
114
126
|
logStr += `index: ${index} ${asks[index]}\n`;
|
|
115
127
|
}
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
128
|
+
// console.log("xxxxxxxxxxx reset ask list end", logStr);
|
|
129
|
+
} else {
|
|
119
130
|
break;
|
|
120
131
|
}
|
|
121
132
|
}
|
|
@@ -123,38 +134,32 @@ export const reduceOrderbook = (depth, level, padding, data) => {
|
|
|
123
134
|
}
|
|
124
135
|
asks = asks.reverse();
|
|
125
136
|
if (padding) {
|
|
126
|
-
asks =
|
|
127
|
-
|
|
128
|
-
bids =
|
|
129
|
-
bids.length < level ? bids.concat(paddingFn(level - bids.length)) : bids;
|
|
137
|
+
asks = asks.length < level ? paddingFn(level - asks.length).concat(asks) : asks;
|
|
138
|
+
bids = bids.length < level ? bids.concat(paddingFn(level - bids.length)) : bids;
|
|
130
139
|
}
|
|
131
140
|
return {
|
|
132
141
|
asks: asks,
|
|
133
|
-
bids: bids
|
|
142
|
+
bids: bids
|
|
134
143
|
};
|
|
135
144
|
};
|
|
136
|
-
const mergeItems = (data, update)
|
|
145
|
+
const mergeItems = (data, update)=>{
|
|
137
146
|
// let index = -1;
|
|
138
|
-
if (data.length === 0)
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
while (update.length > 0) {
|
|
147
|
+
if (data.length === 0) return update;
|
|
148
|
+
data = data.filter(([price])=>!isNaN(price));
|
|
149
|
+
while(update.length > 0){
|
|
142
150
|
const item = update.shift();
|
|
143
151
|
//
|
|
144
152
|
if (item) {
|
|
145
153
|
const [price, quantity] = item;
|
|
146
|
-
const index = data.findIndex(([p], index)
|
|
154
|
+
const index = data.findIndex(([p], index)=>p === price);
|
|
147
155
|
//
|
|
148
156
|
if (index === -1) {
|
|
149
|
-
if (quantity === 0)
|
|
150
|
-
continue;
|
|
157
|
+
if (quantity === 0) continue;
|
|
151
158
|
data.push(item);
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
159
|
+
} else {
|
|
154
160
|
if (quantity === 0) {
|
|
155
161
|
data.splice(index, 1);
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
162
|
+
} else {
|
|
158
163
|
data[index] = item;
|
|
159
164
|
}
|
|
160
165
|
}
|
|
@@ -162,22 +167,28 @@ const mergeItems = (data, update) => {
|
|
|
162
167
|
}
|
|
163
168
|
return data;
|
|
164
169
|
};
|
|
165
|
-
export const mergeOrderbook = (data, update)
|
|
166
|
-
let asks = [
|
|
167
|
-
|
|
170
|
+
export const mergeOrderbook = (data, update)=>{
|
|
171
|
+
let asks = [
|
|
172
|
+
...data.asks
|
|
173
|
+
];
|
|
174
|
+
let bids = [
|
|
175
|
+
...data.bids
|
|
176
|
+
];
|
|
168
177
|
asks = mergeItems(asks, update.asks).sort(asksSortFn);
|
|
169
178
|
bids = mergeItems(bids, update.bids).sort(bidsSortFn);
|
|
170
179
|
return {
|
|
171
180
|
asks: asks,
|
|
172
|
-
bids: bids
|
|
181
|
+
bids: bids
|
|
173
182
|
};
|
|
174
183
|
};
|
|
175
|
-
const INIT_DATA = {
|
|
184
|
+
const INIT_DATA = {
|
|
185
|
+
asks: [],
|
|
186
|
+
bids: []
|
|
187
|
+
};
|
|
176
188
|
/**
|
|
177
189
|
* @name useOrderbookStream
|
|
178
190
|
* @description React hook that returns the current orderbook for a given market
|
|
179
|
-
*/
|
|
180
|
-
export const useOrderbookStream = (symbol, initial = INIT_DATA, options) => {
|
|
191
|
+
*/ export const useOrderbookStream = (symbol, initial = INIT_DATA, options)=>{
|
|
181
192
|
if (!symbol) {
|
|
182
193
|
throw new SDKError("useOrderbookStream requires a symbol");
|
|
183
194
|
}
|
|
@@ -191,33 +202,57 @@ export const useOrderbookStream = (symbol, initial = INIT_DATA, options) => {
|
|
|
191
202
|
const [depth, setDepth] = useState();
|
|
192
203
|
// markPrice, lastPrice
|
|
193
204
|
const prevMiddlePrice = useRef(0);
|
|
194
|
-
const depths = useMemo(()
|
|
205
|
+
const depths = useMemo(()=>{
|
|
195
206
|
const tick = config("quote_tick");
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
207
|
+
if (typeof tick === 'undefined') return [];
|
|
208
|
+
try {
|
|
209
|
+
const base = new Decimal(tick);
|
|
210
|
+
return [
|
|
211
|
+
base.toNumber(),
|
|
212
|
+
base.mul(10).toNumber(),
|
|
213
|
+
base.mul(100).toNumber(),
|
|
214
|
+
base.mul(1000).toNumber()
|
|
215
|
+
];
|
|
216
|
+
} catch (e) {}
|
|
217
|
+
return [
|
|
218
|
+
tick
|
|
219
|
+
];
|
|
220
|
+
}, [
|
|
221
|
+
config("quote_tick")
|
|
222
|
+
]);
|
|
223
|
+
useEffect(()=>{
|
|
199
224
|
setDepth(config("quote_tick"));
|
|
200
|
-
}, [
|
|
225
|
+
}, [
|
|
226
|
+
config("quote_tick")
|
|
227
|
+
]);
|
|
201
228
|
const ws = useWS();
|
|
202
229
|
const ticker = useTickerStream(symbol);
|
|
203
230
|
const eventEmitter = useEventEmitter();
|
|
204
231
|
// const orderbookRequest =
|
|
205
|
-
useEffect(()
|
|
232
|
+
useEffect(()=>{
|
|
206
233
|
let needRequestFullOrderbook = true;
|
|
207
234
|
setIsLoading(true);
|
|
208
235
|
let orderBookUpdateSub;
|
|
209
236
|
let fullOrderBookUpdateSub;
|
|
210
237
|
orderBookUpdateSub = ws.subscribe({
|
|
211
238
|
event: "subscribe",
|
|
212
|
-
topic: `${symbol}@orderbookupdate
|
|
239
|
+
topic: `${symbol}@orderbookupdate`
|
|
213
240
|
}, {
|
|
214
|
-
formatter: (message)
|
|
215
|
-
onMessage: (message)
|
|
241
|
+
formatter: (message)=>message,
|
|
242
|
+
onMessage: (message)=>{
|
|
216
243
|
const { data: wsData, ts } = message;
|
|
217
244
|
const { asks, bids, prevTs } = wsData;
|
|
218
|
-
orderbooksService.updateOrderbook(symbol, {
|
|
245
|
+
orderbooksService.updateOrderbook(symbol, {
|
|
246
|
+
asks,
|
|
247
|
+
bids,
|
|
248
|
+
ts,
|
|
249
|
+
prevTs
|
|
250
|
+
}, ()=>needRequestFullOrderbook = true);
|
|
219
251
|
const data = orderbooksService.getRawOrderbook(symbol);
|
|
220
|
-
setData({
|
|
252
|
+
setData({
|
|
253
|
+
bids: data.bids,
|
|
254
|
+
asks: data.asks
|
|
255
|
+
});
|
|
221
256
|
}
|
|
222
257
|
});
|
|
223
258
|
if (needRequestFullOrderbook) {
|
|
@@ -227,50 +262,66 @@ export const useOrderbookStream = (symbol, initial = INIT_DATA, options) => {
|
|
|
227
262
|
id: `${symbol}@orderbook`,
|
|
228
263
|
params: {
|
|
229
264
|
type: "orderbook",
|
|
230
|
-
symbol: symbol
|
|
231
|
-
}
|
|
265
|
+
symbol: symbol
|
|
266
|
+
}
|
|
232
267
|
}, {
|
|
233
|
-
formatter: (message)
|
|
234
|
-
onMessage: (message)
|
|
268
|
+
formatter: (message)=>message,
|
|
269
|
+
onMessage: (message)=>{
|
|
235
270
|
const { symbol, asks, bids, ts } = message.data;
|
|
236
|
-
orderbooksService.setFullOrderbook(symbol, {
|
|
271
|
+
orderbooksService.setFullOrderbook(symbol, {
|
|
272
|
+
asks,
|
|
273
|
+
bids,
|
|
274
|
+
ts
|
|
275
|
+
});
|
|
237
276
|
const data = orderbooksService.getRawOrderbook(symbol);
|
|
238
|
-
setData({
|
|
277
|
+
setData({
|
|
278
|
+
bids: data.bids,
|
|
279
|
+
asks: data.asks
|
|
280
|
+
});
|
|
239
281
|
setIsLoading(false);
|
|
240
|
-
}
|
|
282
|
+
}
|
|
241
283
|
});
|
|
242
284
|
needRequestFullOrderbook = false;
|
|
243
285
|
}
|
|
244
|
-
return ()
|
|
286
|
+
return ()=>{
|
|
245
287
|
// unsubscribe
|
|
246
288
|
orderBookUpdateSub?.();
|
|
247
289
|
fullOrderBookUpdateSub?.();
|
|
248
290
|
orderbooksService.resetOrderBook(symbol);
|
|
249
291
|
setData(INIT_DATA);
|
|
250
292
|
};
|
|
251
|
-
}, [
|
|
293
|
+
}, [
|
|
294
|
+
symbol
|
|
295
|
+
]);
|
|
252
296
|
// const {data:markPrices} = useMarkPricesStream();
|
|
253
297
|
const { data: markPrice } = useMarkPrice(symbol);
|
|
254
|
-
const onItemClick = useCallback((item)
|
|
298
|
+
const onItemClick = useCallback((item)=>{
|
|
255
299
|
eventEmitter.emit("orderbook:item:click", item);
|
|
256
300
|
}, []);
|
|
257
|
-
const onDepthChange = useCallback((depth)
|
|
301
|
+
const onDepthChange = useCallback((depth)=>{
|
|
258
302
|
//
|
|
259
|
-
setDepth(()
|
|
303
|
+
setDepth(()=>depth);
|
|
260
304
|
}, []);
|
|
261
305
|
const reducedData = reduceOrderbook(depth, level, padding, {
|
|
262
|
-
asks: [
|
|
263
|
-
|
|
306
|
+
asks: [
|
|
307
|
+
...data.asks
|
|
308
|
+
],
|
|
309
|
+
bids: [
|
|
310
|
+
...data.bids
|
|
311
|
+
]
|
|
264
312
|
});
|
|
265
313
|
// emit the asks0 and bids0
|
|
266
|
-
useEffect(()
|
|
314
|
+
useEffect(()=>{
|
|
267
315
|
const updateData = [
|
|
268
316
|
reducedData.asks?.[reducedData.asks.length - 1]?.[0],
|
|
269
317
|
reducedData.bids?.[0]?.[0]
|
|
270
318
|
];
|
|
271
319
|
eventEmitter.emit("orderbook:update", updateData);
|
|
272
|
-
}, [
|
|
273
|
-
|
|
320
|
+
}, [
|
|
321
|
+
reducedData.asks?.[reducedData.asks.length - 1]?.[0],
|
|
322
|
+
reducedData.bids?.[0]?.[0]
|
|
323
|
+
]);
|
|
324
|
+
const middlePrice = useMemo(()=>{
|
|
274
325
|
let asksFrist = 0, bidsFirst = 0;
|
|
275
326
|
if (data.asks.length > 0) {
|
|
276
327
|
asksFrist = reducedData.asks?.[reducedData.asks.length - 1]?.[0];
|
|
@@ -278,20 +329,39 @@ export const useOrderbookStream = (symbol, initial = INIT_DATA, options) => {
|
|
|
278
329
|
if (data.bids.length > 0) {
|
|
279
330
|
bidsFirst = data.bids[0][0];
|
|
280
331
|
}
|
|
281
|
-
if (isNaN(asksFrist) || isNaN(bidsFirst) || !ticker)
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
332
|
+
if (isNaN(asksFrist) || isNaN(bidsFirst) || !ticker) return 0;
|
|
333
|
+
return [
|
|
334
|
+
asksFrist,
|
|
335
|
+
bidsFirst,
|
|
336
|
+
ticker["24h_close"]
|
|
337
|
+
].sort()[1];
|
|
338
|
+
}, [
|
|
339
|
+
ticker?.["24h_close"],
|
|
340
|
+
data
|
|
341
|
+
]);
|
|
342
|
+
useEffect(()=>{
|
|
286
343
|
prevMiddlePrice.current = middlePrice;
|
|
287
|
-
}, [
|
|
344
|
+
}, [
|
|
345
|
+
middlePrice
|
|
346
|
+
]);
|
|
288
347
|
return [
|
|
289
348
|
{
|
|
290
349
|
asks: reducedData.asks.slice(-level),
|
|
291
350
|
bids: reducedData.bids.slice(0, level),
|
|
292
351
|
markPrice: markPrice,
|
|
293
|
-
middlePrice: [
|
|
352
|
+
middlePrice: [
|
|
353
|
+
prevMiddlePrice.current,
|
|
354
|
+
middlePrice
|
|
355
|
+
]
|
|
294
356
|
},
|
|
295
|
-
{
|
|
357
|
+
{
|
|
358
|
+
onDepthChange,
|
|
359
|
+
depth,
|
|
360
|
+
allDepths: depths,
|
|
361
|
+
isLoading,
|
|
362
|
+
onItemClick
|
|
363
|
+
}
|
|
296
364
|
];
|
|
297
365
|
};
|
|
366
|
+
|
|
367
|
+
//# sourceMappingURL=useOrderbookStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/orderly/useOrderbookStream.ts"],"sourcesContent":["import {useCallback, useEffect, useMemo, useRef, useState} from \"react\";\nimport {useTickerStream} from \"./useTickerStream\";\nimport {useMarkPrice} from \"./useMarkPrice\";\nimport {useWS} from \"../useWS\";\nimport {useEventEmitter} from \"../useEventEmitter\";\nimport {useSymbolsInfo} from \"./useSymbolsInfo\";\nimport {Decimal, removeTrailingZeros} from \"@orderly.network/utils\";\nimport {max, min} from \"ramda\";\nimport {SDKError} from \"@orderly.network/types\";\nimport orderbooksService from './orderbook.service';\n\nexport type OrderBookItem = number[];\n\nexport type OrderbookData = {\n asks: OrderBookItem[];\n bids: OrderBookItem[];\n};\n\nconst paddingFn = (len: number) =>\n Array(len).fill([Number.NaN, Number.NaN, Number.NaN, Number.NaN] as OrderBookItem);\n\nconst asksSortFn = (a: OrderBookItem, b: OrderBookItem) => a[0] - b[0];\n\nconst bidsSortFn = (a: OrderBookItem, b: OrderBookItem) => b[0] - a[0];\n\n// const commonSortFn = (a: OrderBookItem, b: OrderBookItem) => b[0] - a[0];\n\nconst reduceItems = (\n depth: number | undefined,\n level: number,\n data: OrderBookItem[],\n asks = false\n) => {\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n let newData = [...data];\n const result: OrderBookItem[] = [];\n\n //\n\n if (typeof depth !== \"undefined\") {\n const prices = new Map<number, number[]>();\n for (let i = 0; i < data.length; i++) {\n const [price, quantity] = data[i];\n if (isNaN(price) || isNaN(quantity)) continue;\n let priceKey;\n\n if (asks) {\n priceKey = new Decimal(Math.ceil(price / depth)).mul(depth).toNumber();\n } else {\n priceKey = new Decimal(Math.floor(price / depth)).mul(depth).toNumber();\n }\n\n if (depth < 1 && depth > 0 && priceKey.toString().indexOf(\".\") !== -1) {\n const priceStr = price.toString();\n const index = priceStr.indexOf(\".\");\n const decimal = priceStr.slice(index + 1);\n const decimalDepth = removeTrailingZeros(depth).toString().slice(2).length;\n const decimalStr = decimal.slice(0, min(decimal.length, decimalDepth));\n priceKey = new Decimal(\n priceStr.slice(0, index) + \".\" + decimalStr\n ).toNumber();\n }\n\n // console.log(`reduce items price: ${price}, priceKey: ${priceKey}, depth: ${depth}, resetPriceKey: ${price.toString === priceKey.toString}`);\n // console.log(`ask: ${asks} reduce items price: ${priceKey}`);\n\n if (prices.has(priceKey)) {\n const item = prices.get(priceKey)!;\n const itemPrice = new Decimal(item[1]).add(quantity).toNumber();\n\n // prices.push([price, quantity]);\n prices.set(priceKey, [priceKey, itemPrice]);\n } else {\n prices.set(priceKey, [priceKey, quantity]);\n }\n }\n\n newData = Array.from(prices.values());\n }\n\n for (let i = 0; i < newData.length; i++) {\n const [price, quantity] = newData[i];\n if (isNaN(price) || isNaN(quantity)) continue;\n\n const newQuantity = new Decimal(quantity)\n .add(result.length > 0 ? result[result.length - 1][2] : 0)\n .toNumber();\n\n const newAmount = new Decimal(quantity * price)\n .add(result.length > 0 ? result[result.length - 1][3] : 0)\n .toNumber();\n\n result.push([price, quantity, newQuantity, newAmount]);\n // if the total is greater than the level, break\n // TODO:\n // if (i + 1 >= level) {\n // break;\n // }\n }\n\n return result;\n};\n\n/**\n * @name reduceOrderbook\n * @param depth\n * @param level\n * @param data\n */\nexport const reduceOrderbook = (\n depth: number | undefined,\n level: number,\n padding: boolean,\n data: OrderbookData,\n): OrderbookData => {\n let asks = reduceItems(depth, level, data.asks, true);\n\n let bids = reduceItems(depth, level, data.bids);\n\n /// not empty and asks.price <= bids.price\n if (asks.length !== 0 && bids.length !== 0 && asks[0][0] <= bids[0][0]) {\n if (asks.length === 1) {\n const [price, qty, newQuantity, newAmount] = asks[0];\n asks.shift();\n asks.push([price + (depth === undefined ? 0 : depth), qty, newQuantity, newAmount]);\n } else {\n const [bidPrice] = bids[0];\n while (asks.length > 0) {\n const [askPrice, askQty, newQuantity, newAmount] = asks[0];\n\n\n if (askPrice <= bidPrice) {\n // console.log(\"xxxxxxxxxxx reset ask list begin\", [...asks], { ...asks[0] });\n asks.shift();\n let logStr = \"\";\n for (let index = 0; index < asks.length; index++) {\n if (index === 0) {\n const quantity = asks[index][1] + askQty;\n asks[index][1] = quantity;\n asks[index][2] = quantity;\n // asks[index][3] += newAmount;\n // FIXME: fix this code later\n asks[index][3] = Math.ceil(quantity) * asks[index][0];\n } else {\n // asks[index][3] += newAmount;\n // FIXME: fix this code later\n asks[index][3] = asks[index][0] * asks[index][1] + asks[index - 1][3];\n }\n logStr += `index: ${index} ${asks[index]}\\n`;\n }\n // console.log(\"xxxxxxxxxxx reset ask list end\", logStr);\n } else {\n break;\n }\n }\n }\n }\n\n asks = asks.reverse();\n\n if (padding) {\n asks =\n asks.length < level ? paddingFn(level - asks.length).concat(asks) : asks;\n bids =\n bids.length < level ? bids.concat(paddingFn(level - bids.length)) : bids;\n }\n\n return {\n asks: asks,\n bids: bids,\n };\n};\n\nconst mergeItems = (data: OrderBookItem[], update: OrderBookItem[]) => {\n // let index = -1;\n if (data.length === 0) return update;\n\n data = data.filter(([price]) => !isNaN(price));\n\n while (update.length > 0) {\n const item = update.shift();\n //\n if (item) {\n const [price, quantity] = item;\n\n const index = data.findIndex(([p], index) => p === price);\n //\n if (index === -1) {\n if (quantity === 0) continue;\n data.push(item);\n } else {\n if (quantity === 0) {\n data.splice(index, 1);\n } else {\n data[index] = item;\n }\n }\n }\n }\n\n return data;\n};\n\nexport const mergeOrderbook = (data: OrderbookData, update: OrderbookData) => {\n let asks = [...data.asks];\n let bids = [...data.bids];\n\n asks = mergeItems(asks, update.asks).sort(asksSortFn);\n bids = mergeItems(bids, update.bids).sort(bidsSortFn);\n\n return {\n asks: asks,\n bids: bids,\n };\n};\n\n/**\n * Configuration for the Order Book\n */\nexport type OrderbookOptions = {\n /** Indicates the number of data entries to return for ask/bid, default is 10 */\n level?: number;\n /** Whether to fill in when the actual data entries are less than the level. If filled, it will add [nan, nan, nan, nan]. Default is true */\n padding?: boolean;\n};\n\nconst INIT_DATA = {asks: [], bids: []};\n\n/**\n * @name useOrderbookStream\n * @description React hook that returns the current orderbook for a given market\n */\nexport const useOrderbookStream = (\n symbol: string,\n initial: OrderbookData = INIT_DATA,\n options?: OrderbookOptions\n) => {\n if (!symbol) {\n throw new SDKError(\"useOrderbookStream requires a symbol\");\n }\n\n const level = options?.level ?? 10;\n const padding = options?.padding ?? true;\n\n const [requestData, setRequestData] = useState<OrderbookData | null>(null);\n const [data, setData] = useState<OrderbookData>(initial);\n const [isLoading, setIsLoading] = useState(true);\n // const [level, setLevel] = useState(() => options?.level ?? 10);\n\n const config = useSymbolsInfo()[symbol];\n\n const [depth, setDepth] = useState<number | undefined>();\n\n // markPrice, lastPrice\n const prevMiddlePrice = useRef<number>(0);\n\n const depths = useMemo(() => {\n const tick = config(\"quote_tick\");\n if (typeof tick === 'undefined') return [];\n\n try {\n const base = new Decimal(tick);\n return [base.toNumber(), base.mul(10).toNumber(), base.mul(100).toNumber(), base.mul(1000).toNumber()];\n } catch (e) {\n\n }\n return [tick];\n }, [config(\"quote_tick\")]);\n\n useEffect(() => {\n setDepth(config(\"quote_tick\"));\n }, [config(\"quote_tick\")]);\n\n const ws = useWS();\n\n const ticker = useTickerStream(symbol);\n\n const eventEmitter = useEventEmitter();\n\n // const orderbookRequest =\n\n useEffect(() => {\n let needRequestFullOrderbook= true;\n setIsLoading(true);\n let orderBookUpdateSub: any;\n let fullOrderBookUpdateSub: any;\n orderBookUpdateSub = ws.subscribe(\n {\n event: \"subscribe\",\n topic: `${symbol}@orderbookupdate`,\n },\n {\n formatter: (message) => message,\n onMessage: (message: any) => {\n const {data: wsData, ts} = message;\n const {asks, bids, prevTs} = wsData;\n orderbooksService.updateOrderbook(symbol, {asks, bids, ts, prevTs}, () => needRequestFullOrderbook = true);\n\n\n const data = orderbooksService.getRawOrderbook(symbol);\n setData({bids: data.bids, asks: data.asks});\n\n }\n }\n )\n\n if ( needRequestFullOrderbook) {\n setIsLoading(true);\n\n fullOrderBookUpdateSub = ws.onceSubscribe(\n {\n event: \"request\",\n id: `${symbol}@orderbook`,\n params: {\n type: \"orderbook\",\n symbol: symbol,\n },\n },\n {\n formatter: (message) => message,\n onMessage: (message: any) => {\n const {symbol, asks, bids, ts} = message.data;\n orderbooksService.setFullOrderbook(symbol, {asks, bids, ts})\n const data = orderbooksService.getRawOrderbook(symbol);\n setData({bids: data.bids, asks: data.asks});\n\n setIsLoading(false);\n },\n }\n )\n needRequestFullOrderbook= false;\n }\n\n return () => {\n // unsubscribe\n orderBookUpdateSub?.();\n fullOrderBookUpdateSub?.();\n orderbooksService.resetOrderBook(symbol);\n setData(INIT_DATA);\n }\n\n }, [symbol]);\n\n // const {data:markPrices} = useMarkPricesStream();\n\n const {data: markPrice} = useMarkPrice(symbol);\n\n\n const onItemClick = useCallback((item: OrderBookItem) => {\n eventEmitter.emit(\"orderbook:item:click\", item);\n }, []);\n\n const onDepthChange = useCallback((depth: number) => {\n //\n setDepth(() => depth);\n }, []);\n\n\n const reducedData = reduceOrderbook(depth, level, padding, {\n asks: [...data.asks],\n bids: [...data.bids],\n });\n\n // emit the asks0 and bids0\n useEffect(() => {\n const updateData = [\n reducedData.asks?.[reducedData.asks.length - 1]?.[0],\n reducedData.bids?.[0]?.[0]\n ];\n eventEmitter.emit(\"orderbook:update\", updateData);\n }, [reducedData.asks?.[reducedData.asks.length - 1]?.[0], reducedData.bids?.[0]?.[0]]);\n\n const middlePrice = useMemo(() => {\n let asksFrist = 0,\n bidsFirst = 0;\n\n if (data.asks.length > 0) {\n asksFrist = reducedData.asks?.[reducedData.asks.length - 1]?.[0];\n }\n\n if (data.bids.length > 0) {\n bidsFirst = data.bids[0][0];\n }\n\n if (isNaN(asksFrist) || isNaN(bidsFirst) || !ticker) return 0;\n\n\n return [asksFrist, bidsFirst, ticker[\"24h_close\"]].sort()[1];\n }, [ticker?.[\"24h_close\"], data]);\n\n useEffect(() => {\n prevMiddlePrice.current = middlePrice;\n }, [middlePrice]);\n\n return [\n {\n asks: reducedData.asks.slice(-level),\n bids: reducedData.bids.slice(0, level),\n markPrice: markPrice,\n middlePrice: [prevMiddlePrice.current, middlePrice],\n },\n {onDepthChange, depth, allDepths: depths, isLoading, onItemClick},\n ];\n};\n\nexport type useOrderbookStreamReturn = ReturnType<typeof useOrderbookStream>;\n"],"names":["useCallback","useEffect","useMemo","useRef","useState","useTickerStream","useMarkPrice","useWS","useEventEmitter","useSymbolsInfo","Decimal","removeTrailingZeros","min","SDKError","orderbooksService","paddingFn","len","Array","fill","Number","NaN","asksSortFn","a","b","bidsSortFn","reduceItems","depth","level","data","asks","isArray","length","newData","result","prices","Map","i","price","quantity","isNaN","priceKey","Math","ceil","mul","toNumber","floor","toString","indexOf","priceStr","index","decimal","slice","decimalDepth","decimalStr","has","item","get","itemPrice","add","set","from","values","newQuantity","newAmount","push","reduceOrderbook","padding","bids","qty","shift","undefined","bidPrice","askPrice","askQty","logStr","reverse","concat","mergeItems","update","filter","findIndex","p","splice","mergeOrderbook","sort","INIT_DATA","useOrderbookStream","symbol","initial","options","requestData","setRequestData","setData","isLoading","setIsLoading","config","setDepth","prevMiddlePrice","depths","tick","base","e","ws","ticker","eventEmitter","needRequestFullOrderbook","orderBookUpdateSub","fullOrderBookUpdateSub","subscribe","event","topic","formatter","message","onMessage","wsData","ts","prevTs","updateOrderbook","getRawOrderbook","onceSubscribe","id","params","type","setFullOrderbook","resetOrderBook","markPrice","onItemClick","emit","onDepthChange","reducedData","updateData","middlePrice","asksFrist","bidsFirst","current","allDepths"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|