@polyester/sdk 0.4.0 → 0.4.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 (296) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/_virtual/_rolldown/runtime.js +1 -15
  3. package/dist/catalogs/snapshot-validation.js +63 -63
  4. package/dist/catalogs/snapshot-validation.js.map +1 -1
  5. package/dist/core-client.d.ts +9 -0
  6. package/dist/core-client.d.ts.map +1 -1
  7. package/dist/core-client.js +21 -0
  8. package/dist/core-client.js.map +1 -1
  9. package/dist/gen/fees/v1/fees_pb.d.ts +124 -0
  10. package/dist/gen/fees/v1/fees_pb.d.ts.map +1 -0
  11. package/dist/gen/fees/v1/fees_pb.js +39 -0
  12. package/dist/gen/fees/v1/fees_pb.js.map +1 -0
  13. package/dist/gen/index.d.ts +4 -1
  14. package/dist/gen/index.js +4 -1
  15. package/dist/gen/ratelimit/v1/ratelimit_pb.d.ts +223 -0
  16. package/dist/gen/ratelimit/v1/ratelimit_pb.d.ts.map +1 -0
  17. package/dist/gen/ratelimit/v1/ratelimit_pb.js +86 -0
  18. package/dist/gen/ratelimit/v1/ratelimit_pb.js.map +1 -0
  19. package/dist/gen/vip/v1/vip_pb.d.ts +277 -0
  20. package/dist/gen/vip/v1/vip_pb.d.ts.map +1 -0
  21. package/dist/gen/vip/v1/vip_pb.js +60 -0
  22. package/dist/gen/vip/v1/vip_pb.js.map +1 -0
  23. package/dist/index.d.ts +8 -1
  24. package/dist/services/accounts/accounts.js +1 -1
  25. package/dist/services/accounts/accounts.js.map +1 -1
  26. package/dist/services/accounts/accounts.schemas.d.ts +13 -13
  27. package/dist/services/accounts/accounts.schemas.d.ts.map +1 -1
  28. package/dist/services/accounts/accounts.schemas.js +11 -11
  29. package/dist/services/accounts/accounts.schemas.js.map +1 -1
  30. package/dist/services/address-book/address-book.js.map +1 -1
  31. package/dist/services/address-book/address-book.schemas.d.ts +751 -751
  32. package/dist/services/address-book/address-book.schemas.d.ts.map +1 -1
  33. package/dist/services/address-book/address-book.schemas.js +160 -159
  34. package/dist/services/address-book/address-book.schemas.js.map +1 -1
  35. package/dist/services/api-keys/api-keys.d.ts +6 -6
  36. package/dist/services/api-keys/api-keys.d.ts.map +1 -1
  37. package/dist/services/api-keys/api-keys.js.map +1 -1
  38. package/dist/services/api-keys/api-keys.schemas.d.ts +62 -62
  39. package/dist/services/api-keys/api-keys.schemas.d.ts.map +1 -1
  40. package/dist/services/api-keys/api-keys.schemas.js +34 -34
  41. package/dist/services/api-keys/api-keys.schemas.js.map +1 -1
  42. package/dist/services/auth/auth.d.ts +39 -39
  43. package/dist/services/auth/auth.d.ts.map +1 -1
  44. package/dist/services/auth/auth.js +19 -18
  45. package/dist/services/auth/auth.js.map +1 -1
  46. package/dist/services/auth/profile/profile.d.ts +2 -2
  47. package/dist/services/auth/profile/profile.d.ts.map +1 -1
  48. package/dist/services/auth/profile/profile.js +3 -2
  49. package/dist/services/auth/profile/profile.js.map +1 -1
  50. package/dist/services/auth/profile/profile.schemas.d.ts +41 -41
  51. package/dist/services/auth/profile/profile.schemas.d.ts.map +1 -1
  52. package/dist/services/auth/profile/profile.schemas.js +27 -27
  53. package/dist/services/auth/profile/profile.schemas.js.map +1 -1
  54. package/dist/services/auth/session.schemas.js +17 -17
  55. package/dist/services/auth/session.schemas.js.map +1 -1
  56. package/dist/services/balances/balances.d.ts.map +1 -1
  57. package/dist/services/balances/balances.js +3 -2
  58. package/dist/services/balances/balances.js.map +1 -1
  59. package/dist/services/balances/balances.schemas.d.ts +95 -95
  60. package/dist/services/balances/balances.schemas.d.ts.map +1 -1
  61. package/dist/services/balances/balances.schemas.js +61 -61
  62. package/dist/services/balances/balances.schemas.js.map +1 -1
  63. package/dist/services/candles/candles.d.ts.map +1 -1
  64. package/dist/services/candles/candles.js +5 -4
  65. package/dist/services/candles/candles.js.map +1 -1
  66. package/dist/services/candles/candles.schemas.d.ts +64 -64
  67. package/dist/services/candles/candles.schemas.d.ts.map +1 -1
  68. package/dist/services/candles/candles.schemas.js +47 -47
  69. package/dist/services/candles/candles.schemas.js.map +1 -1
  70. package/dist/services/chain-analytics/chain-analytics.js.map +1 -1
  71. package/dist/services/chain-analytics/chain-analytics.schemas.d.ts +68 -68
  72. package/dist/services/chain-analytics/chain-analytics.schemas.d.ts.map +1 -1
  73. package/dist/services/chain-analytics/chain-analytics.schemas.js +29 -29
  74. package/dist/services/chain-analytics/chain-analytics.schemas.js.map +1 -1
  75. package/dist/services/deposit/deposit.js.map +1 -1
  76. package/dist/services/deposit/deposit.schemas.d.ts +17 -17
  77. package/dist/services/deposit/deposit.schemas.d.ts.map +1 -1
  78. package/dist/services/deposit/deposit.schemas.js +11 -11
  79. package/dist/services/deposit/deposit.schemas.js.map +1 -1
  80. package/dist/services/fees/fees.d.ts +19 -0
  81. package/dist/services/fees/fees.d.ts.map +1 -0
  82. package/dist/services/fees/fees.js +32 -0
  83. package/dist/services/fees/fees.js.map +1 -0
  84. package/dist/services/fees/fees.schemas.d.ts +28 -0
  85. package/dist/services/fees/fees.schemas.d.ts.map +1 -0
  86. package/dist/services/fees/fees.schemas.js +25 -0
  87. package/dist/services/fees/fees.schemas.js.map +1 -0
  88. package/dist/services/fees/fees.types.d.ts +2 -0
  89. package/dist/services/fees/index.d.ts +3 -0
  90. package/dist/services/guard-signer/guard-signer.js.map +1 -1
  91. package/dist/services/guard-signer/guard-signer.schemas.d.ts +75 -75
  92. package/dist/services/guard-signer/guard-signer.schemas.d.ts.map +1 -1
  93. package/dist/services/guard-signer/guard-signer.schemas.js +42 -42
  94. package/dist/services/guard-signer/guard-signer.schemas.js.map +1 -1
  95. package/dist/services/heatmap/heatmap.d.ts.map +1 -1
  96. package/dist/services/heatmap/heatmap.js +5 -4
  97. package/dist/services/heatmap/heatmap.js.map +1 -1
  98. package/dist/services/heatmap/heatmap.schemas.d.ts +138 -138
  99. package/dist/services/heatmap/heatmap.schemas.d.ts.map +1 -1
  100. package/dist/services/heatmap/heatmap.schemas.js +47 -47
  101. package/dist/services/heatmap/heatmap.schemas.js.map +1 -1
  102. package/dist/services/internal-transfers/internal-transfers.js.map +1 -1
  103. package/dist/services/internal-transfers/internal-transfers.schemas.d.ts +53 -53
  104. package/dist/services/internal-transfers/internal-transfers.schemas.d.ts.map +1 -1
  105. package/dist/services/internal-transfers/internal-transfers.schemas.js +27 -27
  106. package/dist/services/internal-transfers/internal-transfers.schemas.js.map +1 -1
  107. package/dist/services/lifecycle/lifecycle.d.ts.map +1 -1
  108. package/dist/services/lifecycle/lifecycle.js +3 -2
  109. package/dist/services/lifecycle/lifecycle.js.map +1 -1
  110. package/dist/services/lifecycle/lifecycle.schemas.d.ts +614 -614
  111. package/dist/services/lifecycle/lifecycle.schemas.d.ts.map +1 -1
  112. package/dist/services/lifecycle/lifecycle.schemas.js +146 -146
  113. package/dist/services/lifecycle/lifecycle.schemas.js.map +1 -1
  114. package/dist/services/market-data/market-data.d.ts.map +1 -1
  115. package/dist/services/market-data/market-data.js +4 -3
  116. package/dist/services/market-data/market-data.js.map +1 -1
  117. package/dist/services/market-data/market-data.schemas.d.ts +19 -19
  118. package/dist/services/market-data/market-data.schemas.d.ts.map +1 -1
  119. package/dist/services/market-data/market-data.schemas.js +50 -50
  120. package/dist/services/market-data/market-data.schemas.js.map +1 -1
  121. package/dist/services/market-overview/market-overview.d.ts.map +1 -1
  122. package/dist/services/market-overview/market-overview.js +3 -2
  123. package/dist/services/market-overview/market-overview.js.map +1 -1
  124. package/dist/services/market-overview/market-overview.schemas.d.ts +37 -37
  125. package/dist/services/market-overview/market-overview.schemas.d.ts.map +1 -1
  126. package/dist/services/market-overview/market-overview.schemas.js +33 -33
  127. package/dist/services/market-overview/market-overview.schemas.js.map +1 -1
  128. package/dist/services/mfa/mfa.js +1 -1
  129. package/dist/services/mfa/mfa.js.map +1 -1
  130. package/dist/services/mfa/mfa.schemas.d.ts +206 -206
  131. package/dist/services/mfa/mfa.schemas.d.ts.map +1 -1
  132. package/dist/services/mfa/mfa.schemas.js +83 -83
  133. package/dist/services/mfa/mfa.schemas.js.map +1 -1
  134. package/dist/services/orderbook/orderbook.d.ts +2 -2
  135. package/dist/services/orderbook/orderbook.d.ts.map +1 -1
  136. package/dist/services/orderbook/orderbook.js +3 -2
  137. package/dist/services/orderbook/orderbook.js.map +1 -1
  138. package/dist/services/orderbook/orderbook.schemas.d.ts +23 -23
  139. package/dist/services/orderbook/orderbook.schemas.d.ts.map +1 -1
  140. package/dist/services/orderbook/orderbook.schemas.js +15 -15
  141. package/dist/services/orderbook/orderbook.schemas.js.map +1 -1
  142. package/dist/services/orders/order-errors.schemas.d.ts +18 -18
  143. package/dist/services/orders/order-errors.schemas.d.ts.map +1 -1
  144. package/dist/services/orders/order-errors.schemas.js +8 -8
  145. package/dist/services/orders/order-errors.schemas.js.map +1 -1
  146. package/dist/services/orders/orders-batch.schemas.d.ts +492 -492
  147. package/dist/services/orders/orders-batch.schemas.d.ts.map +1 -1
  148. package/dist/services/orders/orders-batch.schemas.js +117 -117
  149. package/dist/services/orders/orders-batch.schemas.js.map +1 -1
  150. package/dist/services/orders/orders-identifiers.schemas.js +5 -5
  151. package/dist/services/orders/orders-identifiers.schemas.js.map +1 -1
  152. package/dist/services/orders/orders-input.schemas.d.ts +648 -648
  153. package/dist/services/orders/orders-input.schemas.d.ts.map +1 -1
  154. package/dist/services/orders/orders-input.schemas.js +95 -95
  155. package/dist/services/orders/orders-input.schemas.js.map +1 -1
  156. package/dist/services/orders/orders-modify.schemas.d.ts +351 -351
  157. package/dist/services/orders/orders-modify.schemas.d.ts.map +1 -1
  158. package/dist/services/orders/orders-modify.schemas.js +44 -44
  159. package/dist/services/orders/orders-modify.schemas.js.map +1 -1
  160. package/dist/services/orders/orders-output.schemas.d.ts +179 -179
  161. package/dist/services/orders/orders-output.schemas.d.ts.map +1 -1
  162. package/dist/services/orders/orders-output.schemas.js +49 -49
  163. package/dist/services/orders/orders-output.schemas.js.map +1 -1
  164. package/dist/services/orders/orders-risk.schemas.d.ts +226 -226
  165. package/dist/services/orders/orders-risk.schemas.d.ts.map +1 -1
  166. package/dist/services/orders/orders-risk.schemas.js +69 -69
  167. package/dist/services/orders/orders-risk.schemas.js.map +1 -1
  168. package/dist/services/orders/orders.d.ts +6 -6
  169. package/dist/services/orders/orders.d.ts.map +1 -1
  170. package/dist/services/orders/orders.js +4 -3
  171. package/dist/services/orders/orders.js.map +1 -1
  172. package/dist/services/policies/api-key-policies/api-key-policies.d.ts +6 -6
  173. package/dist/services/policies/api-key-policies/api-key-policies.d.ts.map +1 -1
  174. package/dist/services/policies/api-key-policies/api-key-policies.js.map +1 -1
  175. package/dist/services/policies/api-key-policies/api-key-policies.schemas.d.ts +105 -105
  176. package/dist/services/policies/api-key-policies/api-key-policies.schemas.d.ts.map +1 -1
  177. package/dist/services/policies/api-key-policies/api-key-policies.schemas.js +49 -49
  178. package/dist/services/policies/api-key-policies/api-key-policies.schemas.js.map +1 -1
  179. package/dist/services/policies/shared.d.ts +5 -5
  180. package/dist/services/policies/shared.d.ts.map +1 -1
  181. package/dist/services/policies/shared.js +10 -10
  182. package/dist/services/policies/shared.js.map +1 -1
  183. package/dist/services/policies/subaccount-policies/subaccount-policies.d.ts +6 -6
  184. package/dist/services/policies/subaccount-policies/subaccount-policies.d.ts.map +1 -1
  185. package/dist/services/policies/subaccount-policies/subaccount-policies.js +3 -2
  186. package/dist/services/policies/subaccount-policies/subaccount-policies.js.map +1 -1
  187. package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.d.ts +124 -124
  188. package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.d.ts.map +1 -1
  189. package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.js +75 -75
  190. package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.js.map +1 -1
  191. package/dist/services/rate-limits/index.d.ts +4 -0
  192. package/dist/services/rate-limits/rate-limits.codecs.d.ts +6 -0
  193. package/dist/services/rate-limits/rate-limits.codecs.d.ts.map +1 -0
  194. package/dist/services/rate-limits/rate-limits.codecs.js +11 -0
  195. package/dist/services/rate-limits/rate-limits.codecs.js.map +1 -0
  196. package/dist/services/rate-limits/rate-limits.d.ts +24 -0
  197. package/dist/services/rate-limits/rate-limits.d.ts.map +1 -0
  198. package/dist/services/rate-limits/rate-limits.js +40 -0
  199. package/dist/services/rate-limits/rate-limits.js.map +1 -0
  200. package/dist/services/rate-limits/rate-limits.schemas.d.ts +58 -0
  201. package/dist/services/rate-limits/rate-limits.schemas.d.ts.map +1 -0
  202. package/dist/services/rate-limits/rate-limits.schemas.js +30 -0
  203. package/dist/services/rate-limits/rate-limits.schemas.js.map +1 -0
  204. package/dist/services/rate-limits/rate-limits.types.d.ts +3 -0
  205. package/dist/services/shared.js +11 -11
  206. package/dist/services/shared.js.map +1 -1
  207. package/dist/services/social-verification/social-verification.d.ts +3 -3
  208. package/dist/services/social-verification/social-verification.d.ts.map +1 -1
  209. package/dist/services/social-verification/social-verification.js.map +1 -1
  210. package/dist/services/social-verification/social-verification.schemas.d.ts +54 -54
  211. package/dist/services/social-verification/social-verification.schemas.d.ts.map +1 -1
  212. package/dist/services/social-verification/social-verification.schemas.js +28 -28
  213. package/dist/services/social-verification/social-verification.schemas.js.map +1 -1
  214. package/dist/services/subaccounts/subaccounts.d.ts +14 -14
  215. package/dist/services/subaccounts/subaccounts.d.ts.map +1 -1
  216. package/dist/services/subaccounts/subaccounts.js +9 -8
  217. package/dist/services/subaccounts/subaccounts.js.map +1 -1
  218. package/dist/services/subaccounts/subaccounts.schemas.d.ts +137 -137
  219. package/dist/services/subaccounts/subaccounts.schemas.d.ts.map +1 -1
  220. package/dist/services/subaccounts/subaccounts.schemas.js +72 -72
  221. package/dist/services/subaccounts/subaccounts.schemas.js.map +1 -1
  222. package/dist/services/trades/trades.d.ts +2 -2
  223. package/dist/services/trades/trades.d.ts.map +1 -1
  224. package/dist/services/trades/trades.js +3 -2
  225. package/dist/services/trades/trades.js.map +1 -1
  226. package/dist/services/trades/trades.schemas.d.ts +31 -31
  227. package/dist/services/trades/trades.schemas.d.ts.map +1 -1
  228. package/dist/services/trades/trades.schemas.js +24 -24
  229. package/dist/services/trades/trades.schemas.js.map +1 -1
  230. package/dist/services/trading-withdraws/trading-withdraws.js +1 -1
  231. package/dist/services/trading-withdraws/trading-withdraws.js.map +1 -1
  232. package/dist/services/trading-withdraws/trading-withdraws.schemas.d.ts +45 -45
  233. package/dist/services/trading-withdraws/trading-withdraws.schemas.d.ts.map +1 -1
  234. package/dist/services/trading-withdraws/trading-withdraws.schemas.js +36 -36
  235. package/dist/services/trading-withdraws/trading-withdraws.schemas.js.map +1 -1
  236. package/dist/services/transfers/transfers.d.ts.map +1 -1
  237. package/dist/services/transfers/transfers.js +3 -2
  238. package/dist/services/transfers/transfers.js.map +1 -1
  239. package/dist/services/transfers/transfers.schemas.d.ts +42 -42
  240. package/dist/services/transfers/transfers.schemas.d.ts.map +1 -1
  241. package/dist/services/transfers/transfers.schemas.js +30 -30
  242. package/dist/services/transfers/transfers.schemas.js.map +1 -1
  243. package/dist/services/triggers/trigger-child-order.schemas.js +23 -23
  244. package/dist/services/triggers/trigger-child-order.schemas.js.map +1 -1
  245. package/dist/services/triggers/trigger-input.schemas.d.ts +226 -226
  246. package/dist/services/triggers/trigger-input.schemas.d.ts.map +1 -1
  247. package/dist/services/triggers/trigger-input.schemas.js +53 -53
  248. package/dist/services/triggers/trigger-input.schemas.js.map +1 -1
  249. package/dist/services/triggers/triggers-output.schemas.d.ts +218 -218
  250. package/dist/services/triggers/triggers-output.schemas.d.ts.map +1 -1
  251. package/dist/services/triggers/triggers-output.schemas.js +152 -152
  252. package/dist/services/triggers/triggers-output.schemas.js.map +1 -1
  253. package/dist/services/triggers/triggers.d.ts.map +1 -1
  254. package/dist/services/triggers/triggers.js +4 -3
  255. package/dist/services/triggers/triggers.js.map +1 -1
  256. package/dist/services/vip/index.d.ts +3 -0
  257. package/dist/services/vip/vip.d.ts +22 -0
  258. package/dist/services/vip/vip.d.ts.map +1 -0
  259. package/dist/services/vip/vip.js +35 -0
  260. package/dist/services/vip/vip.js.map +1 -0
  261. package/dist/services/vip/vip.schemas.d.ts +90 -0
  262. package/dist/services/vip/vip.schemas.d.ts.map +1 -0
  263. package/dist/services/vip/vip.schemas.js +47 -0
  264. package/dist/services/vip/vip.schemas.js.map +1 -0
  265. package/dist/services/vip/vip.types.d.ts +2 -0
  266. package/dist/services/whiteboard/whiteboard.js.map +1 -1
  267. package/dist/services/whiteboard/whiteboard.schemas.d.ts +379 -379
  268. package/dist/services/whiteboard/whiteboard.schemas.d.ts.map +1 -1
  269. package/dist/services/whiteboard/whiteboard.schemas.js +71 -71
  270. package/dist/services/whiteboard/whiteboard.schemas.js.map +1 -1
  271. package/dist/services/zipper/zipper.js.map +1 -1
  272. package/dist/services/zipper/zipper.schemas.d.ts +1 -1
  273. package/dist/services/zipper/zipper.schemas.js +54 -54
  274. package/dist/services/zipper/zipper.schemas.js.map +1 -1
  275. package/dist/shared/account-scope.d.ts +6 -6
  276. package/dist/shared/account-scope.d.ts.map +1 -1
  277. package/dist/shared/account-scope.js +3 -3
  278. package/dist/shared/account-scope.js.map +1 -1
  279. package/dist/shared/connect-error-mapping.js +2 -2
  280. package/dist/shared/connect-error-mapping.js.map +1 -1
  281. package/dist/shared/rate-limit.schemas.d.ts +12 -12
  282. package/dist/shared/rate-limit.schemas.d.ts.map +1 -1
  283. package/dist/shared/rate-limit.schemas.js +7 -7
  284. package/dist/shared/rate-limit.schemas.js.map +1 -1
  285. package/dist/shared/schemas.js +26 -26
  286. package/dist/shared/schemas.js.map +1 -1
  287. package/dist/shared/validation.js +1 -6
  288. package/dist/shared/validation.js.map +1 -1
  289. package/dist/utils/connect-order-errors.js +2 -2
  290. package/dist/utils/connect-order-errors.js.map +1 -1
  291. package/dist/wired-services.d.ts.map +1 -1
  292. package/dist/wired-services.js +6 -0
  293. package/dist/wired-services.js.map +1 -1
  294. package/package.json +3 -3
  295. package/dist/shared/validation.d.ts +0 -14
  296. package/dist/shared/validation.d.ts.map +0 -1
@@ -1,4 +1,4 @@
1
- import { parse, validation_exports } from "../../shared/validation.js";
1
+ import { parse } from "../../shared/validation.js";
2
2
  import { toConnectCallOptions } from "../../shared/request-options.js";
3
3
  import { publicationHandlerErrorContext } from "../../shared/subscription-errors.js";
4
4
  import { MarketDataService as MarketDataService$1, MarketTradeSchema } from "../../gen/marketdata/v1/marketdata_pb.js";
@@ -6,6 +6,7 @@ import { createReadyGate } from "../../shared/decimal-surface.js";
6
6
  import { GetMarketTradesInputSchema, SpotConfigSchema, createMarketTradeSchema } from "./market-data.schemas.js";
7
7
  import { isDev } from "../../utils/is-dev.js";
8
8
  import { createClient } from "@connectrpc/connect";
9
+ import * as v from "valibot";
9
10
  //#region src/services/market-data/market-data.ts
10
11
  /**
11
12
  * Exposes public spot trades, spot configuration, and live trade streams.
@@ -29,7 +30,7 @@ var MarketDataService = class {
29
30
  const validatedInput = parse(GetMarketTradesInputSchema, input);
30
31
  const res = await this.#client.getTrades(validatedInput, toConnectCallOptions(options));
31
32
  return {
32
- trades: parse(validation_exports.array(this.#marketTradeSchema), res.trades),
33
+ trades: parse(v.array(this.#marketTradeSchema), res.trades),
33
34
  nextPageToken: res.nextPageToken
34
35
  };
35
36
  }
@@ -48,7 +49,7 @@ var MarketDataService = class {
48
49
  * Subscribes to public trade prints on public:spot:market:trades:{symbolId}:proto for the requested symbol and emits parsed market trades.
49
50
  */
50
51
  subscribeTrades(input) {
51
- const channel = `public:spot:market:trades:${parse(validation_exports.pipe(validation_exports.number(), validation_exports.integer(), validation_exports.gtValue(0)), input.symbolId)}:proto`;
52
+ const channel = `public:spot:market:trades:${parse(v.pipe(v.number(), v.integer(), v.gtValue(0)), input.symbolId)}:proto`;
52
53
  const notifyError = (error) => {
53
54
  if (isDev()) console.error("Market trades subscription error", error);
54
55
  input.onError?.(error);
@@ -1 +1 @@
1
- {"version":3,"file":"market-data.js","names":["#client","Proto.MarketDataService","#realtime","#scales","#marketTradeSchema","v.parse","v","Proto.MarketTradeSchema"],"sources":["../../../src/services/market-data/market-data.ts"],"sourcesContent":["import * as Proto from \"../../gen/marketdata/v1/marketdata_pb.js\";\nimport type { PolyesterRealtime } from \"../../realtime/types.js\";\nimport { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport {\n publicationHandlerErrorContext,\n type SdkSubscriptionErrorContext,\n} from \"../../shared/subscription-errors.js\";\nimport * as v from \"../../shared/validation.js\";\nimport type { BaseSubscribeInput } from \"../../shared/types.js\";\nimport {\n toConnectCallOptions,\n type PolyesterRequestOptions,\n} from \"../../shared/request-options.js\";\nimport { createReadyGate, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport {\n GetMarketTradesInputSchema,\n createMarketTradeSchema,\n type GetMarketTradesInput,\n type SpotConfig,\n SpotConfigSchema,\n type MarketTrade,\n} from \"./market-data.schemas.js\";\nimport { isDev } from \"../../utils/is-dev.js\";\n\ninterface SubscribeTradesInput extends BaseSubscribeInput<MarketTrade> {\n symbolId: number;\n}\n\n/**\n * Exposes public spot trades, spot configuration, and live trade streams.\n */\nexport class MarketDataService {\n #client: Client<typeof Proto.MarketDataService>;\n #realtime: PolyesterRealtime;\n #scales: SdkScales;\n #marketTradeSchema: ReturnType<typeof createMarketTradeSchema>;\n\n constructor(transport: Transport, realtime: PolyesterRealtime, scales: SdkScales) {\n this.#client = createClient(Proto.MarketDataService, transport);\n this.#realtime = realtime;\n this.#scales = scales;\n this.#marketTradeSchema = createMarketTradeSchema(scales);\n }\n\n /**\n * Returns recent public trades for one spot market, ordered newest-first by execution timestamp with match id as a tie-breaker. Supports limit, time bounds, side filtering, and match-id pagination.\n */\n async listTrades(\n input: GetMarketTradesInput,\n options?: PolyesterRequestOptions,\n ): Promise<{ trades: MarketTrade[]; nextPageToken: string }> {\n await this.#scales.ready();\n const validatedInput = v.parse(GetMarketTradesInputSchema, input);\n const res = await this.#client.getTrades(validatedInput, toConnectCallOptions(options));\n return {\n trades: v.parse(v.array(this.#marketTradeSchema), res.trades),\n nextPageToken: res.nextPageToken,\n };\n }\n\n /**\n * Returns the cacheable spot reference-data snapshot, including asset metadata, pair trading constraints, display scales, statuses, and market slippage defaults.\n *\n * This is the catalog's own data source, so it must never wait on catalog\n * readiness (that would deadlock the initial catalog refresh) and carries\n * no decimal conversion.\n */\n async getSpotConfig(options?: PolyesterRequestOptions): Promise<SpotConfig> {\n const res = await this.#client.getSpotConfig({}, toConnectCallOptions(options));\n return v.parse(SpotConfigSchema, res);\n }\n\n /**\n * Subscribes to public trade prints on public:spot:market:trades:{symbolId}:proto for the requested symbol and emits parsed market trades.\n */\n subscribeTrades(input: SubscribeTradesInput): () => void {\n const symbolId = v.parse(v.pipe(v.number(), v.integer(), v.gtValue(0)), input.symbolId);\n const channel = `public:spot:market:trades:${symbolId}:proto`;\n const notifyError = (error: SdkSubscriptionErrorContext) => {\n if (isDev()) {\n console.error(\"Market trades subscription error\", error);\n }\n input.onError?.(error);\n };\n const gate = createReadyGate(\n () => this.#scales.ready(),\n (error) => notifyError(publicationHandlerErrorContext(channel, error)),\n );\n return this.#realtime.connectProtoChannel({\n channel,\n schema: Proto.MarketTradeSchema,\n onPublication: (data) => {\n gate.run(() => {\n const trade = v.parse(this.#marketTradeSchema, data);\n input.onEvent(trade);\n });\n },\n onConnected: () => input.onOpen?.(),\n onDisconnected: () => input.onClose?.(),\n onError: notifyError,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;AA+BA,IAAa,oBAAb,MAA+B;CAC3B;CACA;CACA;CACA;CAEA,YAAY,WAAsB,UAA6B,QAAmB;EAC9E,KAAKA,UAAU,aAAaC,qBAAyB,SAAS;EAC9D,KAAKC,YAAY;EACjB,KAAKC,UAAU;EACf,KAAKC,qBAAqB,wBAAwB,MAAM;CAC5D;;;;CAKA,MAAM,WACF,OACA,SACyD;EACzD,MAAM,KAAKD,QAAQ,MAAM;EACzB,MAAM,iBAAiBE,MAAQ,4BAA4B,KAAK;EAChE,MAAM,MAAM,MAAM,KAAKL,QAAQ,UAAU,gBAAgB,qBAAqB,OAAO,CAAC;EACtF,OAAO;GACH,QAAQK,MAAQC,mBAAE,MAAM,KAAKF,kBAAkB,GAAG,IAAI,MAAM;GAC5D,eAAe,IAAI;EACvB;CACJ;;;;;;;;CASA,MAAM,cAAc,SAAwD;EACxE,MAAM,MAAM,MAAM,KAAKJ,QAAQ,cAAc,CAAC,GAAG,qBAAqB,OAAO,CAAC;EAC9E,OAAOK,MAAQ,kBAAkB,GAAG;CACxC;;;;CAKA,gBAAgB,OAAyC;EAErD,MAAM,UAAU,6BADCA,MAAQC,mBAAE,KAAKA,mBAAE,OAAO,GAAGA,mBAAE,QAAQ,GAAGA,mBAAE,QAAQ,CAAC,CAAC,GAAG,MAAM,QAC1B,EAAE;EACtD,MAAM,eAAe,UAAuC;GACxD,IAAI,MAAM,GACN,QAAQ,MAAM,oCAAoC,KAAK;GAE3D,MAAM,UAAU,KAAK;EACzB;EACA,MAAM,OAAO,sBACH,KAAKH,QAAQ,MAAM,IACxB,UAAU,YAAY,+BAA+B,SAAS,KAAK,CAAC,CACzE;EACA,OAAO,KAAKD,UAAU,oBAAoB;GACtC;GACA,QAAQK;GACR,gBAAgB,SAAS;IACrB,KAAK,UAAU;KACX,MAAM,QAAQF,MAAQ,KAAKD,oBAAoB,IAAI;KACnD,MAAM,QAAQ,KAAK;IACvB,CAAC;GACL;GACA,mBAAmB,MAAM,SAAS;GAClC,sBAAsB,MAAM,UAAU;GACtC,SAAS;EACb,CAAC;CACL;AACJ"}
1
+ {"version":3,"file":"market-data.js","names":["#client","Proto.MarketDataService","#realtime","#scales","#marketTradeSchema","Proto.MarketTradeSchema"],"sources":["../../../src/services/market-data/market-data.ts"],"sourcesContent":["import * as Proto from \"../../gen/marketdata/v1/marketdata_pb.js\";\nimport type { PolyesterRealtime } from \"../../realtime/types.js\";\nimport { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport {\n publicationHandlerErrorContext,\n type SdkSubscriptionErrorContext,\n} from \"../../shared/subscription-errors.js\";\nimport * as v from \"valibot\";\nimport { parse } from \"../../shared/validation.js\";\nimport type { BaseSubscribeInput } from \"../../shared/types.js\";\nimport {\n toConnectCallOptions,\n type PolyesterRequestOptions,\n} from \"../../shared/request-options.js\";\nimport { createReadyGate, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport {\n GetMarketTradesInputSchema,\n createMarketTradeSchema,\n type GetMarketTradesInput,\n type SpotConfig,\n SpotConfigSchema,\n type MarketTrade,\n} from \"./market-data.schemas.js\";\nimport { isDev } from \"../../utils/is-dev.js\";\n\ninterface SubscribeTradesInput extends BaseSubscribeInput<MarketTrade> {\n symbolId: number;\n}\n\n/**\n * Exposes public spot trades, spot configuration, and live trade streams.\n */\nexport class MarketDataService {\n #client: Client<typeof Proto.MarketDataService>;\n #realtime: PolyesterRealtime;\n #scales: SdkScales;\n #marketTradeSchema: ReturnType<typeof createMarketTradeSchema>;\n\n constructor(transport: Transport, realtime: PolyesterRealtime, scales: SdkScales) {\n this.#client = createClient(Proto.MarketDataService, transport);\n this.#realtime = realtime;\n this.#scales = scales;\n this.#marketTradeSchema = createMarketTradeSchema(scales);\n }\n\n /**\n * Returns recent public trades for one spot market, ordered newest-first by execution timestamp with match id as a tie-breaker. Supports limit, time bounds, side filtering, and match-id pagination.\n */\n async listTrades(\n input: GetMarketTradesInput,\n options?: PolyesterRequestOptions,\n ): Promise<{ trades: MarketTrade[]; nextPageToken: string }> {\n await this.#scales.ready();\n const validatedInput = parse(GetMarketTradesInputSchema, input);\n const res = await this.#client.getTrades(validatedInput, toConnectCallOptions(options));\n return {\n trades: parse(v.array(this.#marketTradeSchema), res.trades),\n nextPageToken: res.nextPageToken,\n };\n }\n\n /**\n * Returns the cacheable spot reference-data snapshot, including asset metadata, pair trading constraints, display scales, statuses, and market slippage defaults.\n *\n * This is the catalog's own data source, so it must never wait on catalog\n * readiness (that would deadlock the initial catalog refresh) and carries\n * no decimal conversion.\n */\n async getSpotConfig(options?: PolyesterRequestOptions): Promise<SpotConfig> {\n const res = await this.#client.getSpotConfig({}, toConnectCallOptions(options));\n return parse(SpotConfigSchema, res);\n }\n\n /**\n * Subscribes to public trade prints on public:spot:market:trades:{symbolId}:proto for the requested symbol and emits parsed market trades.\n */\n subscribeTrades(input: SubscribeTradesInput): () => void {\n const symbolId = parse(v.pipe(v.number(), v.integer(), v.gtValue(0)), input.symbolId);\n const channel = `public:spot:market:trades:${symbolId}:proto`;\n const notifyError = (error: SdkSubscriptionErrorContext) => {\n if (isDev()) {\n console.error(\"Market trades subscription error\", error);\n }\n input.onError?.(error);\n };\n const gate = createReadyGate(\n () => this.#scales.ready(),\n (error) => notifyError(publicationHandlerErrorContext(channel, error)),\n );\n return this.#realtime.connectProtoChannel({\n channel,\n schema: Proto.MarketTradeSchema,\n onPublication: (data) => {\n gate.run(() => {\n const trade = parse(this.#marketTradeSchema, data);\n input.onEvent(trade);\n });\n },\n onConnected: () => input.onOpen?.(),\n onDisconnected: () => input.onClose?.(),\n onError: notifyError,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAgCA,IAAa,oBAAb,MAA+B;CAC3B;CACA;CACA;CACA;CAEA,YAAY,WAAsB,UAA6B,QAAmB;EAC9E,KAAKA,UAAU,aAAaC,qBAAyB,SAAS;EAC9D,KAAKC,YAAY;EACjB,KAAKC,UAAU;EACf,KAAKC,qBAAqB,wBAAwB,MAAM;CAC5D;;;;CAKA,MAAM,WACF,OACA,SACyD;EACzD,MAAM,KAAKD,QAAQ,MAAM;EACzB,MAAM,iBAAiB,MAAM,4BAA4B,KAAK;EAC9D,MAAM,MAAM,MAAM,KAAKH,QAAQ,UAAU,gBAAgB,qBAAqB,OAAO,CAAC;EACtF,OAAO;GACH,QAAQ,MAAM,EAAE,MAAM,KAAKI,kBAAkB,GAAG,IAAI,MAAM;GAC1D,eAAe,IAAI;EACvB;CACJ;;;;;;;;CASA,MAAM,cAAc,SAAwD;EACxE,MAAM,MAAM,MAAM,KAAKJ,QAAQ,cAAc,CAAC,GAAG,qBAAqB,OAAO,CAAC;EAC9E,OAAO,MAAM,kBAAkB,GAAG;CACtC;;;;CAKA,gBAAgB,OAAyC;EAErD,MAAM,UAAU,6BADC,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,QAAQ,GAAG,EAAE,QAAQ,CAAC,CAAC,GAAG,MAAM,QACxB,EAAE;EACtD,MAAM,eAAe,UAAuC;GACxD,IAAI,MAAM,GACN,QAAQ,MAAM,oCAAoC,KAAK;GAE3D,MAAM,UAAU,KAAK;EACzB;EACA,MAAM,OAAO,sBACH,KAAKG,QAAQ,MAAM,IACxB,UAAU,YAAY,+BAA+B,SAAS,KAAK,CAAC,CACzE;EACA,OAAO,KAAKD,UAAU,oBAAoB;GACtC;GACA,QAAQG;GACR,gBAAgB,SAAS;IACrB,KAAK,UAAU;KACX,MAAM,QAAQ,MAAM,KAAKD,oBAAoB,IAAI;KACjD,MAAM,QAAQ,KAAK;IACvB,CAAC;GACL;GACA,mBAAmB,MAAM,SAAS;GAClC,sBAAsB,MAAM,UAAU;GACtC,SAAS;EACb,CAAC;CACL;AACJ"}
@@ -1,16 +1,16 @@
1
1
  import { AssetConfig, PAIR_STATUSES, PairConfig, PairMarketDataConfig, PairStatus, SpotConfig } from "../../shared/catalog-config.js";
2
- import { validation_d_exports } from "../../shared/validation.js";
3
2
  import { SideFilter } from "../../gen/marketdata/v1/marketdata_pb.js";
4
3
  import { SdkScales } from "../../shared/decimal-surface.js";
4
+ import * as v from "valibot";
5
5
  //#region src/services/market-data/market-data.schemas.d.ts
6
- declare function createMarketTradeSchema(scales: SdkScales): validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.ObjectSchema<{
7
- readonly symbolId: validation_d_exports.NumberSchema<undefined>;
8
- readonly matchId: validation_d_exports.BigintSchema<undefined>;
9
- readonly isBuy: validation_d_exports.BooleanSchema<undefined>;
10
- readonly priceTicks: validation_d_exports.BigintSchema<undefined>;
11
- readonly qtyScaled: validation_d_exports.BigintSchema<undefined>;
12
- readonly tsNs: validation_d_exports.OptionalSchema<validation_d_exports.BigintSchema<undefined>, 0n>;
13
- }, undefined>, validation_d_exports.TransformAction<{
6
+ declare function createMarketTradeSchema(scales: SdkScales): v.SchemaWithPipe<readonly [v.ObjectSchema<{
7
+ readonly symbolId: v.NumberSchema<undefined>;
8
+ readonly matchId: v.BigintSchema<undefined>;
9
+ readonly isBuy: v.BooleanSchema<undefined>;
10
+ readonly priceTicks: v.BigintSchema<undefined>;
11
+ readonly qtyScaled: v.BigintSchema<undefined>;
12
+ readonly tsNs: v.OptionalSchema<v.BigintSchema<undefined>, 0n>;
13
+ }, undefined>, v.TransformAction<{
14
14
  symbolId: number;
15
15
  matchId: bigint;
16
16
  isBuy: boolean;
@@ -27,15 +27,15 @@ declare function createMarketTradeSchema(scales: SdkScales): validation_d_export
27
27
  tsNs: string;
28
28
  tsMs: number;
29
29
  }>]>;
30
- type MarketTrade = validation_d_exports.InferOutput<ReturnType<typeof createMarketTradeSchema>>;
31
- declare function createGetMarketTradesInputSchema(): validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.ObjectSchema<{
32
- readonly symbolId: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.NumberSchema<undefined>, validation_d_exports.IntegerAction<number, undefined>, validation_d_exports.GtValueAction<number, 0, undefined>]>;
33
- readonly side: validation_d_exports.OptionalSchema<validation_d_exports.PicklistSchema<["buy", "sell"], undefined>, undefined>;
34
- readonly startTsNs: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.OptionalSchema<validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.StringSchema<undefined>, validation_d_exports.TrimAction]>, undefined>, validation_d_exports.TransformAction<string | undefined, bigint | undefined>]>;
35
- readonly endTsNs: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.OptionalSchema<validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.StringSchema<undefined>, validation_d_exports.TrimAction]>, undefined>, validation_d_exports.TransformAction<string | undefined, bigint | undefined>]>;
36
- readonly limit: validation_d_exports.OptionalSchema<validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.NumberSchema<undefined>, validation_d_exports.IntegerAction<number, undefined>, validation_d_exports.GtValueAction<number, 0, undefined>, validation_d_exports.MaxValueAction<number, 1000, undefined>]>, undefined>;
37
- readonly pageToken: validation_d_exports.OptionalSchema<validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.StringSchema<undefined>, validation_d_exports.TrimAction]>, "">;
38
- }, undefined>, validation_d_exports.TransformAction<{
30
+ type MarketTrade = v.InferOutput<ReturnType<typeof createMarketTradeSchema>>;
31
+ declare function createGetMarketTradesInputSchema(): v.SchemaWithPipe<readonly [v.ObjectSchema<{
32
+ readonly symbolId: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.GtValueAction<number, 0, undefined>]>;
33
+ readonly side: v.OptionalSchema<v.PicklistSchema<["buy", "sell"], undefined>, undefined>;
34
+ readonly startTsNs: v.SchemaWithPipe<readonly [v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction]>, undefined>, v.TransformAction<string | undefined, bigint | undefined>]>;
35
+ readonly endTsNs: v.SchemaWithPipe<readonly [v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction]>, undefined>, v.TransformAction<string | undefined, bigint | undefined>]>;
36
+ readonly limit: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.GtValueAction<number, 0, undefined>, v.MaxValueAction<number, 1000, undefined>]>, undefined>;
37
+ readonly pageToken: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction]>, "">;
38
+ }, undefined>, v.TransformAction<{
39
39
  symbolId: number;
40
40
  side?: "buy" | "sell" | undefined;
41
41
  startTsNs?: bigint | undefined;
@@ -50,7 +50,7 @@ declare function createGetMarketTradesInputSchema(): validation_d_exports.Schema
50
50
  limit: number | undefined;
51
51
  pageToken: string;
52
52
  }>]>;
53
- type GetMarketTradesInput = validation_d_exports.InferInput<ReturnType<typeof createGetMarketTradesInputSchema>>;
53
+ type GetMarketTradesInput = v.InferInput<ReturnType<typeof createGetMarketTradesInputSchema>>;
54
54
  //#endregion
55
55
  export { type AssetConfig, GetMarketTradesInput, MarketTrade, type PairConfig, type PairStatus, type SpotConfig, createGetMarketTradesInputSchema, createMarketTradeSchema };
56
56
  //# sourceMappingURL=market-data.schemas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"market-data.schemas.d.ts","names":[],"sources":["../../../src/services/market-data/market-data.schemas.ts"],"mappings":";;;;;iBAkBgB,wBAAwB,QAAQ,YAAS,qBAAA,yBAAA,qBAAA;;;;;;;;;;;;;;;;;;;;;;;;KA0B7C,cAAc,qBAAE,YAAY,kBAAkB;iBA2B1C,oCAAgC,qBAAA,yBAAA,qBAAA;;;;;;;;;;;;;;;;;;;;;;KAIpC,uBAAuB,qBAAE,WACjC,kBAAkB"}
1
+ {"version":3,"file":"market-data.schemas.d.ts","names":[],"sources":["../../../src/services/market-data/market-data.schemas.ts"],"mappings":";;;;;iBAkBgB,wBAAwB,QAAQ,YAAS,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;KA0B7C,cAAc,EAAE,YAAY,kBAAkB;iBA2B1C,oCAAgC,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;KAIpC,uBAAuB,EAAE,WACjC,kBAAkB"}
@@ -1,20 +1,20 @@
1
- import { validation_exports } from "../../shared/validation.js";
2
1
  import { tsNsToMs } from "../../utils/time.js";
3
2
  import { timestampToMs, tsNsToTimestamp } from "../../utils/timestamp.js";
4
3
  import "../../shared/catalog-config.js";
5
4
  import { scaledToDecimalOutput } from "../../shared/decimal-surface.js";
6
5
  import { SideSchema } from "../shared.js";
7
6
  import { PairStatusCodec, SideFilterCodec } from "./market-data.codecs.js";
7
+ import * as v from "valibot";
8
8
  //#region src/services/market-data/market-data.schemas.ts
9
9
  function createMarketTradeSchema(scales) {
10
- return validation_exports.pipe(validation_exports.object({
11
- symbolId: validation_exports.number(),
12
- matchId: validation_exports.bigint(),
13
- isBuy: validation_exports.boolean(),
14
- priceTicks: validation_exports.bigint(),
15
- qtyScaled: validation_exports.bigint(),
16
- tsNs: validation_exports.optional(validation_exports.bigint(), 0n)
17
- }), validation_exports.transform((t) => {
10
+ return v.pipe(v.object({
11
+ symbolId: v.number(),
12
+ matchId: v.bigint(),
13
+ isBuy: v.boolean(),
14
+ priceTicks: v.bigint(),
15
+ qtyScaled: v.bigint(),
16
+ tsNs: v.optional(v.bigint(), 0n)
17
+ }), v.transform((t) => {
18
18
  const sideLabel = t.isBuy ? "buy" : "sell";
19
19
  return {
20
20
  symbolId: t.symbolId,
@@ -28,14 +28,14 @@ function createMarketTradeSchema(scales) {
28
28
  };
29
29
  }));
30
30
  }
31
- const GetMarketTradesInputSchema = validation_exports.pipe(validation_exports.object({
32
- symbolId: validation_exports.pipe(validation_exports.number(), validation_exports.integer(), validation_exports.gtValue(0)),
33
- side: validation_exports.optional(SideSchema),
34
- startTsNs: validation_exports.pipe(validation_exports.optional(validation_exports.pipe(validation_exports.string(), validation_exports.trim())), validation_exports.transform((v) => v ? BigInt(v) : void 0)),
35
- endTsNs: validation_exports.pipe(validation_exports.optional(validation_exports.pipe(validation_exports.string(), validation_exports.trim())), validation_exports.transform((v) => v ? BigInt(v) : void 0)),
36
- limit: validation_exports.optional(validation_exports.pipe(validation_exports.number(), validation_exports.integer(), validation_exports.gtValue(0), validation_exports.maxValue(1e3))),
37
- pageToken: validation_exports.optional(validation_exports.pipe(validation_exports.string(), validation_exports.trim()), "")
38
- }), validation_exports.transform((input) => ({
31
+ const GetMarketTradesInputSchema = v.pipe(v.object({
32
+ symbolId: v.pipe(v.number(), v.integer(), v.gtValue(0)),
33
+ side: v.optional(SideSchema),
34
+ startTsNs: v.pipe(v.optional(v.pipe(v.string(), v.trim())), v.transform((v) => v ? BigInt(v) : void 0)),
35
+ endTsNs: v.pipe(v.optional(v.pipe(v.string(), v.trim())), v.transform((v) => v ? BigInt(v) : void 0)),
36
+ limit: v.optional(v.pipe(v.number(), v.integer(), v.gtValue(0), v.maxValue(1e3))),
37
+ pageToken: v.optional(v.pipe(v.string(), v.trim()), "")
38
+ }), v.transform((input) => ({
39
39
  symbolId: input.symbolId,
40
40
  side: input.side ? SideFilterCodec.inputToProto[input.side] : void 0,
41
41
  startTime: tsNsToTimestamp(input.startTsNs),
@@ -43,76 +43,76 @@ const GetMarketTradesInputSchema = validation_exports.pipe(validation_exports.ob
43
43
  limit: input.limit,
44
44
  pageToken: input.pageToken
45
45
  })));
46
- const AssetConfigSchema = validation_exports.pipe(validation_exports.object({
46
+ const AssetConfigSchema = v.pipe(v.object({
47
47
  /**
48
48
  * Asset identifier/symbol, e.g. 'USDT', 'BTC'.
49
49
  */
50
- asset: validation_exports.string(),
50
+ asset: v.string(),
51
51
  /**
52
52
  * Internal ledger identifier for settlement systems.
53
53
  */
54
- ledgerId: validation_exports.number(),
54
+ ledgerId: v.number(),
55
55
  /**
56
56
  * The friendly display name for the asset (e.g. 'Bitcoin').
57
57
  */
58
- name: validation_exports.string(),
58
+ name: v.string(),
59
59
  /**
60
60
  * UI-only display precision for asset amounts/balances.
61
61
  */
62
- quantityDisplayDecimals: validation_exports.number(),
62
+ quantityDisplayDecimals: v.number(),
63
63
  /**
64
64
  * Fixed integer scaling for quantities/amounts in this asset (0..18).
65
65
  */
66
- quantityScale: validation_exports.number()
67
- }), validation_exports.transform((a) => ({
66
+ quantityScale: v.number()
67
+ }), v.transform((a) => ({
68
68
  symbol: a.asset,
69
69
  ledgerId: a.ledgerId,
70
70
  name: a.name,
71
71
  quantityDisplayDecimals: a.quantityDisplayDecimals,
72
72
  quantityScale: a.quantityScale
73
73
  })));
74
- const PairMarketDataConfigSchema = validation_exports.optional(validation_exports.object({
74
+ const PairMarketDataConfigSchema = v.optional(v.object({
75
75
  /**
76
76
  * Available price grouping sizes for the orderbook in quote units.
77
77
  * Allows viewing orders bucketed by larger increments (e.g., [0.01, 0.1, 1, 10]).
78
78
  */
79
- orderbookPriceBuckets: validation_exports.array(validation_exports.number()) }), { orderbookPriceBuckets: [] });
79
+ orderbookPriceBuckets: v.array(v.number()) }), { orderbookPriceBuckets: [] });
80
80
  function bpsToPercent(bps) {
81
81
  return bps / 100;
82
82
  }
83
- const PairConfigSchema = validation_exports.pipe(validation_exports.object({
83
+ const PairConfigSchema = v.pipe(v.object({
84
84
  /**
85
85
  * Internal engine symbol id for the pair.
86
86
  */
87
- symbolId: validation_exports.number(),
87
+ symbolId: v.number(),
88
88
  /**
89
89
  * Pair symbol string, e.g. 'BTC-USDT'
90
90
  */
91
- symbol: validation_exports.string(),
91
+ symbol: v.string(),
92
92
  /**
93
93
  * Base asset symbol, e.g. 'BTC'
94
94
  */
95
- baseAsset: validation_exports.string(),
95
+ baseAsset: v.string(),
96
96
  /**
97
97
  * Quote asset symbol, e.g. 'USDT'
98
98
  */
99
- quoteAsset: validation_exports.string(),
99
+ quoteAsset: v.string(),
100
100
  /**
101
101
  * (e.g., "0.01") - The smallest price increment allowed. If tick size is 0.01, you can price at $100.00, $100.01, $100.02... but NOT $100.005.
102
102
  */
103
- tickSize: validation_exports.string(),
103
+ tickSize: v.string(),
104
104
  /**
105
105
  * (e.g., "0.0001") - The smallest quantity increment allowed. If step size is 0.0001, you can order 100.0000, 100.0001, 100.0002... but NOT 100.00005.
106
106
  */
107
- stepSize: validation_exports.string(),
107
+ stepSize: v.string(),
108
108
  /**
109
109
  * (e.g., "1") - Minimum order value in quote currency. If it's "1" and quote is USD, your order must be worth at least $1. So you can't buy $0.50 worth of something.
110
110
  */
111
- minNotionalQuote: validation_exports.string(),
111
+ minNotionalQuote: v.string(),
112
112
  /**
113
113
  * Minimum quantity you can order in base currency terms. If it's "0.001" for BTC, smallest order is 0.001 BTC.
114
114
  */
115
- minQtyBase: validation_exports.string(),
115
+ minQtyBase: v.string(),
116
116
  /**
117
117
  * Controls whether trading fee can be deducted from what you receive when buying.
118
118
  * Example
@@ -120,53 +120,53 @@ const PairConfigSchema = validation_exports.pipe(validation_exports.object({
120
120
  * - if `true`, you receive 0.999 ETH (fee taken from ETH you're getting)
121
121
  * - if `false`, you receive 1 ETH, but you pay the fee separately in the quote currency (e.g., extra USDT)
122
122
  */
123
- allowBuyFeeFromBase: validation_exports.boolean(),
123
+ allowBuyFeeFromBase: v.boolean(),
124
124
  /**
125
125
  * Default market slippage for buy orders in basis points from proto.
126
126
  */
127
- defaultMarketSlippageBpsBuy: validation_exports.optional(validation_exports.number(), 0),
127
+ defaultMarketSlippageBpsBuy: v.optional(v.number(), 0),
128
128
  /**
129
129
  * Default market slippage for sell orders in basis points from proto.
130
130
  */
131
- defaultMarketSlippageBpsSell: validation_exports.optional(validation_exports.number(), 0),
131
+ defaultMarketSlippageBpsSell: v.optional(v.number(), 0),
132
132
  /**
133
133
  * Maximum server/client reference-price drift in basis points from proto.
134
134
  */
135
- maxClientRefDriftBps: validation_exports.optional(validation_exports.number(), 0),
135
+ maxClientRefDriftBps: v.optional(v.number(), 0),
136
136
  /**
137
137
  * Market-data configuration for this pair (orderbook bucket sizes, depths).
138
138
  */
139
- marketdata: validation_exports.optional(PairMarketDataConfigSchema),
139
+ marketdata: v.optional(PairMarketDataConfigSchema),
140
140
  /**
141
141
  * Base asset quantity scale copied from AssetConfig.quantityScale.
142
142
  */
143
- baseQuantityScale: validation_exports.number(),
143
+ baseQuantityScale: v.number(),
144
144
  /**
145
145
  * Quote asset quantity scale copied from AssetConfig.quantityScale.
146
146
  */
147
- quoteQuantityScale: validation_exports.number(),
147
+ quoteQuantityScale: v.number(),
148
148
  /**
149
149
  * Optional scheduled listing timestamp (UTC).
150
150
  */
151
- listingAt: validation_exports.pipe(validation_exports.optional(validation_exports.unknown()), validation_exports.transform(timestampToMs)),
151
+ listingAt: v.pipe(v.optional(v.unknown()), v.transform(timestampToMs)),
152
152
  /**
153
153
  * Optional scheduled delisting timestamp (UTC).
154
154
  */
155
- delistingAt: validation_exports.pipe(validation_exports.optional(validation_exports.unknown()), validation_exports.transform(timestampToMs)),
155
+ delistingAt: v.pipe(v.optional(v.unknown()), v.transform(timestampToMs)),
156
156
  /**
157
157
  * Operational status of the pair.
158
158
  */
159
- status: validation_exports.pipe(validation_exports.number(), validation_exports.transform((status) => PairStatusCodec.protoToOutput[status] ?? "unknown"))
160
- }), validation_exports.transform(({ defaultMarketSlippageBpsBuy, defaultMarketSlippageBpsSell, maxClientRefDriftBps, ...pair }) => ({
159
+ status: v.pipe(v.number(), v.transform((status) => PairStatusCodec.protoToOutput[status] ?? "unknown"))
160
+ }), v.transform(({ defaultMarketSlippageBpsBuy, defaultMarketSlippageBpsSell, maxClientRefDriftBps, ...pair }) => ({
161
161
  ...pair,
162
162
  defaultMarketSlippagePctBuy: bpsToPercent(defaultMarketSlippageBpsBuy),
163
163
  defaultMarketSlippagePctSell: bpsToPercent(defaultMarketSlippageBpsSell),
164
164
  maxClientRefDriftPct: bpsToPercent(maxClientRefDriftBps)
165
165
  })));
166
- const SpotConfigSchema = validation_exports.object({
167
- assets: validation_exports.array(AssetConfigSchema),
168
- pairs: validation_exports.array(PairConfigSchema),
169
- tsSec: validation_exports.pipe(validation_exports.bigint(), validation_exports.transform((v) => Number(v) * 1e3))
166
+ const SpotConfigSchema = v.object({
167
+ assets: v.array(AssetConfigSchema),
168
+ pairs: v.array(PairConfigSchema),
169
+ tsSec: v.pipe(v.bigint(), v.transform((v) => Number(v) * 1e3))
170
170
  });
171
171
  //#endregion
172
172
  export { AssetConfigSchema, GetMarketTradesInputSchema, PairConfigSchema, PairMarketDataConfigSchema, SpotConfigSchema, createMarketTradeSchema };
@@ -1 +1 @@
1
- {"version":3,"file":"market-data.schemas.js","names":["v"],"sources":["../../../src/services/market-data/market-data.schemas.ts"],"sourcesContent":["import * as v from \"../../shared/validation.js\";\nimport { SideSchema } from \"../shared.js\";\nimport {\n PAIR_STATUSES,\n type AssetConfig,\n type PairConfig,\n type PairMarketDataConfig,\n type PairStatus,\n type SpotConfig,\n} from \"../../shared/catalog-config.js\";\nimport { tsNsToMs } from \"../../utils/time.js\";\nimport { timestampToMs, tsNsToTimestamp } from \"../../utils/timestamp.js\";\nimport { scaledToDecimalOutput, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport { PairStatusCodec, SideFilterCodec } from \"./market-data.codecs.js\";\n\nexport type { AssetConfig, PairConfig, PairMarketDataConfig, PairStatus, SpotConfig };\nexport { PAIR_STATUSES };\n\nexport function createMarketTradeSchema(scales: SdkScales) {\n return v.pipe(\n v.object({\n symbolId: v.number(),\n matchId: v.bigint(),\n isBuy: v.boolean(),\n priceTicks: v.bigint(),\n qtyScaled: v.bigint(),\n tsNs: v.optional(v.bigint(), 0n),\n }),\n v.transform((t) => {\n const sideLabel: v.InferOutput<typeof SideSchema> = t.isBuy ? \"buy\" : \"sell\";\n return {\n symbolId: t.symbolId,\n matchId: t.matchId.toString(),\n isBuy: t.isBuy,\n sideLabel,\n qty: scaledToDecimalOutput(t.qtyScaled, scales.baseQty(t.symbolId)),\n price: scaledToDecimalOutput(t.priceTicks, scales.price()),\n tsNs: t.tsNs.toString(),\n tsMs: tsNsToMs(t.tsNs),\n };\n }),\n );\n}\n\nexport type MarketTrade = v.InferOutput<ReturnType<typeof createMarketTradeSchema>>;\n\nexport const GetMarketTradesInputSchema = v.pipe(\n v.object({\n symbolId: v.pipe(v.number(), v.integer(), v.gtValue(0)),\n side: v.optional(SideSchema),\n startTsNs: v.pipe(\n v.optional(v.pipe(v.string(), v.trim())),\n v.transform((v) => (v ? BigInt(v) : undefined)),\n ),\n endTsNs: v.pipe(\n v.optional(v.pipe(v.string(), v.trim())),\n v.transform((v) => (v ? BigInt(v) : undefined)),\n ),\n limit: v.optional(v.pipe(v.number(), v.integer(), v.gtValue(0), v.maxValue(1_000))),\n pageToken: v.optional(v.pipe(v.string(), v.trim()), \"\"),\n }),\n v.transform((input) => ({\n symbolId: input.symbolId,\n side: input.side ? SideFilterCodec.inputToProto[input.side] : undefined,\n startTime: tsNsToTimestamp(input.startTsNs),\n endTime: tsNsToTimestamp(input.endTsNs),\n limit: input.limit,\n pageToken: input.pageToken,\n })),\n);\n\nexport function createGetMarketTradesInputSchema() {\n return GetMarketTradesInputSchema;\n}\n\nexport type GetMarketTradesInput = v.InferInput<\n ReturnType<typeof createGetMarketTradesInputSchema>\n>;\nexport type GetMarketTradesRequest = v.InferOutput<\n ReturnType<typeof createGetMarketTradesInputSchema>\n>;\n\nexport const AssetConfigSchema = v.pipe(\n v.object({\n /**\n * Asset identifier/symbol, e.g. 'USDT', 'BTC'.\n */\n asset: v.string(),\n /**\n * Internal ledger identifier for settlement systems.\n */\n ledgerId: v.number(),\n /**\n * The friendly display name for the asset (e.g. 'Bitcoin').\n */\n name: v.string(),\n /**\n * UI-only display precision for asset amounts/balances.\n */\n quantityDisplayDecimals: v.number(),\n /**\n * Fixed integer scaling for quantities/amounts in this asset (0..18).\n */\n quantityScale: v.number(),\n }),\n v.transform((a) => ({\n symbol: a.asset,\n ledgerId: a.ledgerId,\n name: a.name,\n quantityDisplayDecimals: a.quantityDisplayDecimals,\n quantityScale: a.quantityScale,\n })),\n);\n\nexport const PairMarketDataConfigSchema = v.optional(\n v.object({\n /**\n * Available price grouping sizes for the orderbook in quote units.\n * Allows viewing orders bucketed by larger increments (e.g., [0.01, 0.1, 1, 10]).\n */\n orderbookPriceBuckets: v.array(v.number()),\n }),\n {\n orderbookPriceBuckets: [] as number[],\n },\n);\n\nfunction bpsToPercent(bps: number): number {\n return bps / 100;\n}\n\nexport const PairConfigSchema = v.pipe(\n v.object({\n /**\n * Internal engine symbol id for the pair.\n */\n symbolId: v.number(),\n /**\n * Pair symbol string, e.g. 'BTC-USDT'\n */\n symbol: v.string(),\n /**\n * Base asset symbol, e.g. 'BTC'\n */\n baseAsset: v.string(),\n /**\n * Quote asset symbol, e.g. 'USDT'\n */\n quoteAsset: v.string(),\n /**\n * (e.g., \"0.01\") - The smallest price increment allowed. If tick size is 0.01, you can price at $100.00, $100.01, $100.02... but NOT $100.005.\n */\n tickSize: v.string(),\n /**\n * (e.g., \"0.0001\") - The smallest quantity increment allowed. If step size is 0.0001, you can order 100.0000, 100.0001, 100.0002... but NOT 100.00005.\n */\n stepSize: v.string(),\n /**\n * (e.g., \"1\") - Minimum order value in quote currency. If it's \"1\" and quote is USD, your order must be worth at least $1. So you can't buy $0.50 worth of something.\n */\n minNotionalQuote: v.string(),\n /**\n * Minimum quantity you can order in base currency terms. If it's \"0.001\" for BTC, smallest order is 0.001 BTC.\n */\n minQtyBase: v.string(),\n\n /**\n * Controls whether trading fee can be deducted from what you receive when buying.\n * Example\n * - You buy 1 ETH, fee is 0.1%\n * - if `true`, you receive 0.999 ETH (fee taken from ETH you're getting)\n * - if `false`, you receive 1 ETH, but you pay the fee separately in the quote currency (e.g., extra USDT)\n */\n allowBuyFeeFromBase: v.boolean(),\n /**\n * Default market slippage for buy orders in basis points from proto.\n */\n defaultMarketSlippageBpsBuy: v.optional(v.number(), 0),\n /**\n * Default market slippage for sell orders in basis points from proto.\n */\n defaultMarketSlippageBpsSell: v.optional(v.number(), 0),\n /**\n * Maximum server/client reference-price drift in basis points from proto.\n */\n maxClientRefDriftBps: v.optional(v.number(), 0),\n\n /**\n * Market-data configuration for this pair (orderbook bucket sizes, depths).\n */\n marketdata: v.optional(PairMarketDataConfigSchema),\n /**\n * Base asset quantity scale copied from AssetConfig.quantityScale.\n */\n baseQuantityScale: v.number(),\n /**\n * Quote asset quantity scale copied from AssetConfig.quantityScale.\n */\n quoteQuantityScale: v.number(),\n /**\n * Optional scheduled listing timestamp (UTC).\n */\n listingAt: v.pipe(v.optional(v.unknown()), v.transform(timestampToMs)),\n /**\n * Optional scheduled delisting timestamp (UTC).\n */\n delistingAt: v.pipe(v.optional(v.unknown()), v.transform(timestampToMs)),\n /**\n * Operational status of the pair.\n */\n status: v.pipe(\n v.number(),\n v.transform(\n (status): PairStatus =>\n PairStatusCodec.protoToOutput[\n status as keyof typeof PairStatusCodec.protoToOutput\n ] ?? \"unknown\",\n ),\n ),\n }),\n v.transform(\n ({\n defaultMarketSlippageBpsBuy,\n defaultMarketSlippageBpsSell,\n maxClientRefDriftBps,\n ...pair\n }) => ({\n ...pair,\n defaultMarketSlippagePctBuy: bpsToPercent(defaultMarketSlippageBpsBuy),\n defaultMarketSlippagePctSell: bpsToPercent(defaultMarketSlippageBpsSell),\n maxClientRefDriftPct: bpsToPercent(maxClientRefDriftBps),\n }),\n ),\n);\n\nexport const SpotConfigSchema = v.object({\n assets: v.array(AssetConfigSchema),\n pairs: v.array(PairConfigSchema),\n tsSec: v.pipe(\n v.bigint(),\n v.transform((v) => Number(v) * 1000),\n ),\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"market-data.schemas.js","names":[],"sources":["../../../src/services/market-data/market-data.schemas.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { SideSchema } from \"../shared.js\";\nimport {\n PAIR_STATUSES,\n type AssetConfig,\n type PairConfig,\n type PairMarketDataConfig,\n type PairStatus,\n type SpotConfig,\n} from \"../../shared/catalog-config.js\";\nimport { tsNsToMs } from \"../../utils/time.js\";\nimport { timestampToMs, tsNsToTimestamp } from \"../../utils/timestamp.js\";\nimport { scaledToDecimalOutput, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport { PairStatusCodec, SideFilterCodec } from \"./market-data.codecs.js\";\n\nexport type { AssetConfig, PairConfig, PairMarketDataConfig, PairStatus, SpotConfig };\nexport { PAIR_STATUSES };\n\nexport function createMarketTradeSchema(scales: SdkScales) {\n return v.pipe(\n v.object({\n symbolId: v.number(),\n matchId: v.bigint(),\n isBuy: v.boolean(),\n priceTicks: v.bigint(),\n qtyScaled: v.bigint(),\n tsNs: v.optional(v.bigint(), 0n),\n }),\n v.transform((t) => {\n const sideLabel: v.InferOutput<typeof SideSchema> = t.isBuy ? \"buy\" : \"sell\";\n return {\n symbolId: t.symbolId,\n matchId: t.matchId.toString(),\n isBuy: t.isBuy,\n sideLabel,\n qty: scaledToDecimalOutput(t.qtyScaled, scales.baseQty(t.symbolId)),\n price: scaledToDecimalOutput(t.priceTicks, scales.price()),\n tsNs: t.tsNs.toString(),\n tsMs: tsNsToMs(t.tsNs),\n };\n }),\n );\n}\n\nexport type MarketTrade = v.InferOutput<ReturnType<typeof createMarketTradeSchema>>;\n\nexport const GetMarketTradesInputSchema = v.pipe(\n v.object({\n symbolId: v.pipe(v.number(), v.integer(), v.gtValue(0)),\n side: v.optional(SideSchema),\n startTsNs: v.pipe(\n v.optional(v.pipe(v.string(), v.trim())),\n v.transform((v) => (v ? BigInt(v) : undefined)),\n ),\n endTsNs: v.pipe(\n v.optional(v.pipe(v.string(), v.trim())),\n v.transform((v) => (v ? BigInt(v) : undefined)),\n ),\n limit: v.optional(v.pipe(v.number(), v.integer(), v.gtValue(0), v.maxValue(1_000))),\n pageToken: v.optional(v.pipe(v.string(), v.trim()), \"\"),\n }),\n v.transform((input) => ({\n symbolId: input.symbolId,\n side: input.side ? SideFilterCodec.inputToProto[input.side] : undefined,\n startTime: tsNsToTimestamp(input.startTsNs),\n endTime: tsNsToTimestamp(input.endTsNs),\n limit: input.limit,\n pageToken: input.pageToken,\n })),\n);\n\nexport function createGetMarketTradesInputSchema() {\n return GetMarketTradesInputSchema;\n}\n\nexport type GetMarketTradesInput = v.InferInput<\n ReturnType<typeof createGetMarketTradesInputSchema>\n>;\nexport type GetMarketTradesRequest = v.InferOutput<\n ReturnType<typeof createGetMarketTradesInputSchema>\n>;\n\nexport const AssetConfigSchema = v.pipe(\n v.object({\n /**\n * Asset identifier/symbol, e.g. 'USDT', 'BTC'.\n */\n asset: v.string(),\n /**\n * Internal ledger identifier for settlement systems.\n */\n ledgerId: v.number(),\n /**\n * The friendly display name for the asset (e.g. 'Bitcoin').\n */\n name: v.string(),\n /**\n * UI-only display precision for asset amounts/balances.\n */\n quantityDisplayDecimals: v.number(),\n /**\n * Fixed integer scaling for quantities/amounts in this asset (0..18).\n */\n quantityScale: v.number(),\n }),\n v.transform((a) => ({\n symbol: a.asset,\n ledgerId: a.ledgerId,\n name: a.name,\n quantityDisplayDecimals: a.quantityDisplayDecimals,\n quantityScale: a.quantityScale,\n })),\n);\n\nexport const PairMarketDataConfigSchema = v.optional(\n v.object({\n /**\n * Available price grouping sizes for the orderbook in quote units.\n * Allows viewing orders bucketed by larger increments (e.g., [0.01, 0.1, 1, 10]).\n */\n orderbookPriceBuckets: v.array(v.number()),\n }),\n {\n orderbookPriceBuckets: [] as number[],\n },\n);\n\nfunction bpsToPercent(bps: number): number {\n return bps / 100;\n}\n\nexport const PairConfigSchema = v.pipe(\n v.object({\n /**\n * Internal engine symbol id for the pair.\n */\n symbolId: v.number(),\n /**\n * Pair symbol string, e.g. 'BTC-USDT'\n */\n symbol: v.string(),\n /**\n * Base asset symbol, e.g. 'BTC'\n */\n baseAsset: v.string(),\n /**\n * Quote asset symbol, e.g. 'USDT'\n */\n quoteAsset: v.string(),\n /**\n * (e.g., \"0.01\") - The smallest price increment allowed. If tick size is 0.01, you can price at $100.00, $100.01, $100.02... but NOT $100.005.\n */\n tickSize: v.string(),\n /**\n * (e.g., \"0.0001\") - The smallest quantity increment allowed. If step size is 0.0001, you can order 100.0000, 100.0001, 100.0002... but NOT 100.00005.\n */\n stepSize: v.string(),\n /**\n * (e.g., \"1\") - Minimum order value in quote currency. If it's \"1\" and quote is USD, your order must be worth at least $1. So you can't buy $0.50 worth of something.\n */\n minNotionalQuote: v.string(),\n /**\n * Minimum quantity you can order in base currency terms. If it's \"0.001\" for BTC, smallest order is 0.001 BTC.\n */\n minQtyBase: v.string(),\n\n /**\n * Controls whether trading fee can be deducted from what you receive when buying.\n * Example\n * - You buy 1 ETH, fee is 0.1%\n * - if `true`, you receive 0.999 ETH (fee taken from ETH you're getting)\n * - if `false`, you receive 1 ETH, but you pay the fee separately in the quote currency (e.g., extra USDT)\n */\n allowBuyFeeFromBase: v.boolean(),\n /**\n * Default market slippage for buy orders in basis points from proto.\n */\n defaultMarketSlippageBpsBuy: v.optional(v.number(), 0),\n /**\n * Default market slippage for sell orders in basis points from proto.\n */\n defaultMarketSlippageBpsSell: v.optional(v.number(), 0),\n /**\n * Maximum server/client reference-price drift in basis points from proto.\n */\n maxClientRefDriftBps: v.optional(v.number(), 0),\n\n /**\n * Market-data configuration for this pair (orderbook bucket sizes, depths).\n */\n marketdata: v.optional(PairMarketDataConfigSchema),\n /**\n * Base asset quantity scale copied from AssetConfig.quantityScale.\n */\n baseQuantityScale: v.number(),\n /**\n * Quote asset quantity scale copied from AssetConfig.quantityScale.\n */\n quoteQuantityScale: v.number(),\n /**\n * Optional scheduled listing timestamp (UTC).\n */\n listingAt: v.pipe(v.optional(v.unknown()), v.transform(timestampToMs)),\n /**\n * Optional scheduled delisting timestamp (UTC).\n */\n delistingAt: v.pipe(v.optional(v.unknown()), v.transform(timestampToMs)),\n /**\n * Operational status of the pair.\n */\n status: v.pipe(\n v.number(),\n v.transform(\n (status): PairStatus =>\n PairStatusCodec.protoToOutput[\n status as keyof typeof PairStatusCodec.protoToOutput\n ] ?? \"unknown\",\n ),\n ),\n }),\n v.transform(\n ({\n defaultMarketSlippageBpsBuy,\n defaultMarketSlippageBpsSell,\n maxClientRefDriftBps,\n ...pair\n }) => ({\n ...pair,\n defaultMarketSlippagePctBuy: bpsToPercent(defaultMarketSlippageBpsBuy),\n defaultMarketSlippagePctSell: bpsToPercent(defaultMarketSlippageBpsSell),\n maxClientRefDriftPct: bpsToPercent(maxClientRefDriftBps),\n }),\n ),\n);\n\nexport const SpotConfigSchema = v.object({\n assets: v.array(AssetConfigSchema),\n pairs: v.array(PairConfigSchema),\n tsSec: v.pipe(\n v.bigint(),\n v.transform((v) => Number(v) * 1000),\n ),\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"market-overview.d.ts","names":[],"sources":["../../../src/services/market-overview/market-overview.ts"],"mappings":";;;;;;;UAoBU,qCAAqC,mBAAmB;EAC9D;EACA,qBAAqB;;;;;cAMZ;;EAMG,YAAA,WAAW,WAAW,UAAU,mBAAmB,QAAQ;;;;EAUjE,KACF,QAAO,yBACP,UAAU,0BACX;IAAU,SAAS;IAAkB;;;;;EAgBxC,UAAU,OAAO"}
1
+ {"version":3,"file":"market-overview.d.ts","names":[],"sources":["../../../src/services/market-overview/market-overview.ts"],"mappings":";;;;;;;UAqBU,qCAAqC,mBAAmB;EAC9D;EACA,qBAAqB;;;;;cAMZ;;EAMG,YAAA,WAAW,WAAW,UAAU,mBAAmB,QAAQ;;;;EAUjE,KACF,QAAO,yBACP,UAAU,0BACX;IAAU,SAAS;IAAkB;;;;;EAgBxC,UAAU,OAAO"}
@@ -1,4 +1,4 @@
1
- import { parse, validation_exports } from "../../shared/validation.js";
1
+ import { parse } from "../../shared/validation.js";
2
2
  import { toConnectCallOptions } from "../../shared/request-options.js";
3
3
  import { publicationHandlerErrorContext } from "../../shared/subscription-errors.js";
4
4
  import { createReadyGate } from "../../shared/decimal-surface.js";
@@ -6,6 +6,7 @@ import { MarketOverviewBatchSchema, MarketOverviewService as MarketOverviewServi
6
6
  import { snapshotThenStream } from "../../realtime/snapshot-then-stream.js";
7
7
  import { ListMarketOverviewInputSchema, createMarketOverviewSchema } from "./market-overview.schemas.js";
8
8
  import { createClient } from "@connectrpc/connect";
9
+ import * as v from "valibot";
9
10
  //#region src/services/market-overview/market-overview.ts
10
11
  /**
11
12
  * Provides ticker-style per-market stats and a live merged overview stream.
@@ -29,7 +30,7 @@ var MarketOverviewService = class {
29
30
  await this.#scales.ready();
30
31
  const res = await this.#client.listMarketOverview(validatedInput, toConnectCallOptions(options));
31
32
  return {
32
- markets: parse(validation_exports.array(this.#marketOverviewSchema), res.markets),
33
+ markets: parse(v.array(this.#marketOverviewSchema), res.markets),
33
34
  nextPageToken: res.nextPageToken
34
35
  };
35
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"market-overview.js","names":["#client","Proto.MarketOverviewService","#realtime","#scales","#marketOverviewSchema","v.parse","v","Proto.MarketOverviewBatchSchema"],"sources":["../../../src/services/market-overview/market-overview.ts"],"sourcesContent":["import * as Proto from \"../../gen/marketoverview/v1/marketoverview_pb.js\";\nimport { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport { publicationHandlerErrorContext } from \"../../shared/subscription-errors.js\";\nimport * as v from \"../../shared/validation.js\";\nimport type { PolyesterRealtime } from \"../../realtime/types.js\";\nimport { snapshotThenStream } from \"../../realtime/snapshot-then-stream.js\";\nimport type { BaseSubscribeInput } from \"../../shared/types.js\";\nimport {\n toConnectCallOptions,\n type PolyesterRequestOptions,\n} from \"../../shared/request-options.js\";\nimport { createReadyGate, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport {\n ListMarketOverviewInputSchema,\n createMarketOverviewSchema,\n type SparklineIntervalName,\n type ListMarketOverviewInput,\n type MarketOverview,\n} from \"./market-overview.schemas.js\";\n\ninterface SubscribeMarketOverviewInput extends BaseSubscribeInput<MarketOverview[]> {\n includeSparklines?: boolean;\n sparklineIntervals?: SparklineIntervalName[];\n}\n\n/**\n * Provides ticker-style per-market stats and a live merged overview stream.\n */\nexport class MarketOverviewService {\n #client: Client<typeof Proto.MarketOverviewService>;\n #realtime: PolyesterRealtime;\n #scales: SdkScales;\n #marketOverviewSchema: ReturnType<typeof createMarketOverviewSchema>;\n\n constructor(transport: Transport, realtime: PolyesterRealtime, scales: SdkScales) {\n this.#client = createClient(Proto.MarketOverviewService, transport);\n this.#realtime = realtime;\n this.#scales = scales;\n this.#marketOverviewSchema = createMarketOverviewSchema(scales);\n }\n\n /**\n * Returns market overview rows with last and index prices, 24h stats, top-of-book values, listing timestamp, and optional sparklines. Supports symbol filtering, sorting, pagination, and sparkline interval selection.\n */\n async list(\n input: ListMarketOverviewInput = {},\n options?: PolyesterRequestOptions,\n ): Promise<{ markets: MarketOverview[]; nextPageToken: string }> {\n const validatedInput = v.parse(ListMarketOverviewInputSchema, input);\n await this.#scales.ready();\n const res = await this.#client.listMarketOverview(\n validatedInput,\n toConnectCallOptions(options),\n );\n return {\n markets: v.parse(v.array(this.#marketOverviewSchema), res.markets),\n nextPageToken: res.nextPageToken,\n };\n }\n\n /**\n * Subscribes to public:spot:market_overview:updates:proto, fetches an initial snapshot, buffers updates until ready, and emits the merged set of latest market rows. On reconnect it refetches the snapshot before resuming updates.\n */\n subscribe(input: SubscribeMarketOverviewInput): () => void {\n const channel = \"public:spot:market_overview:updates:proto\";\n const bySymbolId = new Map<number, MarketOverview>();\n const includeSparklines = input.includeSparklines ?? true;\n const sparklineIntervals = input.sparklineIntervals ?? [\"24h\"];\n const listMarketOverview = this.list.bind(this);\n const schema = this.#marketOverviewSchema;\n const gate = createReadyGate(\n () => this.#scales.ready(),\n (error) => input.onError?.(publicationHandlerErrorContext(channel, error)),\n );\n\n function emit(): void {\n input.onEvent(Array.from(bySymbolId.values()));\n }\n\n function handleMarketUpdate(m: MarketOverview): void {\n bySymbolId.set(m.symbolId, m);\n }\n\n function applyMarkets(markets: readonly MarketOverview[]): void {\n for (const market of markets) {\n handleMarketUpdate(market);\n }\n }\n\n function parseMarkets(markets: readonly Proto.MarketOverview[]): MarketOverview[] {\n return markets.map((m) => v.parse(schema, m));\n }\n\n async function fetchSnapshot(): Promise<MarketOverview[]> {\n const result = await listMarketOverview({\n includeSparklines,\n sparklineIntervals,\n });\n return result.markets;\n }\n\n const stream = snapshotThenStream({\n realtime: this.#realtime,\n channel,\n schema: Proto.MarketOverviewBatchSchema,\n maxBufferedPublications: 2000,\n snapshotErrorLog: \"Failed to fetch market overview\",\n fetchSnapshot,\n readPublication: (batch) => batch.markets ?? [],\n applySnapshot: (markets, bufferedMarkets) => {\n gate.run(() => {\n bySymbolId.clear();\n applyMarkets(markets);\n applyMarkets(parseMarkets(bufferedMarkets));\n emit();\n });\n },\n applyLivePublications: (markets) => {\n gate.run(() => {\n applyMarkets(parseMarkets(markets));\n emit();\n });\n },\n onOpen: input.onOpen,\n onClose: input.onClose,\n onError: input.onError,\n });\n\n function dispose(): void {\n stream.unsubscribe();\n }\n\n return dispose;\n }\n}\n"],"mappings":";;;;;;;;;;;;AA4BA,IAAa,wBAAb,MAAmC;CAC/B;CACA;CACA;CACA;CAEA,YAAY,WAAsB,UAA6B,QAAmB;EAC9E,KAAKA,UAAU,aAAaC,yBAA6B,SAAS;EAClE,KAAKC,YAAY;EACjB,KAAKC,UAAU;EACf,KAAKC,wBAAwB,2BAA2B,MAAM;CAClE;;;;CAKA,MAAM,KACF,QAAiC,CAAC,GAClC,SAC6D;EAC7D,MAAM,iBAAiBC,MAAQ,+BAA+B,KAAK;EACnE,MAAM,KAAKF,QAAQ,MAAM;EACzB,MAAM,MAAM,MAAM,KAAKH,QAAQ,mBAC3B,gBACA,qBAAqB,OAAO,CAChC;EACA,OAAO;GACH,SAASK,MAAQC,mBAAE,MAAM,KAAKF,qBAAqB,GAAG,IAAI,OAAO;GACjE,eAAe,IAAI;EACvB;CACJ;;;;CAKA,UAAU,OAAiD;EACvD,MAAM,UAAU;EAChB,MAAM,6BAAa,IAAI,IAA4B;EACnD,MAAM,oBAAoB,MAAM,qBAAqB;EACrD,MAAM,qBAAqB,MAAM,sBAAsB,CAAC,KAAK;EAC7D,MAAM,qBAAqB,KAAK,KAAK,KAAK,IAAI;EAC9C,MAAM,SAAS,KAAKA;EACpB,MAAM,OAAO,sBACH,KAAKD,QAAQ,MAAM,IACxB,UAAU,MAAM,UAAU,+BAA+B,SAAS,KAAK,CAAC,CAC7E;EAEA,SAAS,OAAa;GAClB,MAAM,QAAQ,MAAM,KAAK,WAAW,OAAO,CAAC,CAAC;EACjD;EAEA,SAAS,mBAAmB,GAAyB;GACjD,WAAW,IAAI,EAAE,UAAU,CAAC;EAChC;EAEA,SAAS,aAAa,SAA0C;GAC5D,KAAK,MAAM,UAAU,SACjB,mBAAmB,MAAM;EAEjC;EAEA,SAAS,aAAa,SAA4D;GAC9E,OAAO,QAAQ,KAAK,MAAME,MAAQ,QAAQ,CAAC,CAAC;EAChD;EAEA,eAAe,gBAA2C;GAKtD,QAAO,MAJc,mBAAmB;IACpC;IACA;GACJ,CAAC,EAAA,CACa;EAClB;EAEA,MAAM,SAAS,mBAAmB;GAC9B,UAAU,KAAKH;GACf;GACA,QAAQK;GACR,yBAAyB;GACzB,kBAAkB;GAClB;GACA,kBAAkB,UAAU,MAAM,WAAW,CAAC;GAC9C,gBAAgB,SAAS,oBAAoB;IACzC,KAAK,UAAU;KACX,WAAW,MAAM;KACjB,aAAa,OAAO;KACpB,aAAa,aAAa,eAAe,CAAC;KAC1C,KAAK;IACT,CAAC;GACL;GACA,wBAAwB,YAAY;IAChC,KAAK,UAAU;KACX,aAAa,aAAa,OAAO,CAAC;KAClC,KAAK;IACT,CAAC;GACL;GACA,QAAQ,MAAM;GACd,SAAS,MAAM;GACf,SAAS,MAAM;EACnB,CAAC;EAED,SAAS,UAAgB;GACrB,OAAO,YAAY;EACvB;EAEA,OAAO;CACX;AACJ"}
1
+ {"version":3,"file":"market-overview.js","names":["#client","Proto.MarketOverviewService","#realtime","#scales","#marketOverviewSchema","Proto.MarketOverviewBatchSchema"],"sources":["../../../src/services/market-overview/market-overview.ts"],"sourcesContent":["import * as Proto from \"../../gen/marketoverview/v1/marketoverview_pb.js\";\nimport { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport { publicationHandlerErrorContext } from \"../../shared/subscription-errors.js\";\nimport * as v from \"valibot\";\nimport { parse } from \"../../shared/validation.js\";\nimport type { PolyesterRealtime } from \"../../realtime/types.js\";\nimport { snapshotThenStream } from \"../../realtime/snapshot-then-stream.js\";\nimport type { BaseSubscribeInput } from \"../../shared/types.js\";\nimport {\n toConnectCallOptions,\n type PolyesterRequestOptions,\n} from \"../../shared/request-options.js\";\nimport { createReadyGate, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport {\n ListMarketOverviewInputSchema,\n createMarketOverviewSchema,\n type SparklineIntervalName,\n type ListMarketOverviewInput,\n type MarketOverview,\n} from \"./market-overview.schemas.js\";\n\ninterface SubscribeMarketOverviewInput extends BaseSubscribeInput<MarketOverview[]> {\n includeSparklines?: boolean;\n sparklineIntervals?: SparklineIntervalName[];\n}\n\n/**\n * Provides ticker-style per-market stats and a live merged overview stream.\n */\nexport class MarketOverviewService {\n #client: Client<typeof Proto.MarketOverviewService>;\n #realtime: PolyesterRealtime;\n #scales: SdkScales;\n #marketOverviewSchema: ReturnType<typeof createMarketOverviewSchema>;\n\n constructor(transport: Transport, realtime: PolyesterRealtime, scales: SdkScales) {\n this.#client = createClient(Proto.MarketOverviewService, transport);\n this.#realtime = realtime;\n this.#scales = scales;\n this.#marketOverviewSchema = createMarketOverviewSchema(scales);\n }\n\n /**\n * Returns market overview rows with last and index prices, 24h stats, top-of-book values, listing timestamp, and optional sparklines. Supports symbol filtering, sorting, pagination, and sparkline interval selection.\n */\n async list(\n input: ListMarketOverviewInput = {},\n options?: PolyesterRequestOptions,\n ): Promise<{ markets: MarketOverview[]; nextPageToken: string }> {\n const validatedInput = parse(ListMarketOverviewInputSchema, input);\n await this.#scales.ready();\n const res = await this.#client.listMarketOverview(\n validatedInput,\n toConnectCallOptions(options),\n );\n return {\n markets: parse(v.array(this.#marketOverviewSchema), res.markets),\n nextPageToken: res.nextPageToken,\n };\n }\n\n /**\n * Subscribes to public:spot:market_overview:updates:proto, fetches an initial snapshot, buffers updates until ready, and emits the merged set of latest market rows. On reconnect it refetches the snapshot before resuming updates.\n */\n subscribe(input: SubscribeMarketOverviewInput): () => void {\n const channel = \"public:spot:market_overview:updates:proto\";\n const bySymbolId = new Map<number, MarketOverview>();\n const includeSparklines = input.includeSparklines ?? true;\n const sparklineIntervals = input.sparklineIntervals ?? [\"24h\"];\n const listMarketOverview = this.list.bind(this);\n const schema = this.#marketOverviewSchema;\n const gate = createReadyGate(\n () => this.#scales.ready(),\n (error) => input.onError?.(publicationHandlerErrorContext(channel, error)),\n );\n\n function emit(): void {\n input.onEvent(Array.from(bySymbolId.values()));\n }\n\n function handleMarketUpdate(m: MarketOverview): void {\n bySymbolId.set(m.symbolId, m);\n }\n\n function applyMarkets(markets: readonly MarketOverview[]): void {\n for (const market of markets) {\n handleMarketUpdate(market);\n }\n }\n\n function parseMarkets(markets: readonly Proto.MarketOverview[]): MarketOverview[] {\n return markets.map((m) => parse(schema, m));\n }\n\n async function fetchSnapshot(): Promise<MarketOverview[]> {\n const result = await listMarketOverview({\n includeSparklines,\n sparklineIntervals,\n });\n return result.markets;\n }\n\n const stream = snapshotThenStream({\n realtime: this.#realtime,\n channel,\n schema: Proto.MarketOverviewBatchSchema,\n maxBufferedPublications: 2000,\n snapshotErrorLog: \"Failed to fetch market overview\",\n fetchSnapshot,\n readPublication: (batch) => batch.markets ?? [],\n applySnapshot: (markets, bufferedMarkets) => {\n gate.run(() => {\n bySymbolId.clear();\n applyMarkets(markets);\n applyMarkets(parseMarkets(bufferedMarkets));\n emit();\n });\n },\n applyLivePublications: (markets) => {\n gate.run(() => {\n applyMarkets(parseMarkets(markets));\n emit();\n });\n },\n onOpen: input.onOpen,\n onClose: input.onClose,\n onError: input.onError,\n });\n\n function dispose(): void {\n stream.unsubscribe();\n }\n\n return dispose;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AA6BA,IAAa,wBAAb,MAAmC;CAC/B;CACA;CACA;CACA;CAEA,YAAY,WAAsB,UAA6B,QAAmB;EAC9E,KAAKA,UAAU,aAAaC,yBAA6B,SAAS;EAClE,KAAKC,YAAY;EACjB,KAAKC,UAAU;EACf,KAAKC,wBAAwB,2BAA2B,MAAM;CAClE;;;;CAKA,MAAM,KACF,QAAiC,CAAC,GAClC,SAC6D;EAC7D,MAAM,iBAAiB,MAAM,+BAA+B,KAAK;EACjE,MAAM,KAAKD,QAAQ,MAAM;EACzB,MAAM,MAAM,MAAM,KAAKH,QAAQ,mBAC3B,gBACA,qBAAqB,OAAO,CAChC;EACA,OAAO;GACH,SAAS,MAAM,EAAE,MAAM,KAAKI,qBAAqB,GAAG,IAAI,OAAO;GAC/D,eAAe,IAAI;EACvB;CACJ;;;;CAKA,UAAU,OAAiD;EACvD,MAAM,UAAU;EAChB,MAAM,6BAAa,IAAI,IAA4B;EACnD,MAAM,oBAAoB,MAAM,qBAAqB;EACrD,MAAM,qBAAqB,MAAM,sBAAsB,CAAC,KAAK;EAC7D,MAAM,qBAAqB,KAAK,KAAK,KAAK,IAAI;EAC9C,MAAM,SAAS,KAAKA;EACpB,MAAM,OAAO,sBACH,KAAKD,QAAQ,MAAM,IACxB,UAAU,MAAM,UAAU,+BAA+B,SAAS,KAAK,CAAC,CAC7E;EAEA,SAAS,OAAa;GAClB,MAAM,QAAQ,MAAM,KAAK,WAAW,OAAO,CAAC,CAAC;EACjD;EAEA,SAAS,mBAAmB,GAAyB;GACjD,WAAW,IAAI,EAAE,UAAU,CAAC;EAChC;EAEA,SAAS,aAAa,SAA0C;GAC5D,KAAK,MAAM,UAAU,SACjB,mBAAmB,MAAM;EAEjC;EAEA,SAAS,aAAa,SAA4D;GAC9E,OAAO,QAAQ,KAAK,MAAM,MAAM,QAAQ,CAAC,CAAC;EAC9C;EAEA,eAAe,gBAA2C;GAKtD,QAAO,MAJc,mBAAmB;IACpC;IACA;GACJ,CAAC,EAAA,CACa;EAClB;EAEA,MAAM,SAAS,mBAAmB;GAC9B,UAAU,KAAKD;GACf;GACA,QAAQG;GACR,yBAAyB;GACzB,kBAAkB;GAClB;GACA,kBAAkB,UAAU,MAAM,WAAW,CAAC;GAC9C,gBAAgB,SAAS,oBAAoB;IACzC,KAAK,UAAU;KACX,WAAW,MAAM;KACjB,aAAa,OAAO;KACpB,aAAa,aAAa,eAAe,CAAC;KAC1C,KAAK;IACT,CAAC;GACL;GACA,wBAAwB,YAAY;IAChC,KAAK,UAAU;KACX,aAAa,aAAa,OAAO,CAAC;KAClC,KAAK;IACT,CAAC;GACL;GACA,QAAQ,MAAM;GACd,SAAS,MAAM;GACf,SAAS,MAAM;EACnB,CAAC;EAED,SAAS,UAAgB;GACrB,OAAO,YAAY;EACvB;EAEA,OAAO;CACX;AACJ"}
@@ -1,40 +1,40 @@
1
- import { validation_d_exports } from "../../shared/validation.js";
2
1
  import { MarketOrderBy, SortDirection, SparklineInterval } from "../../gen/marketoverview/v1/marketoverview_pb.js";
3
2
  import { DecodedEnum } from "../../utils/types.js";
4
3
  import { SdkScales } from "../../shared/decimal-surface.js";
5
4
  import "./market-overview.codecs.js";
5
+ import * as v from "valibot";
6
6
  //#region src/services/market-overview/market-overview.schemas.d.ts
7
- declare const SparklineIntervalSchema: validation_d_exports.PicklistSchema<readonly ["1h", "24h", "1w", "1m"], undefined>;
8
- type SparklineIntervalName = validation_d_exports.InferOutput<typeof SparklineIntervalSchema>;
7
+ declare const SparklineIntervalSchema: v.PicklistSchema<readonly ["1h", "24h", "1w", "1m"], undefined>;
8
+ type SparklineIntervalName = v.InferOutput<typeof SparklineIntervalSchema>;
9
9
  type MarketOverviewSparkline = {
10
10
  interval: DecodedEnum<SparklineIntervalName>;
11
11
  close: string[];
12
12
  };
13
- declare const MarketOverviewOrderBySchema: validation_d_exports.PicklistSchema<readonly ["change_24h_bps", "volume_24h_quote", "last_price", "date_added"], undefined>;
14
- type MarketOverviewOrderBy = validation_d_exports.InferOutput<typeof MarketOverviewOrderBySchema>;
15
- declare const MarketOverviewSortSchema: validation_d_exports.PicklistSchema<readonly ["asc", "desc"], undefined>;
16
- type MarketOverviewSort = validation_d_exports.InferOutput<typeof MarketOverviewSortSchema>;
17
- declare function createMarketOverviewSchema(scales: SdkScales): validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.ObjectSchema<{
18
- readonly symbolId: validation_d_exports.NumberSchema<undefined>;
19
- readonly symbol: validation_d_exports.StringSchema<undefined>;
20
- readonly lastPriceTicks: validation_d_exports.BigintSchema<undefined>;
21
- readonly lastTradeTsNs: validation_d_exports.OptionalSchema<validation_d_exports.BigintSchema<undefined>, 0n>;
22
- readonly change24hBps: validation_d_exports.NumberSchema<undefined>;
23
- readonly high24hTicks: validation_d_exports.BigintSchema<undefined>;
24
- readonly low24hTicks: validation_d_exports.BigintSchema<undefined>;
25
- readonly volume24hBaseScaled: validation_d_exports.BigintSchema<undefined>;
26
- readonly volume24hQuoteScaled: validation_d_exports.BigintSchema<undefined>;
27
- readonly listedTsNs: validation_d_exports.OptionalSchema<validation_d_exports.BigintSchema<undefined>, 0n>;
28
- readonly bestBidTicks: validation_d_exports.BigintSchema<undefined>;
29
- readonly bestBidQtyScaled: validation_d_exports.BigintSchema<undefined>;
30
- readonly bestAskTicks: validation_d_exports.BigintSchema<undefined>;
31
- readonly bestAskQtyScaled: validation_d_exports.BigintSchema<undefined>;
32
- readonly sparklines: validation_d_exports.OptionalSchema<validation_d_exports.ArraySchema<validation_d_exports.ObjectSchema<{
33
- readonly interval: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.EnumSchema<typeof SparklineInterval, undefined>, validation_d_exports.TransformAction<SparklineInterval, "unspecified" | "1h" | "24h" | "1w" | "1m">]>;
34
- readonly closeTicks: validation_d_exports.ArraySchema<validation_d_exports.BigintSchema<undefined>, undefined>;
13
+ declare const MarketOverviewOrderBySchema: v.PicklistSchema<readonly ["change_24h_bps", "volume_24h_quote", "last_price", "date_added"], undefined>;
14
+ type MarketOverviewOrderBy = v.InferOutput<typeof MarketOverviewOrderBySchema>;
15
+ declare const MarketOverviewSortSchema: v.PicklistSchema<readonly ["asc", "desc"], undefined>;
16
+ type MarketOverviewSort = v.InferOutput<typeof MarketOverviewSortSchema>;
17
+ declare function createMarketOverviewSchema(scales: SdkScales): v.SchemaWithPipe<readonly [v.ObjectSchema<{
18
+ readonly symbolId: v.NumberSchema<undefined>;
19
+ readonly symbol: v.StringSchema<undefined>;
20
+ readonly lastPriceTicks: v.BigintSchema<undefined>;
21
+ readonly lastTradeTsNs: v.OptionalSchema<v.BigintSchema<undefined>, 0n>;
22
+ readonly change24hBps: v.NumberSchema<undefined>;
23
+ readonly high24hTicks: v.BigintSchema<undefined>;
24
+ readonly low24hTicks: v.BigintSchema<undefined>;
25
+ readonly volume24hBaseScaled: v.BigintSchema<undefined>;
26
+ readonly volume24hQuoteScaled: v.BigintSchema<undefined>;
27
+ readonly listedTsNs: v.OptionalSchema<v.BigintSchema<undefined>, 0n>;
28
+ readonly bestBidTicks: v.BigintSchema<undefined>;
29
+ readonly bestBidQtyScaled: v.BigintSchema<undefined>;
30
+ readonly bestAskTicks: v.BigintSchema<undefined>;
31
+ readonly bestAskQtyScaled: v.BigintSchema<undefined>;
32
+ readonly sparklines: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
33
+ readonly interval: v.SchemaWithPipe<readonly [v.EnumSchema<typeof SparklineInterval, undefined>, v.TransformAction<SparklineInterval, "unspecified" | "1h" | "24h" | "1w" | "1m">]>;
34
+ readonly closeTicks: v.ArraySchema<v.BigintSchema<undefined>, undefined>;
35
35
  }, undefined>, undefined>, readonly []>;
36
- readonly indexPriceTicks: validation_d_exports.BigintSchema<undefined>;
37
- }, undefined>, validation_d_exports.TransformAction<{
36
+ readonly indexPriceTicks: v.BigintSchema<undefined>;
37
+ }, undefined>, v.TransformAction<{
38
38
  symbolId: number;
39
39
  symbol: string;
40
40
  lastPriceTicks: bigint;
@@ -72,17 +72,17 @@ declare function createMarketOverviewSchema(scales: SdkScales): validation_d_exp
72
72
  indexPrice: string | undefined;
73
73
  sparklines: MarketOverviewSparkline[];
74
74
  }>]>;
75
- type MarketOverview = validation_d_exports.InferOutput<ReturnType<typeof createMarketOverviewSchema>>;
76
- declare const ListMarketOverviewInputSchema: validation_d_exports.ObjectSchema<{
77
- readonly symbols: validation_d_exports.OptionalSchema<validation_d_exports.ArraySchema<validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.StringSchema<undefined>, validation_d_exports.TrimAction, validation_d_exports.MinLengthAction<string, 1, undefined>]>, undefined>, readonly []>;
78
- readonly limit: validation_d_exports.OptionalSchema<validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.NumberSchema<undefined>, validation_d_exports.IntegerAction<number, undefined>, validation_d_exports.GtValueAction<number, 0, undefined>]>, 500>;
79
- readonly pageToken: validation_d_exports.OptionalSchema<validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.StringSchema<undefined>, validation_d_exports.TrimAction]>, "">;
80
- readonly orderBy: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.OptionalSchema<validation_d_exports.PicklistSchema<readonly ["change_24h_bps", "volume_24h_quote", "last_price", "date_added"], undefined>, "volume_24h_quote">, validation_d_exports.TransformAction<"change_24h_bps" | "volume_24h_quote" | "last_price" | "date_added", MarketOrderBy.ORDER_BY_CHANGE_24H_BPS | MarketOrderBy.ORDER_BY_VOLUME_24H_QUOTE | MarketOrderBy.ORDER_BY_LAST_PRICE | MarketOrderBy.ORDER_BY_DATE_ADDED>]>;
81
- readonly sort: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.OptionalSchema<validation_d_exports.PicklistSchema<readonly ["asc", "desc"], undefined>, "desc">, validation_d_exports.TransformAction<"asc" | "desc", SortDirection.SORT_ASC | SortDirection.SORT_DESC>]>;
82
- readonly includeSparklines: validation_d_exports.OptionalSchema<validation_d_exports.BooleanSchema<undefined>, true>;
83
- readonly sparklineIntervals: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.OptionalSchema<validation_d_exports.ArraySchema<validation_d_exports.PicklistSchema<readonly ["1h", "24h", "1w", "1m"], undefined>, undefined>, readonly ["24h"]>, validation_d_exports.TransformAction<("1h" | "24h" | "1w" | "1m")[], (SparklineInterval.SPARKLINE_1H | SparklineInterval.SPARKLINE_24H | SparklineInterval.SPARKLINE_1W | SparklineInterval.SPARKLINE_1M)[]>]>;
75
+ type MarketOverview = v.InferOutput<ReturnType<typeof createMarketOverviewSchema>>;
76
+ declare const ListMarketOverviewInputSchema: v.ObjectSchema<{
77
+ readonly symbols: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>, readonly []>;
78
+ readonly limit: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.GtValueAction<number, 0, undefined>]>, 500>;
79
+ readonly pageToken: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction]>, "">;
80
+ readonly orderBy: v.SchemaWithPipe<readonly [v.OptionalSchema<v.PicklistSchema<readonly ["change_24h_bps", "volume_24h_quote", "last_price", "date_added"], undefined>, "volume_24h_quote">, v.TransformAction<"change_24h_bps" | "volume_24h_quote" | "last_price" | "date_added", MarketOrderBy.ORDER_BY_CHANGE_24H_BPS | MarketOrderBy.ORDER_BY_VOLUME_24H_QUOTE | MarketOrderBy.ORDER_BY_LAST_PRICE | MarketOrderBy.ORDER_BY_DATE_ADDED>]>;
81
+ readonly sort: v.SchemaWithPipe<readonly [v.OptionalSchema<v.PicklistSchema<readonly ["asc", "desc"], undefined>, "desc">, v.TransformAction<"asc" | "desc", SortDirection.SORT_ASC | SortDirection.SORT_DESC>]>;
82
+ readonly includeSparklines: v.OptionalSchema<v.BooleanSchema<undefined>, true>;
83
+ readonly sparklineIntervals: v.SchemaWithPipe<readonly [v.OptionalSchema<v.ArraySchema<v.PicklistSchema<readonly ["1h", "24h", "1w", "1m"], undefined>, undefined>, readonly ["24h"]>, v.TransformAction<("1h" | "24h" | "1w" | "1m")[], (SparklineInterval.SPARKLINE_1H | SparklineInterval.SPARKLINE_24H | SparklineInterval.SPARKLINE_1W | SparklineInterval.SPARKLINE_1M)[]>]>;
84
84
  }, undefined>;
85
- type ListMarketOverviewInput = validation_d_exports.InferInput<typeof ListMarketOverviewInputSchema>;
85
+ type ListMarketOverviewInput = v.InferInput<typeof ListMarketOverviewInputSchema>;
86
86
  //#endregion
87
87
  export { ListMarketOverviewInput, ListMarketOverviewInputSchema, MarketOverview, MarketOverviewOrderBy, MarketOverviewOrderBySchema, MarketOverviewSort, MarketOverviewSortSchema, MarketOverviewSparkline, SparklineIntervalName, SparklineIntervalSchema, createMarketOverviewSchema };
88
88
  //# sourceMappingURL=market-overview.schemas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"market-overview.schemas.d.ts","names":[],"sources":["../../../src/services/market-overview/market-overview.schemas.ts"],"mappings":";;;;;;cA2Ba,yBAAuB,qBAAA;KAExB,wBAAwB,qBAAE,mBAAmB;KAiB7C;EACR,UAAU,YAAY;EACtB;;cAGS,6BAA2B,qBAAA;KAE5B,wBAAwB,qBAAE,mBAAmB;cAE5C,0BAAwB,qBAAA;KAEzB,qBAAqB,qBAAE,mBAAmB;iBAqBtC,2BAA2B,QAAQ,YAAS,qBAAA,yBAAA,qBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuChD,iBAAiB,qBAAE,YAAY,kBAAkB;cAqChD,+BAA6B,qBAAA;;;;;;;;;KAqB9B,0BAA0B,qBAAE,kBAAkB"}
1
+ {"version":3,"file":"market-overview.schemas.d.ts","names":[],"sources":["../../../src/services/market-overview/market-overview.schemas.ts"],"mappings":";;;;;;cA2Ba,yBAAuB,EAAA;KAExB,wBAAwB,EAAE,mBAAmB;KAiB7C;EACR,UAAU,YAAY;EACtB;;cAGS,6BAA2B,EAAA;KAE5B,wBAAwB,EAAE,mBAAmB;cAE5C,0BAAwB,EAAA;KAEzB,qBAAqB,EAAE,mBAAmB;iBAqBtC,2BAA2B,QAAQ,YAAS,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuChD,iBAAiB,EAAE,YAAY,kBAAkB;cAqChD,+BAA6B,EAAA;;;;;;;;;KAqB9B,0BAA0B,EAAE,kBAAkB"}