@lightconexyz/lightcone-sdk 0.2.3 → 0.2.41

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 (177) hide show
  1. package/README.md +30 -37
  2. package/dist/auth/client.d.ts.map +1 -1
  3. package/dist/auth/client.js +3 -10
  4. package/dist/auth/client.js.map +1 -1
  5. package/dist/auth/index.d.ts +3 -1
  6. package/dist/auth/index.d.ts.map +1 -1
  7. package/dist/auth/index.js.map +1 -1
  8. package/dist/client.d.ts +14 -15
  9. package/dist/client.d.ts.map +1 -1
  10. package/dist/client.js +33 -31
  11. package/dist/client.js.map +1 -1
  12. package/dist/context.d.ts +9 -0
  13. package/dist/context.d.ts.map +1 -0
  14. package/dist/context.js +10 -0
  15. package/dist/context.js.map +1 -0
  16. package/dist/domain/admin/client.d.ts +27 -5
  17. package/dist/domain/admin/client.d.ts.map +1 -1
  18. package/dist/domain/admin/client.js +89 -0
  19. package/dist/domain/admin/client.js.map +1 -1
  20. package/dist/domain/index.d.ts +0 -1
  21. package/dist/domain/index.d.ts.map +1 -1
  22. package/dist/domain/index.js +1 -2
  23. package/dist/domain/index.js.map +1 -1
  24. package/dist/domain/market/client.d.ts +13 -5
  25. package/dist/domain/market/client.d.ts.map +1 -1
  26. package/dist/domain/market/client.js +86 -0
  27. package/dist/domain/market/client.js.map +1 -1
  28. package/dist/domain/order/client.d.ts +23 -5
  29. package/dist/domain/order/client.d.ts.map +1 -1
  30. package/dist/domain/order/client.js +99 -0
  31. package/dist/domain/order/client.js.map +1 -1
  32. package/dist/domain/order/index.d.ts +8 -2
  33. package/dist/domain/order/index.d.ts.map +1 -1
  34. package/dist/domain/order/index.js +23 -0
  35. package/dist/domain/order/index.js.map +1 -1
  36. package/dist/domain/orderbook/client.d.ts +6 -14
  37. package/dist/domain/orderbook/client.d.ts.map +1 -1
  38. package/dist/domain/orderbook/client.js +16 -11
  39. package/dist/domain/orderbook/client.js.map +1 -1
  40. package/dist/domain/orderbook/index.d.ts +7 -0
  41. package/dist/domain/orderbook/index.d.ts.map +1 -1
  42. package/dist/domain/orderbook/index.js +17 -0
  43. package/dist/domain/orderbook/index.js.map +1 -1
  44. package/dist/domain/orderbook/state.d.ts +2 -0
  45. package/dist/domain/orderbook/state.d.ts.map +1 -1
  46. package/dist/domain/orderbook/state.js +25 -2
  47. package/dist/domain/orderbook/state.js.map +1 -1
  48. package/dist/domain/position/client.d.ts +19 -5
  49. package/dist/domain/position/client.d.ts.map +1 -1
  50. package/dist/domain/position/client.js +71 -0
  51. package/dist/domain/position/client.js.map +1 -1
  52. package/dist/domain/position/index.d.ts +4 -1
  53. package/dist/domain/position/index.d.ts.map +1 -1
  54. package/dist/domain/position/index.js +20 -0
  55. package/dist/domain/position/index.js.map +1 -1
  56. package/dist/domain/position/wire.d.ts +6 -0
  57. package/dist/domain/position/wire.d.ts.map +1 -1
  58. package/dist/domain/position/wire.js.map +1 -1
  59. package/dist/domain/price_history/client.d.ts +14 -1
  60. package/dist/domain/price_history/client.d.ts.map +1 -1
  61. package/dist/domain/price_history/client.js +53 -0
  62. package/dist/domain/price_history/client.js.map +1 -1
  63. package/dist/domain/price_history/index.d.ts +4 -0
  64. package/dist/domain/price_history/index.d.ts.map +1 -1
  65. package/dist/domain/price_history/index.js.map +1 -1
  66. package/dist/domain/price_history/state.d.ts +16 -0
  67. package/dist/domain/price_history/state.d.ts.map +1 -1
  68. package/dist/domain/price_history/state.js +42 -1
  69. package/dist/domain/price_history/state.js.map +1 -1
  70. package/dist/domain/price_history/wire.d.ts +34 -0
  71. package/dist/domain/price_history/wire.d.ts.map +1 -1
  72. package/dist/domain/price_history/wire.js.map +1 -1
  73. package/dist/http/client.d.ts +0 -1
  74. package/dist/http/client.d.ts.map +1 -1
  75. package/dist/http/client.js +29 -39
  76. package/dist/http/client.js.map +1 -1
  77. package/dist/index.d.ts +4 -1
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +5 -1
  80. package/dist/index.js.map +1 -1
  81. package/dist/prelude.d.ts +5 -6
  82. package/dist/prelude.d.ts.map +1 -1
  83. package/dist/prelude.js +4 -5
  84. package/dist/prelude.js.map +1 -1
  85. package/dist/privy/client.d.ts +1 -0
  86. package/dist/privy/client.d.ts.map +1 -1
  87. package/dist/privy/client.js +10 -0
  88. package/dist/privy/client.js.map +1 -1
  89. package/dist/privy/index.d.ts +1 -0
  90. package/dist/privy/index.d.ts.map +1 -1
  91. package/dist/privy/index.js +4 -0
  92. package/dist/privy/index.js.map +1 -1
  93. package/dist/program/accounts.d.ts +2 -1
  94. package/dist/program/accounts.d.ts.map +1 -1
  95. package/dist/program/accounts.js +2 -1
  96. package/dist/program/accounts.js.map +1 -1
  97. package/dist/program/builder.d.ts +3 -0
  98. package/dist/program/builder.d.ts.map +1 -1
  99. package/dist/program/builder.js +8 -0
  100. package/dist/program/builder.js.map +1 -1
  101. package/dist/program/constants.d.ts +3 -2
  102. package/dist/program/constants.d.ts.map +1 -1
  103. package/dist/program/constants.js +3 -2
  104. package/dist/program/constants.js.map +1 -1
  105. package/dist/program/envelope.d.ts +19 -9
  106. package/dist/program/envelope.d.ts.map +1 -1
  107. package/dist/program/envelope.js +54 -20
  108. package/dist/program/envelope.js.map +1 -1
  109. package/dist/program/index.d.ts +3 -4
  110. package/dist/program/index.d.ts.map +1 -1
  111. package/dist/program/index.js +34 -6
  112. package/dist/program/index.js.map +1 -1
  113. package/dist/program/instructions.d.ts +40 -3
  114. package/dist/program/instructions.d.ts.map +1 -1
  115. package/dist/program/instructions.js +158 -3
  116. package/dist/program/instructions.js.map +1 -1
  117. package/dist/program/orders.d.ts +36 -18
  118. package/dist/program/orders.d.ts.map +1 -1
  119. package/dist/program/orders.js +97 -20
  120. package/dist/program/orders.js.map +1 -1
  121. package/dist/program/types.d.ts +14 -2
  122. package/dist/program/types.d.ts.map +1 -1
  123. package/dist/program/types.js.map +1 -1
  124. package/dist/rpc.d.ts +19 -0
  125. package/dist/rpc.d.ts.map +1 -0
  126. package/dist/rpc.js +51 -0
  127. package/dist/rpc.js.map +1 -0
  128. package/dist/shared/fmt/decimal.d.ts +1 -1
  129. package/dist/shared/fmt/decimal.d.ts.map +1 -1
  130. package/dist/shared/fmt/decimal.js +2 -2
  131. package/dist/shared/fmt/decimal.js.map +1 -1
  132. package/dist/shared/index.d.ts +1 -1
  133. package/dist/shared/index.d.ts.map +1 -1
  134. package/dist/shared/index.js +2 -1
  135. package/dist/shared/index.js.map +1 -1
  136. package/dist/shared/scaling.d.ts.map +1 -1
  137. package/dist/shared/scaling.js +7 -3
  138. package/dist/shared/scaling.js.map +1 -1
  139. package/dist/shared/types.d.ts +2 -0
  140. package/dist/shared/types.d.ts.map +1 -1
  141. package/dist/shared/types.js +9 -1
  142. package/dist/shared/types.js.map +1 -1
  143. package/dist/ws/client.browser.d.ts +2 -0
  144. package/dist/ws/client.browser.d.ts.map +1 -1
  145. package/dist/ws/client.browser.js +43 -6
  146. package/dist/ws/client.browser.js.map +1 -1
  147. package/dist/ws/client.node.d.ts +2 -0
  148. package/dist/ws/client.node.d.ts.map +1 -1
  149. package/dist/ws/client.node.js +43 -6
  150. package/dist/ws/client.node.js.map +1 -1
  151. package/dist/ws/index.d.ts +1 -2
  152. package/dist/ws/index.d.ts.map +1 -1
  153. package/dist/ws/index.js.map +1 -1
  154. package/dist/ws/types.d.ts +2 -0
  155. package/dist/ws/types.d.ts.map +1 -1
  156. package/dist/ws/types.js.map +1 -1
  157. package/package.json +1 -1
  158. package/dist/domain/deposit_price/client.d.ts +0 -21
  159. package/dist/domain/deposit_price/client.d.ts.map +0 -1
  160. package/dist/domain/deposit_price/client.js +0 -68
  161. package/dist/domain/deposit_price/client.js.map +0 -1
  162. package/dist/domain/deposit_price/index.d.ts +0 -9
  163. package/dist/domain/deposit_price/index.d.ts.map +0 -1
  164. package/dist/domain/deposit_price/index.js +0 -20
  165. package/dist/domain/deposit_price/index.js.map +0 -1
  166. package/dist/domain/deposit_price/state.d.ts +0 -17
  167. package/dist/domain/deposit_price/state.d.ts.map +0 -1
  168. package/dist/domain/deposit_price/state.js +0 -45
  169. package/dist/domain/deposit_price/state.js.map +0 -1
  170. package/dist/domain/deposit_price/wire.d.ts +0 -36
  171. package/dist/domain/deposit_price/wire.d.ts.map +0 -1
  172. package/dist/domain/deposit_price/wire.js +0 -3
  173. package/dist/domain/deposit_price/wire.js.map +0 -1
  174. package/dist/program/client.d.ts +0 -96
  175. package/dist/program/client.d.ts.map +0 -1
  176. package/dist/program/client.js +0 -372
  177. package/dist/program/client.js.map +0 -1
@@ -5,11 +5,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Orders = void 0;
7
7
  exports.cancelBodyFromBase58 = cancelBodyFromBase58;
8
+ exports.cancelBodySigned = cancelBodySigned;
8
9
  exports.cancelAllBodyFromBase58 = cancelAllBodyFromBase58;
10
+ exports.cancelAllBodySigned = cancelAllBodySigned;
9
11
  exports.cancelTriggerBodyFromBase58 = cancelTriggerBodyFromBase58;
12
+ exports.cancelTriggerBodySigned = cancelTriggerBodySigned;
10
13
  const bs58_1 = __importDefault(require("bs58"));
14
+ const web3_js_1 = require("@solana/web3.js");
15
+ const context_1 = require("../../context");
11
16
  const error_1 = require("../../error");
12
17
  const http_1 = require("../../http");
18
+ const instructions_1 = require("../../program/instructions");
19
+ const orders_1 = require("../../program/orders");
20
+ const pda_1 = require("../../program/pda");
21
+ const accounts_1 = require("../../program/accounts");
13
22
  function cancelBodyFromBase58(orderHash, maker, signatureBase58) {
14
23
  return {
15
24
  order_hash: orderHash,
@@ -17,6 +26,10 @@ function cancelBodyFromBase58(orderHash, maker, signatureBase58) {
17
26
  signature: Buffer.from(bs58_1.default.decode(signatureBase58)).toString("hex"),
18
27
  };
19
28
  }
29
+ function cancelBodySigned(orderHash, maker, keypair) {
30
+ const signature = (0, orders_1.signCancelOrder)(orderHash, keypair);
31
+ return { order_hash: orderHash, maker, signature };
32
+ }
20
33
  function cancelAllBodyFromBase58(userPubkey, orderbookId, timestamp, salt, signatureBase58) {
21
34
  return {
22
35
  user_pubkey: userPubkey,
@@ -26,6 +39,10 @@ function cancelAllBodyFromBase58(userPubkey, orderbookId, timestamp, salt, signa
26
39
  salt,
27
40
  };
28
41
  }
42
+ function cancelAllBodySigned(userPubkey, orderbookId, timestamp, salt, keypair) {
43
+ const signature = (0, orders_1.signCancelAll)(userPubkey, orderbookId, timestamp, salt, keypair);
44
+ return { user_pubkey: userPubkey, orderbook_id: orderbookId, signature, timestamp, salt };
45
+ }
29
46
  function cancelTriggerBodyFromBase58(triggerOrderId, maker, signatureBase58) {
30
47
  return {
31
48
  trigger_order_id: triggerOrderId,
@@ -33,11 +50,28 @@ function cancelTriggerBodyFromBase58(triggerOrderId, maker, signatureBase58) {
33
50
  signature: Buffer.from(bs58_1.default.decode(signatureBase58)).toString("hex"),
34
51
  };
35
52
  }
53
+ function cancelTriggerBodySigned(triggerOrderId, maker, keypair) {
54
+ const signature = (0, orders_1.signCancelTriggerOrder)(triggerOrderId, keypair);
55
+ return { trigger_order_id: triggerOrderId, maker, signature };
56
+ }
57
+ // ─── Sub-client ──────────────────────────────────────────────────────────────
36
58
  class Orders {
37
59
  client;
38
60
  constructor(client) {
39
61
  this.client = client;
40
62
  }
63
+ // ── PDA helpers ──────────────────────────────────────────────────────
64
+ statusPda(orderHash) {
65
+ return (0, pda_1.getOrderStatusPda)(orderHash, this.client.programId)[0];
66
+ }
67
+ noncePda(user) {
68
+ return (0, pda_1.getUserNoncePda)(user, this.client.programId)[0];
69
+ }
70
+ // ── Helpers ──────────────────────────────────────────────────────────
71
+ generateCancelAllSalt() {
72
+ return (0, orders_1.generateCancelAllSalt)();
73
+ }
74
+ // ── HTTP methods ─────────────────────────────────────────────────────
41
75
  async submit(request) {
42
76
  const url = `${this.client.http.baseUrl()}/api/orders/submit`;
43
77
  const raw = await this.client.http.post(url, request, http_1.RetryPolicy.None);
@@ -125,6 +159,71 @@ class Orders {
125
159
  has_more: response.has_more ?? false,
126
160
  };
127
161
  }
162
+ // ── On-chain transaction builders ────────────────────────────────────
163
+ cancelOrderIx(maker, market, order) {
164
+ return (0, instructions_1.buildCancelOrderIx)(maker, market, order, this.client.programId);
165
+ }
166
+ incrementNonceIx(user) {
167
+ return (0, instructions_1.buildIncrementNonceIx)(user, this.client.programId);
168
+ }
169
+ // ── Transaction builders (_tx convenience wrappers) ─────────────────
170
+ cancelOrderTx(maker, market, order) {
171
+ const ix = this.cancelOrderIx(maker, market, order);
172
+ return new web3_js_1.Transaction({ feePayer: maker }).add(ix);
173
+ }
174
+ incrementNonceTx(user) {
175
+ const ix = this.incrementNonceIx(user);
176
+ return new web3_js_1.Transaction({ feePayer: user }).add(ix);
177
+ }
178
+ // ── Order helpers ────────────────────────────────────────────────────
179
+ createBidOrder(params) {
180
+ return (0, orders_1.createBidOrder)(params);
181
+ }
182
+ createAskOrder(params) {
183
+ return (0, orders_1.createAskOrder)(params);
184
+ }
185
+ createSignedBidOrder(params, signer) {
186
+ return (0, orders_1.createSignedBidOrder)(params, signer);
187
+ }
188
+ createSignedAskOrder(params, signer) {
189
+ return (0, orders_1.createSignedAskOrder)(params, signer);
190
+ }
191
+ hashOrder(order) {
192
+ return (0, orders_1.hashOrder)(order);
193
+ }
194
+ signOrder(order, signer) {
195
+ return (0, orders_1.signOrder)(order, signer);
196
+ }
197
+ signFullOrder(order, signer) {
198
+ return (0, orders_1.signOrderFull)(order, signer);
199
+ }
200
+ // ── On-chain account fetchers (require Connection) ──────────────────
201
+ async getStatus(orderHash) {
202
+ const connection = (0, context_1.requireConnection)(this.client);
203
+ const pda = this.statusPda(orderHash);
204
+ const accountInfo = await connection.getAccountInfo(pda);
205
+ if (!accountInfo) {
206
+ return null;
207
+ }
208
+ return (0, accounts_1.deserializeOrderStatus)(accountInfo.data);
209
+ }
210
+ async getNonce(user) {
211
+ const connection = (0, context_1.requireConnection)(this.client);
212
+ const pda = this.noncePda(user);
213
+ const accountInfo = await connection.getAccountInfo(pda);
214
+ if (!accountInfo) {
215
+ return 0n;
216
+ }
217
+ const userNonce = (0, accounts_1.deserializeUserNonce)(accountInfo.data);
218
+ return userNonce.nonce;
219
+ }
220
+ async currentNonce(user) {
221
+ const nonce = await this.getNonce(user);
222
+ if (nonce > 0xffffffffn) {
223
+ throw new Error(`Nonce exceeds u32 range: ${nonce}`);
224
+ }
225
+ return Number(nonce);
226
+ }
128
227
  }
129
228
  exports.Orders = Orders;
130
229
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/domain/order/client.ts"],"names":[],"mappings":"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","sourcesContent":["import bs58 from \"bs58\";\nimport { SdkError } from \"../../error\";\nimport { RetryPolicy, type LightconeHttp } from \"../../http\";\nimport type { OrderBookId, PubkeyStr } from \"../../shared\";\nimport type { UserSnapshotBalance, UserSnapshotOrder } from \"./wire\";\n\nexport interface CancelBody {\n order_hash: string;\n maker: PubkeyStr;\n signature: string;\n}\n\nexport function cancelBodyFromBase58(\n orderHash: string,\n maker: PubkeyStr,\n signatureBase58: string\n): CancelBody {\n return {\n order_hash: orderHash,\n maker,\n signature: Buffer.from(bs58.decode(signatureBase58)).toString(\"hex\"),\n };\n}\n\nexport interface CancelAllBody {\n user_pubkey: PubkeyStr;\n orderbook_id: OrderBookId;\n signature: string;\n timestamp: number;\n salt: string;\n}\n\nexport function cancelAllBodyFromBase58(\n userPubkey: PubkeyStr,\n orderbookId: OrderBookId,\n timestamp: number,\n salt: string,\n signatureBase58: string\n): CancelAllBody {\n return {\n user_pubkey: userPubkey,\n orderbook_id: orderbookId,\n signature: Buffer.from(bs58.decode(signatureBase58)).toString(\"hex\"),\n timestamp,\n salt,\n };\n}\n\nexport interface CancelTriggerBody {\n trigger_order_id: string;\n maker: PubkeyStr;\n signature: string;\n}\n\nexport function cancelTriggerBodyFromBase58(\n triggerOrderId: string,\n maker: PubkeyStr,\n signatureBase58: string\n): CancelTriggerBody {\n return {\n trigger_order_id: triggerOrderId,\n maker,\n signature: Buffer.from(bs58.decode(signatureBase58)).toString(\"hex\"),\n };\n}\n\nexport interface FillInfo {\n counterparty: PubkeyStr;\n counterparty_order_hash: string;\n fill_amount: string;\n price: string;\n is_maker: boolean;\n}\n\nexport interface SubmitOrderResponse {\n order_hash: string;\n remaining: string;\n filled: string;\n fills: FillInfo[];\n}\n\nexport type PlaceResponse =\n | ({ status: \"accepted\" } & SubmitOrderResponse)\n | ({ status: \"partial_fill\" } & SubmitOrderResponse)\n | ({ status: \"filled\" } & SubmitOrderResponse)\n | {\n status: \"rejected\";\n error?: string;\n details?: string;\n order_hash?: string;\n remaining?: string;\n filled?: string;\n }\n | { status: \"error\"; error?: string }\n | { status: \"bad_request\"; error?: string; details?: string }\n | { status: \"not_found\"; error?: string }\n | { status: \"forbidden\"; error?: string }\n | { status: \"internal_error\"; error?: string; details?: string }\n | { status: \"configuration_error\"; error?: string };\n\nexport interface CancelSuccess {\n order_hash: string;\n remaining: number;\n}\n\nexport type CancelResponse =\n | { status: \"cancelled\"; order_hash: string; remaining: number }\n | { status: \"error\"; error: string }\n | { status: \"bad_request\"; error: string }\n | { status: \"not_found\"; error: string }\n | { status: \"forbidden\"; error: string }\n | { status: \"internal_error\"; error: string; details?: string };\n\nexport interface CancelAllSuccess {\n cancelled_order_hashes: string[];\n count: number;\n user_pubkey: PubkeyStr;\n orderbook_id: OrderBookId;\n message: string;\n}\n\nexport type CancelAllResponse =\n | ({ status: \"success\" } & CancelAllSuccess)\n | { status: \"error\"; message: string }\n | { status: \"bad_request\"; error: string }\n | { status: \"not_found\"; error: string }\n | { status: \"forbidden\"; error: string }\n | { status: \"internal_error\"; error: string; details?: string };\n\nexport interface TriggerOrderResponse {\n trigger_order_id: string;\n order_hash: string;\n}\n\nexport type TriggerSubmitResponse =\n | ({ status: \"accepted\" } & TriggerOrderResponse)\n | { status: \"error\"; error: string }\n | { status: \"bad_request\"; error: string }\n | { status: \"not_found\"; error: string }\n | { status: \"forbidden\"; error: string }\n | { status: \"internal_error\"; error: string; details?: string };\n\nexport interface CancelTriggerSuccess {\n trigger_order_id: string;\n}\n\nexport type CancelTriggerResponse =\n | ({ status: \"cancelled\" } & CancelTriggerSuccess)\n | { status: \"error\"; error: string }\n | { status: \"bad_request\"; error: string }\n | { status: \"not_found\"; error: string }\n | { status: \"forbidden\"; error: string }\n | { status: \"internal_error\"; error: string; details?: string };\n\nexport interface UserOrdersResponse {\n user_pubkey: PubkeyStr;\n orders: UserSnapshotOrder[];\n balances: UserSnapshotBalance[];\n next_cursor?: string;\n has_more: boolean;\n}\n\ninterface ClientContext {\n http: LightconeHttp;\n}\n\nexport class Orders {\n constructor(private readonly client: ClientContext) {}\n\n async submit(request: object): Promise<SubmitOrderResponse> {\n const url = `${this.client.http.baseUrl()}/api/orders/submit`;\n const raw = await this.client.http.post<PlaceResponse, object>(url, request, RetryPolicy.None);\n\n switch (raw.status) {\n case \"accepted\":\n case \"partial_fill\":\n case \"filled\":\n return raw;\n case \"rejected\": {\n const message = [raw.error, raw.details].filter(Boolean).join(\": \") || \"Rejected\";\n throw SdkError.from(new Error(message));\n }\n case \"bad_request\":\n case \"internal_error\":\n throw SdkError.from(new Error([raw.error, raw.details].filter(Boolean).join(\": \")));\n case \"error\":\n case \"not_found\":\n case \"forbidden\":\n case \"configuration_error\":\n throw SdkError.from(new Error(raw.error || \"Unknown error\"));\n default:\n throw SdkError.from(new Error(\"Unknown submit response\"));\n }\n }\n\n async cancel(body: CancelBody): Promise<CancelSuccess> {\n const url = `${this.client.http.baseUrl()}/api/orders/cancel`;\n const response = await this.client.http.post<CancelResponse, CancelBody>(url, body, RetryPolicy.None);\n\n if (response.status === \"cancelled\") {\n return { order_hash: response.order_hash, remaining: response.remaining };\n }\n\n if (response.status === \"internal_error\") {\n throw SdkError.from(new Error([response.error, response.details].filter(Boolean).join(\": \")));\n }\n\n throw SdkError.from(new Error(response.error));\n }\n\n async cancelAll(body: CancelAllBody): Promise<CancelAllSuccess> {\n const url = `${this.client.http.baseUrl()}/api/orders/cancel-all`;\n const response = await this.client.http.post<CancelAllResponse, CancelAllBody>(\n url,\n body,\n RetryPolicy.None\n );\n\n if (response.status === \"success\") {\n return response;\n }\n\n if (response.status === \"error\") {\n throw SdkError.from(new Error(response.message));\n }\n\n if (response.status === \"internal_error\") {\n throw SdkError.from(new Error([response.error, response.details].filter(Boolean).join(\": \")));\n }\n\n throw SdkError.from(new Error(response.error));\n }\n\n async submitTrigger(request: object): Promise<TriggerOrderResponse> {\n const url = `${this.client.http.baseUrl()}/api/orders/submit`;\n const response = await this.client.http.post<TriggerSubmitResponse, object>(\n url,\n request,\n RetryPolicy.None\n );\n\n if (response.status === \"accepted\") {\n return response;\n }\n\n if (response.status === \"internal_error\") {\n throw SdkError.from(new Error([response.error, response.details].filter(Boolean).join(\": \")));\n }\n\n throw SdkError.from(new Error(response.error));\n }\n\n async cancelTrigger(body: CancelTriggerBody): Promise<CancelTriggerSuccess> {\n const url = `${this.client.http.baseUrl()}/api/orders/cancel`;\n const response = await this.client.http.post<CancelTriggerResponse, CancelTriggerBody>(\n url,\n body,\n RetryPolicy.None\n );\n\n if (response.status === \"cancelled\") {\n return response;\n }\n\n if (response.status === \"internal_error\") {\n throw SdkError.from(new Error([response.error, response.details].filter(Boolean).join(\": \")));\n }\n\n throw SdkError.from(new Error(response.error));\n }\n\n async getUserOrders(\n walletAddress: string,\n limit?: number,\n cursor?: string\n ): Promise<UserOrdersResponse> {\n const params = new URLSearchParams({ wallet_address: walletAddress });\n if (limit !== undefined) params.set(\"limit\", String(limit));\n if (cursor) params.set(\"cursor\", cursor);\n\n const url = `${this.client.http.baseUrl()}/api/users/orders?${params.toString()}`;\n const response = await this.client.http.get<{\n user_pubkey: PubkeyStr;\n orders?: UserSnapshotOrder[];\n balances?: UserSnapshotBalance[];\n next_cursor?: string | null;\n has_more?: boolean;\n }>(url, RetryPolicy.Idempotent);\n\n return {\n user_pubkey: response.user_pubkey,\n orders: response.orders ?? [],\n balances: response.balances ?? [],\n next_cursor: response.next_cursor ?? undefined,\n has_more: response.has_more ?? false,\n };\n }\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/domain/order/client.ts"],"names":[],"mappings":"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","sourcesContent":["import bs58 from \"bs58\";\nimport { Keypair, Transaction, type PublicKey, type TransactionInstruction } from \"@solana/web3.js\";\nimport type { ClientContext } from \"../../context\";\nimport { requireConnection } from \"../../context\";\nimport { SdkError } from \"../../error\";\nimport { RetryPolicy } from \"../../http\";\nimport {\n buildCancelOrderIx,\n buildIncrementNonceIx,\n} from \"../../program/instructions\";\nimport {\n hashOrder as programHashOrder,\n signOrder as programSignOrder,\n signOrderFull,\n createBidOrder as programCreateBidOrder,\n createAskOrder as programCreateAskOrder,\n createSignedBidOrder as programCreateSignedBidOrder,\n createSignedAskOrder as programCreateSignedAskOrder,\n signCancelOrder,\n signCancelTriggerOrder,\n signCancelAll,\n generateCancelAllSalt as programGenerateCancelAllSalt,\n} from \"../../program/orders\";\nimport {\n getOrderStatusPda,\n getUserNoncePda,\n} from \"../../program/pda\";\nimport {\n deserializeOrderStatus,\n deserializeUserNonce,\n} from \"../../program/accounts\";\nimport type {\n SignedOrder,\n BidOrderParams,\n AskOrderParams,\n OrderStatus as ProgramOrderStatus,\n} from \"../../program/types\";\nimport type { OrderBookId, PubkeyStr } from \"../../shared\";\nimport type { UserSnapshotBalance, UserSnapshotOrder } from \"./wire\";\n\n// ─── Request types ───────────────────────────────────────────────────────────\n\nexport interface CancelBody {\n order_hash: string;\n maker: PubkeyStr;\n signature: string;\n}\n\nexport function cancelBodyFromBase58(\n orderHash: string,\n maker: PubkeyStr,\n signatureBase58: string\n): CancelBody {\n return {\n order_hash: orderHash,\n maker,\n signature: Buffer.from(bs58.decode(signatureBase58)).toString(\"hex\"),\n };\n}\n\nexport function cancelBodySigned(\n orderHash: string,\n maker: PubkeyStr,\n keypair: Keypair\n): CancelBody {\n const signature = signCancelOrder(orderHash, keypair);\n return { order_hash: orderHash, maker, signature };\n}\n\nexport interface CancelAllBody {\n user_pubkey: PubkeyStr;\n orderbook_id: OrderBookId;\n signature: string;\n timestamp: number;\n salt: string;\n}\n\nexport function cancelAllBodyFromBase58(\n userPubkey: PubkeyStr,\n orderbookId: OrderBookId,\n timestamp: number,\n salt: string,\n signatureBase58: string\n): CancelAllBody {\n return {\n user_pubkey: userPubkey,\n orderbook_id: orderbookId,\n signature: Buffer.from(bs58.decode(signatureBase58)).toString(\"hex\"),\n timestamp,\n salt,\n };\n}\n\nexport function cancelAllBodySigned(\n userPubkey: PubkeyStr,\n orderbookId: OrderBookId,\n timestamp: number,\n salt: string,\n keypair: Keypair\n): CancelAllBody {\n const signature = signCancelAll(userPubkey, orderbookId, timestamp, salt, keypair);\n return { user_pubkey: userPubkey, orderbook_id: orderbookId, signature, timestamp, salt };\n}\n\nexport interface CancelTriggerBody {\n trigger_order_id: string;\n maker: PubkeyStr;\n signature: string;\n}\n\nexport function cancelTriggerBodyFromBase58(\n triggerOrderId: string,\n maker: PubkeyStr,\n signatureBase58: string\n): CancelTriggerBody {\n return {\n trigger_order_id: triggerOrderId,\n maker,\n signature: Buffer.from(bs58.decode(signatureBase58)).toString(\"hex\"),\n };\n}\n\nexport function cancelTriggerBodySigned(\n triggerOrderId: string,\n maker: PubkeyStr,\n keypair: Keypair\n): CancelTriggerBody {\n const signature = signCancelTriggerOrder(triggerOrderId, keypair);\n return { trigger_order_id: triggerOrderId, maker, signature };\n}\n\n// ─── Response types ──────────────────────────────────────────────────────────\n\nexport interface FillInfo {\n counterparty: PubkeyStr;\n counterparty_order_hash: string;\n fill_amount: string;\n price: string;\n is_maker: boolean;\n}\n\nexport interface SubmitOrderResponse {\n order_hash: string;\n remaining: string;\n filled: string;\n fills: FillInfo[];\n}\n\nexport type PlaceResponse =\n | ({ status: \"accepted\" } & SubmitOrderResponse)\n | ({ status: \"partial_fill\" } & SubmitOrderResponse)\n | ({ status: \"filled\" } & SubmitOrderResponse)\n | {\n status: \"rejected\";\n error?: string;\n details?: string;\n order_hash?: string;\n remaining?: string;\n filled?: string;\n }\n | { status: \"error\"; error?: string }\n | { status: \"bad_request\"; error?: string; details?: string }\n | { status: \"not_found\"; error?: string }\n | { status: \"forbidden\"; error?: string }\n | { status: \"internal_error\"; error?: string; details?: string }\n | { status: \"configuration_error\"; error?: string };\n\nexport interface CancelSuccess {\n order_hash: string;\n remaining: number;\n}\n\nexport type CancelResponse =\n | { status: \"cancelled\"; order_hash: string; remaining: number }\n | { status: \"error\"; error: string }\n | { status: \"bad_request\"; error: string }\n | { status: \"not_found\"; error: string }\n | { status: \"forbidden\"; error: string }\n | { status: \"internal_error\"; error: string; details?: string };\n\nexport interface CancelAllSuccess {\n cancelled_order_hashes: string[];\n count: number;\n user_pubkey: PubkeyStr;\n orderbook_id: OrderBookId;\n message: string;\n}\n\nexport type CancelAllResponse =\n | ({ status: \"success\" } & CancelAllSuccess)\n | { status: \"error\"; message: string }\n | { status: \"bad_request\"; error: string }\n | { status: \"not_found\"; error: string }\n | { status: \"forbidden\"; error: string }\n | { status: \"internal_error\"; error: string; details?: string };\n\nexport interface TriggerOrderResponse {\n trigger_order_id: string;\n order_hash: string;\n}\n\nexport type TriggerSubmitResponse =\n | ({ status: \"accepted\" } & TriggerOrderResponse)\n | { status: \"error\"; error: string }\n | { status: \"bad_request\"; error: string }\n | { status: \"not_found\"; error: string }\n | { status: \"forbidden\"; error: string }\n | { status: \"internal_error\"; error: string; details?: string };\n\nexport interface CancelTriggerSuccess {\n trigger_order_id: string;\n}\n\nexport type CancelTriggerResponse =\n | ({ status: \"cancelled\" } & CancelTriggerSuccess)\n | { status: \"error\"; error: string }\n | { status: \"bad_request\"; error: string }\n | { status: \"not_found\"; error: string }\n | { status: \"forbidden\"; error: string }\n | { status: \"internal_error\"; error: string; details?: string };\n\nexport interface UserOrdersResponse {\n user_pubkey: PubkeyStr;\n orders: UserSnapshotOrder[];\n balances: UserSnapshotBalance[];\n next_cursor?: string;\n has_more: boolean;\n}\n\n// ─── Sub-client ──────────────────────────────────────────────────────────────\n\nexport class Orders {\n constructor(private readonly client: ClientContext) {}\n\n // ── PDA helpers ──────────────────────────────────────────────────────\n\n statusPda(orderHash: Buffer): PublicKey {\n return getOrderStatusPda(orderHash, this.client.programId)[0];\n }\n\n noncePda(user: PublicKey): PublicKey {\n return getUserNoncePda(user, this.client.programId)[0];\n }\n\n // ── Helpers ──────────────────────────────────────────────────────────\n\n generateCancelAllSalt(): string {\n return programGenerateCancelAllSalt();\n }\n\n // ── HTTP methods ─────────────────────────────────────────────────────\n\n async submit(request: object): Promise<SubmitOrderResponse> {\n const url = `${this.client.http.baseUrl()}/api/orders/submit`;\n const raw = await this.client.http.post<PlaceResponse, object>(url, request, RetryPolicy.None);\n\n switch (raw.status) {\n case \"accepted\":\n case \"partial_fill\":\n case \"filled\":\n return raw;\n case \"rejected\": {\n const message = [raw.error, raw.details].filter(Boolean).join(\": \") || \"Rejected\";\n throw SdkError.from(new Error(message));\n }\n case \"bad_request\":\n case \"internal_error\":\n throw SdkError.from(new Error([raw.error, raw.details].filter(Boolean).join(\": \")));\n case \"error\":\n case \"not_found\":\n case \"forbidden\":\n case \"configuration_error\":\n throw SdkError.from(new Error(raw.error || \"Unknown error\"));\n default:\n throw SdkError.from(new Error(\"Unknown submit response\"));\n }\n }\n\n async cancel(body: CancelBody): Promise<CancelSuccess> {\n const url = `${this.client.http.baseUrl()}/api/orders/cancel`;\n const response = await this.client.http.post<CancelResponse, CancelBody>(url, body, RetryPolicy.None);\n\n if (response.status === \"cancelled\") {\n return { order_hash: response.order_hash, remaining: response.remaining };\n }\n\n if (response.status === \"internal_error\") {\n throw SdkError.from(new Error([response.error, response.details].filter(Boolean).join(\": \")));\n }\n\n throw SdkError.from(new Error(response.error));\n }\n\n async cancelAll(body: CancelAllBody): Promise<CancelAllSuccess> {\n const url = `${this.client.http.baseUrl()}/api/orders/cancel-all`;\n const response = await this.client.http.post<CancelAllResponse, CancelAllBody>(\n url,\n body,\n RetryPolicy.None\n );\n\n if (response.status === \"success\") {\n return response;\n }\n\n if (response.status === \"error\") {\n throw SdkError.from(new Error(response.message));\n }\n\n if (response.status === \"internal_error\") {\n throw SdkError.from(new Error([response.error, response.details].filter(Boolean).join(\": \")));\n }\n\n throw SdkError.from(new Error(response.error));\n }\n\n async submitTrigger(request: object): Promise<TriggerOrderResponse> {\n const url = `${this.client.http.baseUrl()}/api/orders/submit`;\n const response = await this.client.http.post<TriggerSubmitResponse, object>(\n url,\n request,\n RetryPolicy.None\n );\n\n if (response.status === \"accepted\") {\n return response;\n }\n\n if (response.status === \"internal_error\") {\n throw SdkError.from(new Error([response.error, response.details].filter(Boolean).join(\": \")));\n }\n\n throw SdkError.from(new Error(response.error));\n }\n\n async cancelTrigger(body: CancelTriggerBody): Promise<CancelTriggerSuccess> {\n const url = `${this.client.http.baseUrl()}/api/orders/cancel`;\n const response = await this.client.http.post<CancelTriggerResponse, CancelTriggerBody>(\n url,\n body,\n RetryPolicy.None\n );\n\n if (response.status === \"cancelled\") {\n return response;\n }\n\n if (response.status === \"internal_error\") {\n throw SdkError.from(new Error([response.error, response.details].filter(Boolean).join(\": \")));\n }\n\n throw SdkError.from(new Error(response.error));\n }\n\n async getUserOrders(\n walletAddress: string,\n limit?: number,\n cursor?: string\n ): Promise<UserOrdersResponse> {\n const params = new URLSearchParams({ wallet_address: walletAddress });\n if (limit !== undefined) params.set(\"limit\", String(limit));\n if (cursor) params.set(\"cursor\", cursor);\n\n const url = `${this.client.http.baseUrl()}/api/users/orders?${params.toString()}`;\n const response = await this.client.http.get<{\n user_pubkey: PubkeyStr;\n orders?: UserSnapshotOrder[];\n balances?: UserSnapshotBalance[];\n next_cursor?: string | null;\n has_more?: boolean;\n }>(url, RetryPolicy.Idempotent);\n\n return {\n user_pubkey: response.user_pubkey,\n orders: response.orders ?? [],\n balances: response.balances ?? [],\n next_cursor: response.next_cursor ?? undefined,\n has_more: response.has_more ?? false,\n };\n }\n\n // ── On-chain transaction builders ────────────────────────────────────\n\n cancelOrderIx(\n maker: PublicKey,\n market: PublicKey,\n order: SignedOrder\n ): TransactionInstruction {\n return buildCancelOrderIx(maker, market, order, this.client.programId);\n }\n\n incrementNonceIx(user: PublicKey): TransactionInstruction {\n return buildIncrementNonceIx(user, this.client.programId);\n }\n\n // ── Transaction builders (_tx convenience wrappers) ─────────────────\n\n cancelOrderTx(\n maker: PublicKey,\n market: PublicKey,\n order: SignedOrder\n ): Transaction {\n const ix = this.cancelOrderIx(maker, market, order);\n return new Transaction({ feePayer: maker }).add(ix);\n }\n\n incrementNonceTx(user: PublicKey): Transaction {\n const ix = this.incrementNonceIx(user);\n return new Transaction({ feePayer: user }).add(ix);\n }\n\n // ── Order helpers ────────────────────────────────────────────────────\n\n createBidOrder(params: BidOrderParams): Omit<SignedOrder, \"signature\"> {\n return programCreateBidOrder(params);\n }\n\n createAskOrder(params: AskOrderParams): Omit<SignedOrder, \"signature\"> {\n return programCreateAskOrder(params);\n }\n\n createSignedBidOrder(params: BidOrderParams, signer: Keypair): SignedOrder {\n return programCreateSignedBidOrder(params, signer);\n }\n\n createSignedAskOrder(params: AskOrderParams, signer: Keypair): SignedOrder {\n return programCreateSignedAskOrder(params, signer);\n }\n\n hashOrder(order: SignedOrder): Buffer {\n return programHashOrder(order);\n }\n\n signOrder(order: SignedOrder, signer: Keypair): Buffer {\n return programSignOrder(order, signer);\n }\n\n signFullOrder(\n order: Omit<SignedOrder, \"signature\">,\n signer: Keypair\n ): SignedOrder {\n return signOrderFull(order, signer);\n }\n\n // ── On-chain account fetchers (require Connection) ──────────────────\n\n async getStatus(orderHash: Buffer): Promise<ProgramOrderStatus | null> {\n const connection = requireConnection(this.client);\n const pda = this.statusPda(orderHash);\n const accountInfo = await connection.getAccountInfo(pda);\n if (!accountInfo) {\n return null;\n }\n return deserializeOrderStatus(accountInfo.data as Buffer);\n }\n\n async getNonce(user: PublicKey): Promise<bigint> {\n const connection = requireConnection(this.client);\n const pda = this.noncePda(user);\n const accountInfo = await connection.getAccountInfo(pda);\n if (!accountInfo) {\n return 0n;\n }\n const userNonce = deserializeUserNonce(accountInfo.data as Buffer);\n return userNonce.nonce;\n }\n\n async currentNonce(user: PublicKey): Promise<number> {\n const nonce = await this.getNonce(user);\n if (nonce > 0xFFFFFFFFn) {\n throw new Error(`Nonce exceeds u32 range: ${nonce}`);\n }\n return Number(nonce);\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
- import type { OrderBookId, PubkeyStr, Side, TimeInForce, TriggerType } from "../../shared";
1
+ import Decimal from "decimal.js";
2
+ import { Side, type OrderBookId, type PubkeyStr, type TimeInForce, type TriggerType } from "../../shared";
2
3
  export * from "./client";
3
4
  export * from "./wire";
4
5
  export * from "./state";
@@ -7,7 +8,11 @@ export declare enum OrderType {
7
8
  Limit = "Limit",
8
9
  Market = "Market",
9
10
  Deposit = "Deposit",
10
- Withdraw = "Withdraw"
11
+ Withdraw = "Withdraw",
12
+ StopMarket = "StopMarket",
13
+ StopLimit = "StopLimit",
14
+ TakeProfitMarket = "TakeProfitMarket",
15
+ TakeProfitLimit = "TakeProfitLimit"
11
16
  }
12
17
  export declare enum OrderStatus {
13
18
  Open = "OPEN",
@@ -45,4 +50,5 @@ export interface TriggerOrder {
45
50
  timeInForce: TimeInForce;
46
51
  createdAt: Date;
47
52
  }
53
+ export declare function triggerOrderLimitPrice(order: TriggerOrder, baseDecimals: number, quoteDecimals: number): Decimal | undefined;
48
54
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/order/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3F,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE/G,oBAAY,SAAS;IACnB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,QAAQ,aAAa;CACtB;AAED,oBAAY,WAAW;IACrB,IAAI,SAAS;IACb,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,IAAI,CAAC;CACjB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/order/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE1G,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE/G,oBAAY,SAAS;IACnB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,gBAAgB,qBAAqB;IACrC,eAAe,oBAAoB;CACpC;AAED,oBAAY,WAAW;IACrB,IAAI,SAAS;IACb,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EACnB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,GAAG,SAAS,CAarB"}
@@ -13,8 +13,14 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
13
13
  var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
16
19
  Object.defineProperty(exports, "__esModule", { value: true });
17
20
  exports.OrderStatus = exports.OrderType = exports.orderFromUpdate = exports.triggerSnapshotToOrder = exports.splitSnapshotOrders = exports.limitSnapshotToOrder = void 0;
21
+ exports.triggerOrderLimitPrice = triggerOrderLimitPrice;
22
+ const decimal_js_1 = __importDefault(require("decimal.js"));
23
+ const shared_1 = require("../../shared");
18
24
  __exportStar(require("./client"), exports);
19
25
  __exportStar(require("./wire"), exports);
20
26
  __exportStar(require("./state"), exports);
@@ -29,6 +35,10 @@ var OrderType;
29
35
  OrderType["Market"] = "Market";
30
36
  OrderType["Deposit"] = "Deposit";
31
37
  OrderType["Withdraw"] = "Withdraw";
38
+ OrderType["StopMarket"] = "StopMarket";
39
+ OrderType["StopLimit"] = "StopLimit";
40
+ OrderType["TakeProfitMarket"] = "TakeProfitMarket";
41
+ OrderType["TakeProfitLimit"] = "TakeProfitLimit";
32
42
  })(OrderType || (exports.OrderType = OrderType = {}));
33
43
  var OrderStatus;
34
44
  (function (OrderStatus) {
@@ -38,4 +48,17 @@ var OrderStatus;
38
48
  OrderStatus["Filled"] = "FILLED";
39
49
  OrderStatus["Pending"] = "PENDING";
40
50
  })(OrderStatus || (exports.OrderStatus = OrderStatus = {}));
51
+ function triggerOrderLimitPrice(order, baseDecimals, quoteDecimals) {
52
+ const baseMult = new decimal_js_1.default(10).pow(baseDecimals);
53
+ const quoteMult = new decimal_js_1.default(10).pow(quoteDecimals);
54
+ const amountIn = new decimal_js_1.default(order.amountIn);
55
+ const amountOut = new decimal_js_1.default(order.amountOut);
56
+ if (order.side === shared_1.Side.Ask && amountIn.greaterThan(0)) {
57
+ return amountOut.mul(baseMult).div(amountIn.mul(quoteMult));
58
+ }
59
+ if (order.side === shared_1.Side.Bid && amountOut.greaterThan(0)) {
60
+ return amountIn.mul(baseMult).div(amountOut.mul(quoteMult));
61
+ }
62
+ return undefined;
63
+ }
41
64
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/order/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,2CAAyB;AACzB,yCAAuB;AACvB,0CAAwB;AACxB,qCAA+G;AAAtG,+GAAA,oBAAoB,OAAA;AAAE,8GAAA,mBAAmB,OAAA;AAAE,iHAAA,sBAAsB,OAAA;AAAE,0GAAA,eAAe,OAAA;AAE3F,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,4BAAe,CAAA;IACf,8BAAiB,CAAA;IACjB,gCAAmB,CAAA;IACnB,kCAAqB,CAAA;AACvB,CAAC,EALW,SAAS,yBAAT,SAAS,QAKpB;AAED,IAAY,WAMX;AAND,WAAY,WAAW;IACrB,4BAAa,CAAA;IACb,oCAAqB,CAAA;IACrB,sCAAuB,CAAA;IACvB,gCAAiB,CAAA;IACjB,kCAAmB,CAAA;AACrB,CAAC,EANW,WAAW,2BAAX,WAAW,QAMtB","sourcesContent":["import type { OrderBookId, PubkeyStr, Side, TimeInForce, TriggerType } from \"../../shared\";\n\nexport * from \"./client\";\nexport * from \"./wire\";\nexport * from \"./state\";\nexport { limitSnapshotToOrder, splitSnapshotOrders, triggerSnapshotToOrder, orderFromUpdate } from \"./convert\";\n\nexport enum OrderType {\n Limit = \"Limit\",\n Market = \"Market\",\n Deposit = \"Deposit\",\n Withdraw = \"Withdraw\",\n}\n\nexport enum OrderStatus {\n Open = \"OPEN\",\n Matching = \"MATCHING\",\n Cancelled = \"CANCELLED\",\n Filled = \"FILLED\",\n Pending = \"PENDING\",\n}\n\nexport interface Order {\n marketPubkey: PubkeyStr;\n orderbookId: OrderBookId;\n txSignature?: string;\n baseMint: PubkeyStr;\n quoteMint: PubkeyStr;\n orderHash: string;\n side: Side;\n size: string;\n price: string;\n filledSize: string;\n remainingSize: string;\n createdAt: Date;\n status: OrderStatus;\n outcomeIndex: number;\n}\n\nexport interface TriggerOrder {\n triggerOrderId: string;\n orderHash: string;\n marketPubkey: PubkeyStr;\n orderbookId: OrderBookId;\n triggerPrice: string;\n triggerType: TriggerType;\n side: Side;\n amountIn: string;\n amountOut: string;\n timeInForce: TimeInForce;\n createdAt: Date;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/order/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AA0DA,wDAiBC;AA3ED,4DAAiC;AACjC,yCAA0G;AAE1G,2CAAyB;AACzB,yCAAuB;AACvB,0CAAwB;AACxB,qCAA+G;AAAtG,+GAAA,oBAAoB,OAAA;AAAE,8GAAA,mBAAmB,OAAA;AAAE,iHAAA,sBAAsB,OAAA;AAAE,0GAAA,eAAe,OAAA;AAE3F,IAAY,SASX;AATD,WAAY,SAAS;IACnB,4BAAe,CAAA;IACf,8BAAiB,CAAA;IACjB,gCAAmB,CAAA;IACnB,kCAAqB,CAAA;IACrB,sCAAyB,CAAA;IACzB,oCAAuB,CAAA;IACvB,kDAAqC,CAAA;IACrC,gDAAmC,CAAA;AACrC,CAAC,EATW,SAAS,yBAAT,SAAS,QASpB;AAED,IAAY,WAMX;AAND,WAAY,WAAW;IACrB,4BAAa,CAAA;IACb,oCAAqB,CAAA;IACrB,sCAAuB,CAAA;IACvB,gCAAiB,CAAA;IACjB,kCAAmB,CAAA;AACrB,CAAC,EANW,WAAW,2BAAX,WAAW,QAMtB;AAiCD,SAAgB,sBAAsB,CACpC,KAAmB,EACnB,YAAoB,EACpB,aAAqB;IAErB,MAAM,QAAQ,GAAG,IAAI,oBAAO,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,oBAAO,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,oBAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,oBAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE/C,IAAI,KAAK,CAAC,IAAI,KAAK,aAAI,CAAC,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAI,CAAC,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import Decimal from \"decimal.js\";\nimport { Side, type OrderBookId, type PubkeyStr, type TimeInForce, type TriggerType } from \"../../shared\";\n\nexport * from \"./client\";\nexport * from \"./wire\";\nexport * from \"./state\";\nexport { limitSnapshotToOrder, splitSnapshotOrders, triggerSnapshotToOrder, orderFromUpdate } from \"./convert\";\n\nexport enum OrderType {\n Limit = \"Limit\",\n Market = \"Market\",\n Deposit = \"Deposit\",\n Withdraw = \"Withdraw\",\n StopMarket = \"StopMarket\",\n StopLimit = \"StopLimit\",\n TakeProfitMarket = \"TakeProfitMarket\",\n TakeProfitLimit = \"TakeProfitLimit\",\n}\n\nexport enum OrderStatus {\n Open = \"OPEN\",\n Matching = \"MATCHING\",\n Cancelled = \"CANCELLED\",\n Filled = \"FILLED\",\n Pending = \"PENDING\",\n}\n\nexport interface Order {\n marketPubkey: PubkeyStr;\n orderbookId: OrderBookId;\n txSignature?: string;\n baseMint: PubkeyStr;\n quoteMint: PubkeyStr;\n orderHash: string;\n side: Side;\n size: string;\n price: string;\n filledSize: string;\n remainingSize: string;\n createdAt: Date;\n status: OrderStatus;\n outcomeIndex: number;\n}\n\nexport interface TriggerOrder {\n triggerOrderId: string;\n orderHash: string;\n marketPubkey: PubkeyStr;\n orderbookId: OrderBookId;\n triggerPrice: string;\n triggerType: TriggerType;\n side: Side;\n amountIn: string;\n amountOut: string;\n timeInForce: TimeInForce;\n createdAt: Date;\n}\n\nexport function triggerOrderLimitPrice(\n order: TriggerOrder,\n baseDecimals: number,\n quoteDecimals: number\n): Decimal | undefined {\n const baseMult = new Decimal(10).pow(baseDecimals);\n const quoteMult = new Decimal(10).pow(quoteDecimals);\n const amountIn = new Decimal(order.amountIn);\n const amountOut = new Decimal(order.amountOut);\n\n if (order.side === Side.Ask && amountIn.greaterThan(0)) {\n return amountOut.mul(baseMult).div(amountIn.mul(quoteMult));\n }\n if (order.side === Side.Bid && amountOut.greaterThan(0)) {\n return amountIn.mul(baseMult).div(amountOut.mul(quoteMult));\n }\n return undefined;\n}\n"]}
@@ -1,20 +1,12 @@
1
- import { type LightconeHttp } from "../../http";
2
- import type { DecimalsResponse, OrderbookDepthResponse } from "./wire";
3
- interface CacheContext {
4
- get(orderbookId: string): DecimalsResponse | undefined;
5
- set(orderbookId: string, response: DecimalsResponse): void;
6
- clear(): void;
7
- }
8
- interface ClientContext {
9
- http: LightconeHttp;
10
- decimalsCache: CacheContext;
11
- }
1
+ import type { PublicKey } from "@solana/web3.js";
2
+ import type { ClientContext } from "../../context";
3
+ import type { Orderbook as ProgramOrderbook } from "../../program/types";
4
+ import type { OrderbookDepthResponse } from "./wire";
12
5
  export declare class Orderbooks {
13
6
  private readonly client;
14
7
  constructor(client: ClientContext);
8
+ pda(mintA: PublicKey, mintB: PublicKey): PublicKey;
15
9
  get(orderbookId: string, depth?: number): Promise<OrderbookDepthResponse>;
16
- decimals(orderbookId: string): Promise<DecimalsResponse>;
17
- clearCache(): Promise<void>;
10
+ getOnchain(mintA: PublicKey, mintB: PublicKey): Promise<ProgramOrderbook>;
18
11
  }
19
- export {};
20
12
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/domain/orderbook/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC;AAEvE,UAAU,YAAY;IACpB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACvD,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC3D,KAAK,IAAI,IAAI,CAAC;CACf;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,EAAE,YAAY,CAAC;CAC7B;AAED,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAE5C,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAMzE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAYxD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/domain/orderbook/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAKnD,OAAO,KAAK,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC;AAErD,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAIlD,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS;IAM5C,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAQzE,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAWhF"}
@@ -1,29 +1,34 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Orderbooks = void 0;
4
+ const context_1 = require("../../context");
4
5
  const http_1 = require("../../http");
6
+ const pda_1 = require("../../program/pda");
7
+ const accounts_1 = require("../../program/accounts");
5
8
  class Orderbooks {
6
9
  client;
7
10
  constructor(client) {
8
11
  this.client = client;
9
12
  }
13
+ // ── PDA helpers ──────────────────────────────────────────────────────
14
+ pda(mintA, mintB) {
15
+ return (0, pda_1.getOrderbookPda)(mintA, mintB, this.client.programId)[0];
16
+ }
17
+ // ── HTTP methods ─────────────────────────────────────────────────────
10
18
  async get(orderbookId, depth) {
11
19
  const query = depth !== undefined ? `?depth=${depth}` : "";
12
20
  const url = `${this.client.http.baseUrl()}/api/orderbook/${encodeURIComponent(orderbookId)}${query}`;
13
21
  return this.client.http.get(url, http_1.RetryPolicy.Idempotent);
14
22
  }
15
- async decimals(orderbookId) {
16
- const cached = this.client.decimalsCache.get(orderbookId);
17
- if (cached) {
18
- return cached;
23
+ // ── On-chain account fetchers (require Connection) ──────────────────
24
+ async getOnchain(mintA, mintB) {
25
+ const connection = (0, context_1.requireConnection)(this.client);
26
+ const orderbookPda = this.pda(mintA, mintB);
27
+ const accountInfo = await connection.getAccountInfo(orderbookPda);
28
+ if (!accountInfo) {
29
+ throw new Error(`Orderbook not found for ${mintA.toBase58()} / ${mintB.toBase58()}`);
19
30
  }
20
- const url = `${this.client.http.baseUrl()}/api/orderbooks/${encodeURIComponent(orderbookId)}/decimals`;
21
- const response = await this.client.http.get(url, http_1.RetryPolicy.Idempotent);
22
- this.client.decimalsCache.set(orderbookId, response);
23
- return response;
24
- }
25
- async clearCache() {
26
- this.client.decimalsCache.clear();
31
+ return (0, accounts_1.deserializeOrderbook)(accountInfo.data);
27
32
  }
28
33
  }
29
34
  exports.Orderbooks = Orderbooks;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/domain/orderbook/client.ts"],"names":[],"mappings":";;;AAAA,qCAA6D;AAc7D,MAAa,UAAU;IACQ;IAA7B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAEtD,KAAK,CAAC,GAAG,CAAC,WAAmB,EAAE,KAAc;QAC3C,MAAM,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,kBAAkB,CAAC,WAAW,CAAC,GAAG,KAAK,EAAE,CAAC;QACrG,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAyB,GAAG,EAAE,kBAAW,CAAC,UAAU,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,WAAmB;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC;QACvG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAmB,GAAG,EAAE,kBAAW,CAAC,UAAU,CAAC,CAAC;QAC3F,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACrD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;CACF;AAxBD,gCAwBC","sourcesContent":["import { RetryPolicy, type LightconeHttp } from \"../../http\";\nimport type { DecimalsResponse, OrderbookDepthResponse } from \"./wire\";\n\ninterface CacheContext {\n get(orderbookId: string): DecimalsResponse | undefined;\n set(orderbookId: string, response: DecimalsResponse): void;\n clear(): void;\n}\n\ninterface ClientContext {\n http: LightconeHttp;\n decimalsCache: CacheContext;\n}\n\nexport class Orderbooks {\n constructor(private readonly client: ClientContext) {}\n\n async get(orderbookId: string, depth?: number): Promise<OrderbookDepthResponse> {\n const query = depth !== undefined ? `?depth=${depth}` : \"\";\n const url = `${this.client.http.baseUrl()}/api/orderbook/${encodeURIComponent(orderbookId)}${query}`;\n return this.client.http.get<OrderbookDepthResponse>(url, RetryPolicy.Idempotent);\n }\n\n async decimals(orderbookId: string): Promise<DecimalsResponse> {\n const cached = this.client.decimalsCache.get(orderbookId);\n if (cached) {\n return cached;\n }\n\n const url = `${this.client.http.baseUrl()}/api/orderbooks/${encodeURIComponent(orderbookId)}/decimals`;\n const response = await this.client.http.get<DecimalsResponse>(url, RetryPolicy.Idempotent);\n this.client.decimalsCache.set(orderbookId, response);\n return response;\n }\n\n async clearCache(): Promise<void> {\n this.client.decimalsCache.clear();\n }\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/domain/orderbook/client.ts"],"names":[],"mappings":";;;AAEA,2CAAkD;AAClD,qCAAyC;AACzC,2CAAoD;AACpD,qDAA6F;AAI7F,MAAa,UAAU;IACQ;IAA7B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAEtD,wEAAwE;IAExE,GAAG,CAAC,KAAgB,EAAE,KAAgB;QACpC,OAAO,IAAA,qBAAe,EAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,wEAAwE;IAExE,KAAK,CAAC,GAAG,CAAC,WAAmB,EAAE,KAAc;QAC3C,MAAM,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,kBAAkB,CAAC,WAAW,CAAC,GAAG,KAAK,EAAE,CAAC;QACrG,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAyB,GAAG,EAAE,kBAAW,CAAC,UAAU,CAAC,CAAC;IACnF,CAAC;IAED,uEAAuE;IAEvE,KAAK,CAAC,UAAU,CAAC,KAAgB,EAAE,KAAgB;QACjD,MAAM,UAAU,GAAG,IAAA,2BAAiB,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAClE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,2BAA2B,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,CACpE,CAAC;QACJ,CAAC;QACD,OAAO,IAAA,+BAA2B,EAAC,WAAW,CAAC,IAAc,CAAC,CAAC;IACjE,CAAC;CACF;AA9BD,gCA8BC","sourcesContent":["import type { PublicKey } from \"@solana/web3.js\";\nimport type { ClientContext } from \"../../context\";\nimport { requireConnection } from \"../../context\";\nimport { RetryPolicy } from \"../../http\";\nimport { getOrderbookPda } from \"../../program/pda\";\nimport { deserializeOrderbook as deserializeProgramOrderbook } from \"../../program/accounts\";\nimport type { Orderbook as ProgramOrderbook } from \"../../program/types\";\nimport type { OrderbookDepthResponse } from \"./wire\";\n\nexport class Orderbooks {\n constructor(private readonly client: ClientContext) {}\n\n // ── PDA helpers ──────────────────────────────────────────────────────\n\n pda(mintA: PublicKey, mintB: PublicKey): PublicKey {\n return getOrderbookPda(mintA, mintB, this.client.programId)[0];\n }\n\n // ── HTTP methods ─────────────────────────────────────────────────────\n\n async get(orderbookId: string, depth?: number): Promise<OrderbookDepthResponse> {\n const query = depth !== undefined ? `?depth=${depth}` : \"\";\n const url = `${this.client.http.baseUrl()}/api/orderbook/${encodeURIComponent(orderbookId)}${query}`;\n return this.client.http.get<OrderbookDepthResponse>(url, RetryPolicy.Idempotent);\n }\n\n // ── On-chain account fetchers (require Connection) ──────────────────\n\n async getOnchain(mintA: PublicKey, mintB: PublicKey): Promise<ProgramOrderbook> {\n const connection = requireConnection(this.client);\n const orderbookPda = this.pda(mintA, mintB);\n const accountInfo = await connection.getAccountInfo(orderbookPda);\n if (!accountInfo) {\n throw new Error(\n `Orderbook not found for ${mintA.toBase58()} / ${mintB.toBase58()}`\n );\n }\n return deserializeProgramOrderbook(accountInfo.data as Buffer);\n }\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import Decimal from "decimal.js";
2
2
  import type { OrderBookId, PubkeyStr } from "../../shared";
3
+ import type { OrderbookDecimals } from "../../shared/scaling";
3
4
  import type { ConditionalToken } from "../market";
4
5
  export * from "./client";
5
6
  export * from "./wire";
@@ -28,6 +29,12 @@ export interface OutcomeImpact {
28
29
  }
29
30
  export declare function impactPct(pair: OrderBookPair, depositPrice: Decimal): [number, string];
30
31
  export declare function impact(depositAssetPrice: Decimal, conditionalPrice: Decimal): OutcomeImpact;
32
+ /**
33
+ * Derive scaling decimals from an orderbook pair's token metadata.
34
+ *
35
+ * No REST call needed — decimals are computed from the base/quote token objects.
36
+ */
37
+ export declare function orderbookDecimals(pair: OrderBookPair): OrderbookDecimals;
31
38
  export declare class OrderBookValidationError extends Error {
32
39
  readonly orderbookId: string;
33
40
  readonly details: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/orderbook/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAQtF;AAED,wBAAgB,MAAM,CACpB,iBAAiB,EAAE,OAAO,EAC1B,gBAAgB,EAAE,OAAO,GACxB,aAAa,CAef;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAEf,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;CAMnD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/orderbook/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAQtF;AAED,wBAAgB,MAAM,CACpB,iBAAiB,EAAE,OAAO,EAC1B,gBAAgB,EAAE,OAAO,GACxB,aAAa,CAef;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,iBAAiB,CAUxE;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAEf,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;CAMnD"}
@@ -20,6 +20,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
20
20
  exports.OrderBookValidationError = exports.orderBookPairFromWire = void 0;
21
21
  exports.impactPct = impactPct;
22
22
  exports.impact = impact;
23
+ exports.orderbookDecimals = orderbookDecimals;
23
24
  const decimal_js_1 = __importDefault(require("decimal.js"));
24
25
  __exportStar(require("./client"), exports);
25
26
  __exportStar(require("./wire"), exports);
@@ -49,6 +50,22 @@ function impact(depositAssetPrice, conditionalPrice) {
49
50
  isPositive: pct > 0,
50
51
  };
51
52
  }
53
+ /**
54
+ * Derive scaling decimals from an orderbook pair's token metadata.
55
+ *
56
+ * No REST call needed — decimals are computed from the base/quote token objects.
57
+ */
58
+ function orderbookDecimals(pair) {
59
+ const baseDecimals = pair.base.decimals;
60
+ const quoteDecimals = pair.quote.decimals;
61
+ return {
62
+ orderbookId: pair.orderbookId,
63
+ baseDecimals,
64
+ quoteDecimals,
65
+ priceDecimals: Math.max(0, 6 + quoteDecimals - baseDecimals),
66
+ tickSize: BigInt(Math.max(pair.tickSize, 0)),
67
+ };
68
+ }
52
69
  class OrderBookValidationError extends Error {
53
70
  orderbookId;
54
71
  details;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/orderbook/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAgCA,8BAQC;AAED,wBAkBC;AA5DD,4DAAiC;AAIjC,2CAAyB;AACzB,yCAAuB;AACvB,0CAAwB;AACxB,2CAAyB;AACzB,qCAAkD;AAAzC,gHAAA,qBAAqB,OAAA;AAwB9B,SAAgB,SAAS,CAAC,IAAmB,EAAE,YAAqB;IAClE,IAAI,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAClD,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,oBAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAgB,MAAM,CACpB,iBAA0B,EAC1B,gBAAyB;IAEzB,IAAI,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC9D,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7F,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAE1E,OAAO;QACL,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;QACzB,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAClB,MAAM;QACN,UAAU,EAAE,GAAG,GAAG,CAAC;KACpB,CAAC;AACJ,CAAC;AAED,MAAa,wBAAyB,SAAQ,KAAK;IACxC,WAAW,CAAS;IACpB,OAAO,CAAW;IAE3B,YAAY,WAAmB,EAAE,OAAiB;QAChD,KAAK,CAAC,gCAAgC,WAAW,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAVD,4DAUC","sourcesContent":["import Decimal from \"decimal.js\";\nimport type { OrderBookId, PubkeyStr } from \"../../shared\";\nimport type { ConditionalToken } from \"../market\";\n\nexport * from \"./client\";\nexport * from \"./wire\";\nexport * from \"./state\";\nexport * from \"./ticker\";\nexport { orderBookPairFromWire } from \"./convert\";\n\nexport interface OrderBookPair {\n id: number;\n marketPubkey: PubkeyStr;\n orderbookId: OrderBookId;\n base: ConditionalToken;\n quote: ConditionalToken;\n outcomeIndex: number;\n tickSize: number;\n totalBids: number;\n totalAsks: number;\n lastTradePrice?: string;\n lastTradeTime?: Date;\n active: boolean;\n}\n\nexport interface OutcomeImpact {\n sign: string;\n pct: number;\n dollar: string;\n isPositive: boolean;\n}\n\nexport function impactPct(pair: OrderBookPair, depositPrice: Decimal): [number, string] {\n if (depositPrice.isZero() || !pair.lastTradePrice) {\n return [0, \"\"];\n }\n\n const conditional = new Decimal(pair.lastTradePrice);\n const value = conditional.minus(depositPrice).div(depositPrice).mul(100);\n return [value.toNumber(), value.greaterThan(0) ? \"+\" : \"\"];\n}\n\nexport function impact(\n depositAssetPrice: Decimal,\n conditionalPrice: Decimal\n): OutcomeImpact {\n if (depositAssetPrice.isZero()) {\n return { sign: \"\", pct: 0, dollar: \"0\", isPositive: false };\n }\n\n const pctDecimal = conditionalPrice.minus(depositAssetPrice).div(depositAssetPrice).mul(100);\n const pct = pctDecimal.toNumber();\n const dollar = conditionalPrice.minus(depositAssetPrice).abs().toString();\n\n return {\n sign: pct > 0 ? \"+\" : \"-\",\n pct: Math.abs(pct),\n dollar,\n isPositive: pct > 0,\n };\n}\n\nexport class OrderBookValidationError extends Error {\n readonly orderbookId: string;\n readonly details: string[];\n\n constructor(orderbookId: string, details: string[]) {\n super(`OrderBook validation errors (${orderbookId}): ${details.join(\"; \")}`);\n this.name = \"OrderBookValidationError\";\n this.orderbookId = orderbookId;\n this.details = details;\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/orderbook/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAiCA,8BAQC;AAED,wBAkBC;AAOD,8CAUC;AA9ED,4DAAiC;AAKjC,2CAAyB;AACzB,yCAAuB;AACvB,0CAAwB;AACxB,2CAAyB;AACzB,qCAAkD;AAAzC,gHAAA,qBAAqB,OAAA;AAwB9B,SAAgB,SAAS,CAAC,IAAmB,EAAE,YAAqB;IAClE,IAAI,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAClD,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,oBAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAgB,MAAM,CACpB,iBAA0B,EAC1B,gBAAyB;IAEzB,IAAI,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC9D,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7F,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAE1E,OAAO;QACL,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;QACzB,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAClB,MAAM;QACN,UAAU,EAAE,GAAG,GAAG,CAAC;KACpB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,IAAmB;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC1C,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,YAAY;QACZ,aAAa;QACb,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,aAAa,GAAG,YAAY,CAAC;QAC5D,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,MAAa,wBAAyB,SAAQ,KAAK;IACxC,WAAW,CAAS;IACpB,OAAO,CAAW;IAE3B,YAAY,WAAmB,EAAE,OAAiB;QAChD,KAAK,CAAC,gCAAgC,WAAW,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAVD,4DAUC","sourcesContent":["import Decimal from \"decimal.js\";\nimport type { OrderBookId, PubkeyStr } from \"../../shared\";\nimport type { OrderbookDecimals } from \"../../shared/scaling\";\nimport type { ConditionalToken } from \"../market\";\n\nexport * from \"./client\";\nexport * from \"./wire\";\nexport * from \"./state\";\nexport * from \"./ticker\";\nexport { orderBookPairFromWire } from \"./convert\";\n\nexport interface OrderBookPair {\n id: number;\n marketPubkey: PubkeyStr;\n orderbookId: OrderBookId;\n base: ConditionalToken;\n quote: ConditionalToken;\n outcomeIndex: number;\n tickSize: number;\n totalBids: number;\n totalAsks: number;\n lastTradePrice?: string;\n lastTradeTime?: Date;\n active: boolean;\n}\n\nexport interface OutcomeImpact {\n sign: string;\n pct: number;\n dollar: string;\n isPositive: boolean;\n}\n\nexport function impactPct(pair: OrderBookPair, depositPrice: Decimal): [number, string] {\n if (depositPrice.isZero() || !pair.lastTradePrice) {\n return [0, \"\"];\n }\n\n const conditional = new Decimal(pair.lastTradePrice);\n const value = conditional.minus(depositPrice).div(depositPrice).mul(100);\n return [value.toNumber(), value.greaterThan(0) ? \"+\" : \"\"];\n}\n\nexport function impact(\n depositAssetPrice: Decimal,\n conditionalPrice: Decimal\n): OutcomeImpact {\n if (depositAssetPrice.isZero()) {\n return { sign: \"\", pct: 0, dollar: \"0\", isPositive: false };\n }\n\n const pctDecimal = conditionalPrice.minus(depositAssetPrice).div(depositAssetPrice).mul(100);\n const pct = pctDecimal.toNumber();\n const dollar = conditionalPrice.minus(depositAssetPrice).abs().toString();\n\n return {\n sign: pct > 0 ? \"+\" : \"-\",\n pct: Math.abs(pct),\n dollar,\n isPositive: pct > 0,\n };\n}\n\n/**\n * Derive scaling decimals from an orderbook pair's token metadata.\n *\n * No REST call needed — decimals are computed from the base/quote token objects.\n */\nexport function orderbookDecimals(pair: OrderBookPair): OrderbookDecimals {\n const baseDecimals = pair.base.decimals;\n const quoteDecimals = pair.quote.decimals;\n return {\n orderbookId: pair.orderbookId,\n baseDecimals,\n quoteDecimals,\n priceDecimals: Math.max(0, 6 + quoteDecimals - baseDecimals),\n tickSize: BigInt(Math.max(pair.tickSize, 0)),\n };\n}\n\nexport class OrderBookValidationError extends Error {\n readonly orderbookId: string;\n readonly details: string[];\n\n constructor(orderbookId: string, details: string[]) {\n super(`OrderBook validation errors (${orderbookId}): ${details.join(\"; \")}`);\n this.name = \"OrderBookValidationError\";\n this.orderbookId = orderbookId;\n this.details = details;\n }\n}\n"]}
@@ -5,6 +5,8 @@ export declare class OrderbookSnapshot {
5
5
  seq: number;
6
6
  private readonly bidsMap;
7
7
  private readonly asksMap;
8
+ private cachedBestBid;
9
+ private cachedBestAsk;
8
10
  constructor(orderbookId: OrderBookId);
9
11
  apply(book: OrderBook): void;
10
12
  bids(): ReadonlyMap<string, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/domain/orderbook/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAElC,WAAW,EAAE,WAAW;IAOpC,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAyB5B,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAInC,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAInC,OAAO,IAAI,MAAM,GAAG,SAAS;IAQ7B,OAAO,IAAI,MAAM,GAAG,SAAS;IAQ7B,QAAQ,IAAI,MAAM,GAAG,SAAS;IAU9B,MAAM,IAAI,MAAM,GAAG,SAAS;IAU5B,OAAO,IAAI,OAAO;IAIlB,KAAK,IAAI,IAAI;CAKd"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/domain/orderbook/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,aAAa,CAA4B;gBAErC,WAAW,EAAE,WAAW;IASpC,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IA4B5B,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAInC,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAInC,OAAO,IAAI,MAAM,GAAG,SAAS;IAe7B,OAAO,IAAI,MAAM,GAAG,SAAS;IAc7B,QAAQ,IAAI,MAAM,GAAG,SAAS;IAU9B,MAAM,IAAI,MAAM,GAAG,SAAS;IAU5B,OAAO,IAAI,OAAO;IAIlB,KAAK,IAAI,IAAI;CAOd"}
@@ -10,11 +10,15 @@ class OrderbookSnapshot {
10
10
  seq;
11
11
  bidsMap;
12
12
  asksMap;
13
+ cachedBestBid;
14
+ cachedBestAsk;
13
15
  constructor(orderbookId) {
14
16
  this.orderbookId = orderbookId;
15
17
  this.seq = 0;
16
18
  this.bidsMap = new Map();
17
19
  this.asksMap = new Map();
20
+ this.cachedBestBid = null;
21
+ this.cachedBestAsk = null;
18
22
  }
19
23
  apply(book) {
20
24
  if (book.is_snapshot) {
@@ -38,6 +42,8 @@ class OrderbookSnapshot {
38
42
  this.asksMap.set(level.price, level.size);
39
43
  }
40
44
  }
45
+ this.cachedBestBid = null;
46
+ this.cachedBestAsk = null;
41
47
  }
42
48
  bids() {
43
49
  return this.bidsMap;
@@ -46,16 +52,31 @@ class OrderbookSnapshot {
46
52
  return this.asksMap;
47
53
  }
48
54
  bestBid() {
55
+ if (this.cachedBestBid !== null) {
56
+ return this.cachedBestBid;
57
+ }
49
58
  if (this.bidsMap.size === 0) {
59
+ this.cachedBestBid = undefined;
50
60
  return undefined;
51
61
  }
52
- return Array.from(this.bidsMap.keys()).sort((a, b) => new decimal_js_1.default(a).cmp(new decimal_js_1.default(b))).at(-1);
62
+ const result = Array.from(this.bidsMap.keys())
63
+ .sort((a, b) => new decimal_js_1.default(a).cmp(new decimal_js_1.default(b)))
64
+ .at(-1);
65
+ this.cachedBestBid = result;
66
+ return result;
53
67
  }
54
68
  bestAsk() {
69
+ if (this.cachedBestAsk !== null) {
70
+ return this.cachedBestAsk;
71
+ }
55
72
  if (this.asksMap.size === 0) {
73
+ this.cachedBestAsk = undefined;
56
74
  return undefined;
57
75
  }
58
- return Array.from(this.asksMap.keys()).sort((a, b) => new decimal_js_1.default(a).cmp(new decimal_js_1.default(b)))[0];
76
+ const result = Array.from(this.asksMap.keys())
77
+ .sort((a, b) => new decimal_js_1.default(a).cmp(new decimal_js_1.default(b)))[0];
78
+ this.cachedBestAsk = result;
79
+ return result;
59
80
  }
60
81
  midPrice() {
61
82
  const bid = this.bestBid();
@@ -80,6 +101,8 @@ class OrderbookSnapshot {
80
101
  this.bidsMap.clear();
81
102
  this.asksMap.clear();
82
103
  this.seq = 0;
104
+ this.cachedBestBid = null;
105
+ this.cachedBestAsk = null;
83
106
  }
84
107
  }
85
108
  exports.OrderbookSnapshot = OrderbookSnapshot;