@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.
Files changed (371) hide show
  1. package/esm/configProvider.d.ts +7 -1
  2. package/esm/configProvider.d.ts.map +1 -1
  3. package/esm/configProvider.js +44 -18
  4. package/esm/configProvider.js.map +1 -0
  5. package/esm/dataProvider.js +24 -19
  6. package/esm/dataProvider.js.map +1 -0
  7. package/esm/index.d.ts +1 -0
  8. package/esm/index.d.ts.map +1 -1
  9. package/esm/index.js +4 -1
  10. package/esm/index.js.map +1 -0
  11. package/esm/middleware/signatureMiddleware.js +9 -8
  12. package/esm/middleware/signatureMiddleware.js.map +1 -0
  13. package/esm/orderly/orderbook.service.js +39 -28
  14. package/esm/orderly/orderbook.service.js.map +1 -0
  15. package/esm/orderly/orderlyHooks.d.ts +3 -0
  16. package/esm/orderly/orderlyHooks.d.ts.map +1 -1
  17. package/esm/orderly/orderlyHooks.js +2 -0
  18. package/esm/orderly/orderlyHooks.js.map +1 -0
  19. package/esm/orderly/useAccountInfo.js +3 -1
  20. package/esm/orderly/useAccountInfo.js.map +1 -0
  21. package/esm/orderly/useChain.js +16 -9
  22. package/esm/orderly/useChain.js.map +1 -0
  23. package/esm/orderly/useChains.d.ts +11 -12
  24. package/esm/orderly/useChains.d.ts.map +1 -1
  25. package/esm/orderly/useChains.js +68 -46
  26. package/esm/orderly/useChains.js.map +1 -0
  27. package/esm/orderly/useCollateral.d.ts +3 -4
  28. package/esm/orderly/useCollateral.d.ts.map +1 -1
  29. package/esm/orderly/useCollateral.js +53 -20
  30. package/esm/orderly/useCollateral.js.map +1 -0
  31. package/esm/orderly/useDeposit.js +123 -125
  32. package/esm/orderly/useDeposit.js.map +1 -0
  33. package/esm/orderly/useFundingRate.js +14 -13
  34. package/esm/orderly/useFundingRate.js.map +1 -0
  35. package/esm/orderly/useFundingRates.js +6 -4
  36. package/esm/orderly/useFundingRates.js.map +1 -0
  37. package/esm/orderly/useHoldingStream.js +19 -15
  38. package/esm/orderly/useHoldingStream.js.map +1 -0
  39. package/esm/orderly/useIndexPrice.js +7 -5
  40. package/esm/orderly/useIndexPrice.js.map +1 -0
  41. package/esm/orderly/useLeverage.js +9 -12
  42. package/esm/orderly/useLeverage.js.map +1 -0
  43. package/esm/orderly/useMarginRatio.js +27 -13
  44. package/esm/orderly/useMarginRatio.js.map +1 -0
  45. package/esm/orderly/useMarkPrice.js +13 -7
  46. package/esm/orderly/useMarkPrice.js.map +1 -0
  47. package/esm/orderly/useMarkPricesStream.d.ts +1 -1
  48. package/esm/orderly/useMarkPricesStream.d.ts.map +1 -1
  49. package/esm/orderly/useMarkPricesStream.js +9 -8
  50. package/esm/orderly/useMarkPricesStream.js.map +1 -0
  51. package/esm/orderly/useMarketTradeStream.js +33 -18
  52. package/esm/orderly/useMarketTradeStream.js.map +1 -0
  53. package/esm/orderly/useMarkets.js +144 -81
  54. package/esm/orderly/useMarkets.js.map +1 -0
  55. package/esm/orderly/useMarketsStream.js +23 -28
  56. package/esm/orderly/useMarketsStream.js.map +1 -0
  57. package/esm/orderly/useMaxQty.d.ts +6 -0
  58. package/esm/orderly/useMaxQty.d.ts.map +1 -1
  59. package/esm/orderly/useMaxQty.js +26 -18
  60. package/esm/orderly/useMaxQty.js.map +1 -0
  61. package/esm/orderly/useOpenInterest.js +7 -5
  62. package/esm/orderly/useOpenInterest.js.map +1 -0
  63. package/esm/orderly/useOrderEntry.js +182 -160
  64. package/esm/orderly/useOrderEntry.js.map +1 -0
  65. package/esm/orderly/useOrderStream.js +85 -66
  66. package/esm/orderly/useOrderStream.js.map +1 -0
  67. package/esm/orderly/useOrderbookStream.d.ts +2 -3
  68. package/esm/orderly/useOrderbookStream.d.ts.map +1 -1
  69. package/esm/orderly/useOrderbookStream.js +173 -103
  70. package/esm/orderly/useOrderbookStream.js.map +1 -0
  71. package/esm/orderly/usePositionStream.js +82 -62
  72. package/esm/orderly/usePositionStream.js.map +1 -0
  73. package/esm/orderly/usePrivateDataObserver.js +55 -48
  74. package/esm/orderly/usePrivateDataObserver.js.map +1 -0
  75. package/esm/orderly/useSettleSubscription.js +8 -6
  76. package/esm/orderly/useSettleSubscription.js.map +1 -0
  77. package/esm/orderly/useSymbolPriceRange.js +14 -8
  78. package/esm/orderly/useSymbolPriceRange.js.map +1 -0
  79. package/esm/orderly/useSymbolsInfo.js +7 -5
  80. package/esm/orderly/useSymbolsInfo.js.map +1 -0
  81. package/esm/orderly/useTickerStream.d.ts +5 -1
  82. package/esm/orderly/useTickerStream.d.ts.map +1 -1
  83. package/esm/orderly/useTickerStream.js +26 -29
  84. package/esm/orderly/useTickerStream.js.map +1 -0
  85. package/esm/orderly/useWalletSubscription.js +8 -6
  86. package/esm/orderly/useWalletSubscription.js.map +1 -0
  87. package/esm/orderly/useWithdraw.js +19 -11
  88. package/esm/orderly/useWithdraw.js.map +1 -0
  89. package/esm/orderlyContext.d.ts +8 -1
  90. package/esm/orderlyContext.d.ts.map +1 -1
  91. package/esm/orderlyContext.js +2 -1
  92. package/esm/orderlyContext.js.map +1 -0
  93. package/esm/services/dataCenter.js +10 -8
  94. package/esm/services/dataCenter.js.map +1 -0
  95. package/esm/services/painter/backgroundPaint.js +11 -14
  96. package/esm/services/painter/backgroundPaint.js.map +1 -0
  97. package/esm/services/painter/basePaint.js +5 -1
  98. package/esm/services/painter/basePaint.js.map +1 -0
  99. package/esm/services/painter/dataPaint.js +53 -50
  100. package/esm/services/painter/dataPaint.js.map +1 -0
  101. package/esm/services/painter/layout.config.js +15 -13
  102. package/esm/services/painter/layout.config.js.map +1 -0
  103. package/esm/services/painter/painter.js +14 -13
  104. package/esm/services/painter/painter.js.map +1 -0
  105. package/esm/services/painter/resource.js +6 -4
  106. package/esm/services/painter/resource.js.map +1 -0
  107. package/esm/statusProvider.js +10 -3
  108. package/esm/statusProvider.js.map +1 -0
  109. package/esm/unuse/apiPrefixMiddleware.js +18 -16
  110. package/esm/unuse/apiPrefixMiddleware.js.map +1 -0
  111. package/esm/unuse/fn.js +3 -1
  112. package/esm/unuse/fn.js.map +1 -0
  113. package/esm/unuse/useBalance.js +6 -4
  114. package/esm/unuse/useBalance.js.map +1 -0
  115. package/esm/unuse/useFetures.js +26 -18
  116. package/esm/unuse/useFetures.js.map +1 -0
  117. package/esm/unuse/useRunOnce.js +10 -7
  118. package/esm/unuse/useRunOnce.js.map +1 -0
  119. package/esm/unuse/useSyncEnd.js +5 -4
  120. package/esm/unuse/useSyncEnd.js.map +1 -0
  121. package/esm/unuse/useTokenInfo.js +7 -5
  122. package/esm/unuse/useTokenInfo.js.map +1 -0
  123. package/esm/unuse/useUnsettlementPnL.js +7 -3
  124. package/esm/unuse/useUnsettlementPnL.js.map +1 -0
  125. package/esm/useAccount.js +18 -21
  126. package/esm/useAccount.js.map +1 -0
  127. package/esm/useAccountInstance.js +6 -7
  128. package/esm/useAccountInstance.js.map +1 -0
  129. package/esm/useBoolean.js +14 -5
  130. package/esm/useBoolean.js.map +1 -0
  131. package/esm/useConfig.js +3 -1
  132. package/esm/useConfig.js.map +1 -0
  133. package/esm/useEventEmitter.js +4 -2
  134. package/esm/useEventEmitter.js.map +1 -0
  135. package/esm/useLazyQuery.js +6 -7
  136. package/esm/useLazyQuery.js.map +1 -0
  137. package/esm/useLocalStorage.js +30 -20
  138. package/esm/useLocalStorage.js.map +1 -0
  139. package/esm/useMediaQuery.js +11 -9
  140. package/esm/useMediaQuery.js.map +1 -0
  141. package/esm/useMutation.js +26 -37
  142. package/esm/useMutation.js.map +1 -0
  143. package/esm/useObserve.js +4 -4
  144. package/esm/useObserve.js.map +1 -0
  145. package/esm/useParamsCheck.js +8 -10
  146. package/esm/useParamsCheck.js.map +1 -0
  147. package/esm/usePoster.js +56 -45
  148. package/esm/usePoster.js.map +1 -0
  149. package/esm/usePreloadData.js +9 -5
  150. package/esm/usePreloadData.js.map +1 -0
  151. package/esm/usePrivateInfiniteQuery.js +15 -9
  152. package/esm/usePrivateInfiniteQuery.js.map +1 -0
  153. package/esm/usePrivateQuery.js +15 -8
  154. package/esm/usePrivateQuery.js.map +1 -0
  155. package/esm/useQuery.js +6 -5
  156. package/esm/useQuery.js.map +1 -0
  157. package/esm/useSessionStorage.js +28 -19
  158. package/esm/useSessionStorage.js.map +1 -0
  159. package/esm/useWS.js +15 -13
  160. package/esm/useWS.js.map +1 -0
  161. package/esm/useWsStatus.js +12 -12
  162. package/esm/useWsStatus.js.map +1 -0
  163. package/esm/utils/createGetter.js +8 -8
  164. package/esm/utils/createGetter.js.map +1 -0
  165. package/esm/utils/createOrder.d.ts +1 -0
  166. package/esm/utils/createOrder.d.ts.map +1 -1
  167. package/esm/utils/createOrder.js +59 -43
  168. package/esm/utils/createOrder.js.map +1 -0
  169. package/esm/utils/dev.js +6 -4
  170. package/esm/utils/dev.js.map +1 -0
  171. package/esm/utils/fetcher.js +3 -1
  172. package/esm/utils/fetcher.js.map +1 -0
  173. package/esm/utils/json.js +3 -2
  174. package/esm/utils/json.js.map +1 -0
  175. package/esm/utils/orderEntryHelper.js +92 -63
  176. package/esm/utils/orderEntryHelper.js.map +1 -0
  177. package/esm/utils/parseHolding.js +10 -6
  178. package/esm/utils/parseHolding.js.map +1 -0
  179. package/esm/utils/swr.js +114 -104
  180. package/esm/utils/swr.js.map +1 -0
  181. package/esm/version.d.ts +1 -1
  182. package/esm/version.js +4 -3
  183. package/esm/version.js.map +1 -0
  184. package/esm/walletConnectorContext.js +4 -2
  185. package/esm/walletConnectorContext.js.map +1 -0
  186. package/lib/configProvider.d.ts +7 -1
  187. package/lib/configProvider.d.ts.map +1 -1
  188. package/lib/configProvider.js +108 -56
  189. package/lib/configProvider.js.map +1 -0
  190. package/lib/dataProvider.js +50 -29
  191. package/lib/dataProvider.js.map +1 -0
  192. package/lib/index.d.ts +1 -0
  193. package/lib/index.d.ts.map +1 -1
  194. package/lib/index.js +191 -88
  195. package/lib/index.js.map +1 -0
  196. package/lib/middleware/signatureMiddleware.js +22 -15
  197. package/lib/middleware/signatureMiddleware.js.map +1 -0
  198. package/lib/orderly/orderbook.service.js +59 -33
  199. package/lib/orderly/orderbook.service.js.map +1 -0
  200. package/lib/orderly/orderlyHooks.d.ts +3 -0
  201. package/lib/orderly/orderlyHooks.d.ts.map +1 -1
  202. package/lib/orderly/orderlyHooks.js +124 -57
  203. package/lib/orderly/orderlyHooks.js.map +1 -0
  204. package/lib/orderly/useAccountInfo.js +14 -6
  205. package/lib/orderly/useAccountInfo.js.map +1 -0
  206. package/lib/orderly/useChain.js +30 -17
  207. package/lib/orderly/useChain.js.map +1 -0
  208. package/lib/orderly/useChains.d.ts +11 -12
  209. package/lib/orderly/useChains.d.ts.map +1 -1
  210. package/lib/orderly/useChains.js +100 -59
  211. package/lib/orderly/useChains.js.map +1 -0
  212. package/lib/orderly/useCollateral.d.ts +3 -4
  213. package/lib/orderly/useCollateral.d.ts.map +1 -1
  214. package/lib/orderly/useCollateral.js +81 -42
  215. package/lib/orderly/useCollateral.js.map +1 -0
  216. package/lib/orderly/useDeposit.js +154 -150
  217. package/lib/orderly/useDeposit.js.map +1 -0
  218. package/lib/orderly/useFundingRate.js +29 -22
  219. package/lib/orderly/useFundingRate.js.map +1 -0
  220. package/lib/orderly/useFundingRates.js +19 -11
  221. package/lib/orderly/useFundingRates.js.map +1 -0
  222. package/lib/orderly/useHoldingStream.js +39 -27
  223. package/lib/orderly/useHoldingStream.js.map +1 -0
  224. package/lib/orderly/useIndexPrice.js +24 -14
  225. package/lib/orderly/useIndexPrice.js.map +1 -0
  226. package/lib/orderly/useLeverage.js +27 -24
  227. package/lib/orderly/useLeverage.js.map +1 -0
  228. package/lib/orderly/useMarginRatio.js +49 -29
  229. package/lib/orderly/useMarginRatio.js.map +1 -0
  230. package/lib/orderly/useMarkPrice.js +26 -15
  231. package/lib/orderly/useMarkPrice.js.map +1 -0
  232. package/lib/orderly/useMarkPricesStream.d.ts +1 -1
  233. package/lib/orderly/useMarkPricesStream.d.ts.map +1 -1
  234. package/lib/orderly/useMarkPricesStream.js +26 -17
  235. package/lib/orderly/useMarkPricesStream.js.map +1 -0
  236. package/lib/orderly/useMarketTradeStream.js +47 -26
  237. package/lib/orderly/useMarketTradeStream.js.map +1 -0
  238. package/lib/orderly/useMarkets.js +172 -95
  239. package/lib/orderly/useMarkets.js.map +1 -0
  240. package/lib/orderly/useMarketsStream.js +44 -41
  241. package/lib/orderly/useMarketsStream.js.map +1 -0
  242. package/lib/orderly/useMaxQty.d.ts +6 -0
  243. package/lib/orderly/useMaxQty.d.ts.map +1 -1
  244. package/lib/orderly/useMaxQty.js +52 -43
  245. package/lib/orderly/useMaxQty.js.map +1 -0
  246. package/lib/orderly/useOpenInterest.js +24 -14
  247. package/lib/orderly/useOpenInterest.js.map +1 -0
  248. package/lib/orderly/useOrderEntry.js +238 -210
  249. package/lib/orderly/useOrderEntry.js.map +1 -0
  250. package/lib/orderly/useOrderStream.js +111 -84
  251. package/lib/orderly/useOrderStream.js.map +1 -0
  252. package/lib/orderly/useOrderbookStream.d.ts +2 -3
  253. package/lib/orderly/useOrderbookStream.d.ts.map +1 -1
  254. package/lib/orderly/useOrderbookStream.js +227 -148
  255. package/lib/orderly/useOrderbookStream.js.map +1 -0
  256. package/lib/orderly/usePositionStream.js +134 -100
  257. package/lib/orderly/usePositionStream.js.map +1 -0
  258. package/lib/orderly/usePrivateDataObserver.js +76 -63
  259. package/lib/orderly/usePrivateDataObserver.js.map +1 -0
  260. package/lib/orderly/useSettleSubscription.js +25 -15
  261. package/lib/orderly/useSettleSubscription.js.map +1 -0
  262. package/lib/orderly/useSymbolPriceRange.js +29 -23
  263. package/lib/orderly/useSymbolPriceRange.js.map +1 -0
  264. package/lib/orderly/useSymbolsInfo.js +23 -15
  265. package/lib/orderly/useSymbolsInfo.js.map +1 -0
  266. package/lib/orderly/useTickerStream.d.ts +5 -1
  267. package/lib/orderly/useTickerStream.d.ts.map +1 -1
  268. package/lib/orderly/useTickerStream.js +51 -48
  269. package/lib/orderly/useTickerStream.js.map +1 -0
  270. package/lib/orderly/useWalletSubscription.js +25 -15
  271. package/lib/orderly/useWalletSubscription.js.map +1 -0
  272. package/lib/orderly/useWithdraw.js +36 -22
  273. package/lib/orderly/useWithdraw.js.map +1 -0
  274. package/lib/orderlyContext.d.ts +8 -1
  275. package/lib/orderlyContext.d.ts.map +1 -1
  276. package/lib/orderlyContext.js +22 -6
  277. package/lib/orderlyContext.js.map +1 -0
  278. package/lib/services/dataCenter.js +15 -11
  279. package/lib/services/dataCenter.js.map +1 -0
  280. package/lib/services/painter/backgroundPaint.js +21 -18
  281. package/lib/services/painter/backgroundPaint.js.map +1 -0
  282. package/lib/services/painter/basePaint.js +14 -4
  283. package/lib/services/painter/basePaint.js.map +1 -0
  284. package/lib/services/painter/dataPaint.js +67 -58
  285. package/lib/services/painter/dataPaint.js.map +1 -0
  286. package/lib/services/painter/layout.config.js +25 -16
  287. package/lib/services/painter/layout.config.js.map +1 -0
  288. package/lib/services/painter/painter.js +27 -20
  289. package/lib/services/painter/painter.js.map +1 -0
  290. package/lib/services/painter/resource.js +15 -7
  291. package/lib/services/painter/resource.js.map +1 -0
  292. package/lib/statusProvider.js +31 -10
  293. package/lib/statusProvider.js.map +1 -0
  294. package/lib/unuse/apiPrefixMiddleware.js +30 -22
  295. package/lib/unuse/apiPrefixMiddleware.js.map +1 -0
  296. package/lib/unuse/fn.js +14 -5
  297. package/lib/unuse/fn.js.map +1 -0
  298. package/lib/unuse/useBalance.js +23 -13
  299. package/lib/unuse/useBalance.js.map +1 -0
  300. package/lib/unuse/useFetures.js +41 -28
  301. package/lib/unuse/useFetures.js.map +1 -0
  302. package/lib/unuse/useRunOnce.js +61 -11
  303. package/lib/unuse/useRunOnce.js.map +1 -0
  304. package/lib/unuse/useSyncEnd.js +17 -10
  305. package/lib/unuse/useSyncEnd.js.map +1 -0
  306. package/lib/unuse/useTokenInfo.js +20 -12
  307. package/lib/unuse/useTokenInfo.js.map +1 -0
  308. package/lib/unuse/useUnsettlementPnL.js +21 -11
  309. package/lib/unuse/useUnsettlementPnL.js.map +1 -0
  310. package/lib/useAccount.js +32 -29
  311. package/lib/useAccount.js.map +1 -0
  312. package/lib/useAccountInstance.js +27 -20
  313. package/lib/useAccountInstance.js.map +1 -0
  314. package/lib/useBoolean.js +25 -10
  315. package/lib/useBoolean.js.map +1 -0
  316. package/lib/useConfig.js +15 -7
  317. package/lib/useConfig.js.map +1 -0
  318. package/lib/useEventEmitter.js +23 -13
  319. package/lib/useEventEmitter.js.map +1 -0
  320. package/lib/useLazyQuery.js +25 -23
  321. package/lib/useLazyQuery.js.map +1 -0
  322. package/lib/useLocalStorage.js +44 -28
  323. package/lib/useLocalStorage.js.map +1 -0
  324. package/lib/useMediaQuery.js +22 -14
  325. package/lib/useMediaQuery.js.map +1 -0
  326. package/lib/useMutation.js +47 -52
  327. package/lib/useMutation.js.map +1 -0
  328. package/lib/useObserve.js +22 -8
  329. package/lib/useObserve.js.map +1 -0
  330. package/lib/useParamsCheck.js +18 -14
  331. package/lib/useParamsCheck.js.map +1 -0
  332. package/lib/usePoster.js +80 -74
  333. package/lib/usePoster.js.map +1 -0
  334. package/lib/usePreloadData.js +21 -11
  335. package/lib/usePreloadData.js.map +1 -0
  336. package/lib/usePrivateInfiniteQuery.js +36 -22
  337. package/lib/usePrivateInfiniteQuery.js.map +1 -0
  338. package/lib/usePrivateQuery.js +35 -25
  339. package/lib/usePrivateQuery.js.map +1 -0
  340. package/lib/useQuery.js +24 -20
  341. package/lib/useQuery.js.map +1 -0
  342. package/lib/useSessionStorage.js +41 -26
  343. package/lib/useSessionStorage.js.map +1 -0
  344. package/lib/useWS.js +42 -32
  345. package/lib/useWS.js.map +1 -0
  346. package/lib/useWsStatus.js +34 -20
  347. package/lib/useWsStatus.js.map +1 -0
  348. package/lib/utils/createGetter.js +19 -14
  349. package/lib/utils/createGetter.js.map +1 -0
  350. package/lib/utils/createOrder.d.ts +1 -0
  351. package/lib/utils/createOrder.d.ts.map +1 -1
  352. package/lib/utils/createOrder.js +133 -82
  353. package/lib/utils/createOrder.js.map +1 -0
  354. package/lib/utils/dev.js +13 -9
  355. package/lib/utils/dev.js.map +1 -0
  356. package/lib/utils/fetcher.js +13 -5
  357. package/lib/utils/fetcher.js.map +1 -0
  358. package/lib/utils/json.js +12 -5
  359. package/lib/utils/json.js.map +1 -0
  360. package/lib/utils/orderEntryHelper.js +125 -82
  361. package/lib/utils/orderEntryHelper.js.map +1 -0
  362. package/lib/utils/parseHolding.js +19 -9
  363. package/lib/utils/parseHolding.js.map +1 -0
  364. package/lib/utils/swr.js +134 -111
  365. package/lib/utils/swr.js.map +1 -0
  366. package/lib/version.d.ts +1 -1
  367. package/lib/version.js +13 -4
  368. package/lib/version.js.map +1 -0
  369. package/lib/walletConnectorContext.js +23 -7
  370. package/lib/walletConnectorContext.js.map +1 -0
  371. 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) => Array(len).fill([Number.NaN, Number.NaN, Number.NaN, Number.NaN]);
12
- const asksSortFn = (a, b) => a[0] - b[0];
13
- const bidsSortFn = (a, b) => b[0] - a[0];
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 = [...data];
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 (let i = 0; i < data.length; i++) {
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, [priceKey, itemPrice]);
50
- }
51
- else {
52
- prices.set(priceKey, [priceKey, quantity]);
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 (let i = 0; i < newData.length; i++) {
67
+ for(let i = 0; i < newData.length; i++){
58
68
  const [price, quantity] = newData[i];
59
- if (isNaN(price) || isNaN(quantity))
60
- continue;
61
- const newQuantity = new Decimal(quantity)
62
- .add(result.length > 0 ? result[result.length - 1][2] : 0)
63
- .toNumber();
64
- const newAmount = new Decimal(quantity * price)
65
- .add(result.length > 0 ? result[result.length - 1][3] : 0)
66
- .toNumber();
67
- result.push([price, quantity, newQuantity, newAmount]);
68
- // if the total is greater than the level, break
69
- // TODO:
70
- // if (i + 1 >= level) {
71
- // break;
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([price + (depth === undefined ? 0 : depth), qty, newQuantity, newAmount]);
91
- }
92
- else {
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 (asks.length > 0) {
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 (let index = 0; index < asks.length; index++) {
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
- // console.log("xxxxxxxxxxx reset ask list end", logStr);
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
- asks.length < level ? paddingFn(level - asks.length).concat(asks) : asks;
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
- return update;
140
- data = data.filter(([price]) => !isNaN(price));
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) => p === price);
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 = [...data.asks];
167
- let bids = [...data.bids];
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 = { asks: [], bids: [] };
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
- return [tick, tick * 10, tick * 100, tick * 1000];
197
- }, [config("quote_tick")]);
198
- useEffect(() => {
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
- }, [config("quote_tick")]);
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) => 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, { asks, bids, ts, prevTs }, () => needRequestFullOrderbook = true);
245
+ orderbooksService.updateOrderbook(symbol, {
246
+ asks,
247
+ bids,
248
+ ts,
249
+ prevTs
250
+ }, ()=>needRequestFullOrderbook = true);
219
251
  const data = orderbooksService.getRawOrderbook(symbol);
220
- setData({ bids: data.bids, asks: data.asks });
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) => message,
234
- onMessage: (message) => {
268
+ formatter: (message)=>message,
269
+ onMessage: (message)=>{
235
270
  const { symbol, asks, bids, ts } = message.data;
236
- orderbooksService.setFullOrderbook(symbol, { asks, bids, ts });
271
+ orderbooksService.setFullOrderbook(symbol, {
272
+ asks,
273
+ bids,
274
+ ts
275
+ });
237
276
  const data = orderbooksService.getRawOrderbook(symbol);
238
- setData({ bids: data.bids, asks: data.asks });
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
- }, [symbol]);
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(() => depth);
303
+ setDepth(()=>depth);
260
304
  }, []);
261
305
  const reducedData = reduceOrderbook(depth, level, padding, {
262
- asks: [...data.asks],
263
- bids: [...data.bids],
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
- }, [reducedData.asks?.[reducedData.asks.length - 1]?.[0], reducedData.bids?.[0]?.[0]]);
273
- const middlePrice = useMemo(() => {
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
- return 0;
283
- return [asksFrist, bidsFirst, ticker["24h_close"]].sort()[1];
284
- }, [ticker?.["24h_close"], data]);
285
- useEffect(() => {
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
- }, [middlePrice]);
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: [prevMiddlePrice.current, middlePrice],
352
+ middlePrice: [
353
+ prevMiddlePrice.current,
354
+ middlePrice
355
+ ]
294
356
  },
295
- { onDepthChange, depth, allDepths: depths, isLoading, onItemClick },
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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"}