@nadohq/indexer-client 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/dist/CandlestickPeriod-1DtcEiOb.d.ts +15 -0
  2. package/dist/CandlestickPeriod-1DtcEiOb.d.ts.map +1 -0
  3. package/dist/CandlestickPeriod-D3_IoSev.d.cts +15 -0
  4. package/dist/CandlestickPeriod-D3_IoSev.d.cts.map +1 -0
  5. package/dist/IndexerBaseClient-3KfzA2ph.cjs +639 -0
  6. package/dist/IndexerBaseClient-3KfzA2ph.cjs.map +1 -0
  7. package/dist/IndexerBaseClient.cjs +3 -788
  8. package/dist/IndexerBaseClient.d.cts +223 -229
  9. package/dist/IndexerBaseClient.d.cts.map +1 -0
  10. package/dist/IndexerBaseClient.d.ts +223 -229
  11. package/dist/IndexerBaseClient.d.ts.map +1 -0
  12. package/dist/IndexerBaseClient.js +601 -783
  13. package/dist/IndexerBaseClient.js.map +1 -1
  14. package/dist/IndexerClient.cjs +275 -381
  15. package/dist/IndexerClient.cjs.map +1 -1
  16. package/dist/IndexerClient.d.cts +32 -43
  17. package/dist/IndexerClient.d.cts.map +1 -0
  18. package/dist/IndexerClient.d.ts +32 -43
  19. package/dist/IndexerClient.d.ts.map +1 -0
  20. package/dist/IndexerClient.js +273 -362
  21. package/dist/IndexerClient.js.map +1 -1
  22. package/dist/IndexerEventType-B-uXsf-a.d.cts +5 -0
  23. package/dist/IndexerEventType-B-uXsf-a.d.cts.map +1 -0
  24. package/dist/IndexerEventType-DCLkSlgR.d.ts +5 -0
  25. package/dist/IndexerEventType-DCLkSlgR.d.ts.map +1 -0
  26. package/dist/IndexerLeaderboardType-Ck12QVWR.d.cts +13 -0
  27. package/dist/IndexerLeaderboardType-Ck12QVWR.d.cts.map +1 -0
  28. package/dist/IndexerLeaderboardType-DAKw2tfI.d.ts +13 -0
  29. package/dist/IndexerLeaderboardType-DAKw2tfI.d.ts.map +1 -0
  30. package/dist/NadoTx-CWCklgY4.d.ts +50 -0
  31. package/dist/NadoTx-CWCklgY4.d.ts.map +1 -0
  32. package/dist/NadoTx-MYNIlXyq.d.cts +50 -0
  33. package/dist/NadoTx-MYNIlXyq.d.cts.map +1 -0
  34. package/dist/clientTypes-BpxOUu1q.d.ts +709 -0
  35. package/dist/clientTypes-BpxOUu1q.d.ts.map +1 -0
  36. package/dist/clientTypes-BsJ2yIC4.d.cts +709 -0
  37. package/dist/clientTypes-BsJ2yIC4.d.cts.map +1 -0
  38. package/dist/collateralEventType-CzH_2iTV.d.ts +5 -0
  39. package/dist/collateralEventType-CzH_2iTV.d.ts.map +1 -0
  40. package/dist/collateralEventType-DIm6Te7F.d.cts +5 -0
  41. package/dist/collateralEventType-DIm6Te7F.d.cts.map +1 -0
  42. package/dist/dataMappers.cjs +269 -346
  43. package/dist/dataMappers.cjs.map +1 -1
  44. package/dist/dataMappers.d.cts +7 -12
  45. package/dist/dataMappers.d.cts.map +1 -0
  46. package/dist/dataMappers.d.ts +7 -12
  47. package/dist/dataMappers.d.ts.map +1 -0
  48. package/dist/dataMappers.js +248 -314
  49. package/dist/dataMappers.js.map +1 -1
  50. package/dist/endpoints.cjs +8 -32
  51. package/dist/endpoints.cjs.map +1 -1
  52. package/dist/endpoints.d.cts +4 -2
  53. package/dist/endpoints.d.cts.map +1 -0
  54. package/dist/endpoints.d.ts +4 -2
  55. package/dist/endpoints.d.ts.map +1 -0
  56. package/dist/endpoints.js +8 -8
  57. package/dist/endpoints.js.map +1 -1
  58. package/dist/index-D6CnpA_r.d.cts +1 -0
  59. package/dist/index-DhI2LvVQ.d.ts +1 -0
  60. package/dist/index.cjs +15 -33
  61. package/dist/index.d.cts +14 -18
  62. package/dist/index.d.ts +14 -18
  63. package/dist/index.js +8 -7
  64. package/dist/indexerBalanceValue-4AuNuTAc.d.cts +32 -0
  65. package/dist/indexerBalanceValue-4AuNuTAc.d.cts.map +1 -0
  66. package/dist/indexerBalanceValue-B0OggI67.d.ts +32 -0
  67. package/dist/indexerBalanceValue-B0OggI67.d.ts.map +1 -0
  68. package/dist/paginatedEventsTypes-DtGDU-kI.d.cts +110 -0
  69. package/dist/paginatedEventsTypes-DtGDU-kI.d.cts.map +1 -0
  70. package/dist/paginatedEventsTypes-RwXoQrEa.d.ts +110 -0
  71. package/dist/paginatedEventsTypes-RwXoQrEa.d.ts.map +1 -0
  72. package/dist/serverModelTypes-CM2g040o.d.cts +262 -0
  73. package/dist/serverModelTypes-CM2g040o.d.cts.map +1 -0
  74. package/dist/serverModelTypes-DPHMUSZe.d.ts +262 -0
  75. package/dist/serverModelTypes-DPHMUSZe.d.ts.map +1 -0
  76. package/dist/serverTypes-BMSNh2GK.d.cts +452 -0
  77. package/dist/serverTypes-BMSNh2GK.d.cts.map +1 -0
  78. package/dist/serverTypes-c8IABU73.d.ts +452 -0
  79. package/dist/serverTypes-c8IABU73.d.ts.map +1 -0
  80. package/dist/types/CandlestickPeriod.cjs +16 -40
  81. package/dist/types/CandlestickPeriod.cjs.map +1 -1
  82. package/dist/types/CandlestickPeriod.d.cts +2 -13
  83. package/dist/types/CandlestickPeriod.d.ts +2 -13
  84. package/dist/types/CandlestickPeriod.js +16 -16
  85. package/dist/types/CandlestickPeriod.js.map +1 -1
  86. package/dist/types/IndexerEventType.cjs +0 -19
  87. package/dist/types/IndexerEventType.d.cts +2 -3
  88. package/dist/types/IndexerEventType.d.ts +2 -3
  89. package/dist/types/IndexerEventType.js +1 -1
  90. package/dist/types/IndexerLeaderboardType.cjs +0 -19
  91. package/dist/types/IndexerLeaderboardType.d.cts +2 -11
  92. package/dist/types/IndexerLeaderboardType.d.ts +2 -11
  93. package/dist/types/IndexerLeaderboardType.js +1 -1
  94. package/dist/types/NadoTx.cjs +0 -19
  95. package/dist/types/NadoTx.d.cts +2 -48
  96. package/dist/types/NadoTx.d.ts +2 -48
  97. package/dist/types/NadoTx.js +1 -1
  98. package/dist/types/clientTypes.cjs +0 -19
  99. package/dist/types/clientTypes.d.cts +2 -709
  100. package/dist/types/clientTypes.d.ts +2 -709
  101. package/dist/types/clientTypes.js +1 -1
  102. package/dist/types/collateralEventType.cjs +0 -19
  103. package/dist/types/collateralEventType.d.cts +2 -3
  104. package/dist/types/collateralEventType.d.ts +2 -3
  105. package/dist/types/collateralEventType.js +1 -1
  106. package/dist/types/index.cjs +3 -41
  107. package/dist/types/index.d.cts +10 -13
  108. package/dist/types/index.d.ts +10 -13
  109. package/dist/types/index.js +2 -11
  110. package/dist/types/paginatedEventsTypes.cjs +0 -19
  111. package/dist/types/paginatedEventsTypes.d.cts +2 -115
  112. package/dist/types/paginatedEventsTypes.d.ts +2 -115
  113. package/dist/types/paginatedEventsTypes.js +1 -1
  114. package/dist/types/serverModelTypes.cjs +0 -19
  115. package/dist/types/serverModelTypes.d.cts +2 -260
  116. package/dist/types/serverModelTypes.d.ts +2 -260
  117. package/dist/types/serverModelTypes.js +1 -1
  118. package/dist/types/serverTypes.cjs +0 -19
  119. package/dist/types/serverTypes.d.cts +2 -451
  120. package/dist/types/serverTypes.d.ts +2 -451
  121. package/dist/types/serverTypes.js +1 -1
  122. package/dist/utils/index.cjs +5 -25
  123. package/dist/utils/index.d.cts +2 -12
  124. package/dist/utils/index.d.ts +2 -12
  125. package/dist/utils/index.js +2 -3
  126. package/dist/utils/indexerBalanceValue.cjs +32 -36
  127. package/dist/utils/indexerBalanceValue.cjs.map +1 -1
  128. package/dist/utils/indexerBalanceValue.d.cts +2 -39
  129. package/dist/utils/indexerBalanceValue.d.ts +2 -39
  130. package/dist/utils/indexerBalanceValue.js +29 -9
  131. package/dist/utils/indexerBalanceValue.js.map +1 -1
  132. package/package.json +10 -10
  133. package/dist/IndexerBaseClient.cjs.map +0 -1
  134. package/dist/index.cjs.map +0 -1
  135. package/dist/index.js.map +0 -1
  136. package/dist/types/IndexerEventType.cjs.map +0 -1
  137. package/dist/types/IndexerEventType.js.map +0 -1
  138. package/dist/types/IndexerLeaderboardType.cjs.map +0 -1
  139. package/dist/types/IndexerLeaderboardType.js.map +0 -1
  140. package/dist/types/NadoTx.cjs.map +0 -1
  141. package/dist/types/NadoTx.js.map +0 -1
  142. package/dist/types/clientTypes.cjs.map +0 -1
  143. package/dist/types/clientTypes.js.map +0 -1
  144. package/dist/types/collateralEventType.cjs.map +0 -1
  145. package/dist/types/collateralEventType.js.map +0 -1
  146. package/dist/types/index.cjs.map +0 -1
  147. package/dist/types/index.js.map +0 -1
  148. package/dist/types/paginatedEventsTypes.cjs.map +0 -1
  149. package/dist/types/paginatedEventsTypes.js.map +0 -1
  150. package/dist/types/serverModelTypes.cjs.map +0 -1
  151. package/dist/types/serverModelTypes.js.map +0 -1
  152. package/dist/types/serverTypes.cjs.map +0 -1
  153. package/dist/types/serverTypes.js.map +0 -1
  154. package/dist/utils/index.cjs.map +0 -1
  155. package/dist/utils/index.js.map +0 -1
@@ -1,366 +1,277 @@
1
- // src/IndexerClient.ts
2
- import {
3
- NLP_PRODUCT_ID,
4
- ProductEngineType,
5
- QUOTE_PRODUCT_ID,
6
- subaccountFromHex,
7
- toBigNumber,
8
- toIntegerString
9
- } from "@nadohq/shared";
10
1
  import { IndexerBaseClient } from "./IndexerBaseClient.js";
2
+ import { NLP_PRODUCT_ID, ProductEngineType, QUOTE_PRODUCT_ID, subaccountFromHex, toBigNumber, toIntegerString } from "@nadohq/shared";
3
+ //#region src/IndexerClient.ts
4
+ /**
5
+ * Indexer client providing paginated queries for historical data from the Nado indexer service
6
+ */
11
7
  var IndexerClient = class extends IndexerBaseClient {
12
- async getPaginatedSubaccountMatchEvents(params) {
13
- const {
14
- startCursor,
15
- maxTimestampInclusive,
16
- limit: requestedLimit,
17
- subaccountName,
18
- subaccountOwner,
19
- isolated,
20
- productIds
21
- } = params;
22
- const limit = requestedLimit + 1;
23
- const events = await this.getMatchEvents({
24
- startCursor,
25
- maxTimestampInclusive,
26
- limit,
27
- subaccounts: [{ subaccountName, subaccountOwner }],
28
- productIds,
29
- isolated
30
- });
31
- return this.getPaginationEventsResponse(events, requestedLimit);
32
- }
33
- async getPaginatedSubaccountNlpEvents(params) {
34
- const {
35
- startCursor,
36
- maxTimestampInclusive,
37
- limit: requestedLimit,
38
- subaccountName,
39
- subaccountOwner
40
- } = params;
41
- const limit = requestedLimit + 1;
42
- const baseResponse = await this.getEvents({
43
- startCursor,
44
- maxTimestampInclusive,
45
- eventTypes: ["mint_nlp", "burn_nlp"],
46
- limit: {
47
- type: "txs",
48
- value: limit
49
- },
50
- subaccounts: [{ subaccountName, subaccountOwner }]
51
- });
52
- const eventsBySubmissionIdx = /* @__PURE__ */ new Map();
53
- baseResponse.forEach((event) => {
54
- const mappedEvent = (() => {
55
- const existingEvent = eventsBySubmissionIdx.get(event.submissionIndex);
56
- if (existingEvent) {
57
- return existingEvent;
58
- }
59
- const newEvent = {
60
- nlpDelta: toBigNumber(0),
61
- primaryQuoteDelta: toBigNumber(0),
62
- timestamp: event.timestamp,
63
- submissionIndex: event.submissionIndex,
64
- tx: event.tx,
65
- ...subaccountFromHex(event.subaccount)
66
- };
67
- eventsBySubmissionIdx.set(event.submissionIndex, newEvent);
68
- return newEvent;
69
- })();
70
- const balanceDelta = event.state.postBalance.amount.minus(
71
- event.state.preBalance.amount
72
- );
73
- const productId = event.state.market.productId;
74
- if (productId === QUOTE_PRODUCT_ID) {
75
- mappedEvent.primaryQuoteDelta = balanceDelta;
76
- } else if (productId === NLP_PRODUCT_ID) {
77
- mappedEvent.nlpDelta = balanceDelta;
78
- } else {
79
- throw Error(`Invalid product ID for NLP event ${productId}`);
80
- }
81
- });
82
- const events = Array.from(eventsBySubmissionIdx.values());
83
- return this.getPaginationEventsResponse(events, requestedLimit);
84
- }
85
- async getPaginatedSubaccountCollateralEvents(params) {
86
- const {
87
- startCursor,
88
- maxTimestampInclusive,
89
- limit: requestedLimit,
90
- subaccountName,
91
- subaccountOwner,
92
- eventTypes,
93
- isolated
94
- } = params;
95
- const limit = requestedLimit + 1;
96
- const baseResponse = await this.getEvents({
97
- startCursor,
98
- maxTimestampInclusive,
99
- eventTypes: eventTypes ?? [
100
- "deposit_collateral",
101
- "withdraw_collateral",
102
- "transfer_quote"
103
- ],
104
- limit: {
105
- type: "txs",
106
- value: limit
107
- },
108
- subaccounts: [{ subaccountName, subaccountOwner }],
109
- isolated
110
- });
111
- const events = baseResponse.map((event) => {
112
- if (event.state.type !== ProductEngineType.SPOT) {
113
- throw Error("Incorrect event state for collateral event");
114
- }
115
- return {
116
- timestamp: event.timestamp,
117
- // This cast is safe as the query param restricts to collateral events
118
- eventType: event.eventType,
119
- submissionIndex: event.submissionIndex,
120
- snapshot: event.state,
121
- amount: event.state.postBalance.amount.minus(
122
- event.state.preBalance.amount
123
- ),
124
- newAmount: event.state.postBalance.amount,
125
- tx: event.tx,
126
- ...subaccountFromHex(event.subaccount)
127
- };
128
- });
129
- return this.getPaginationEventsResponse(events, requestedLimit);
130
- }
131
- async getPaginatedSubaccountOrders(params) {
132
- const {
133
- startCursor,
134
- maxTimestampInclusive,
135
- limit: requestedLimit,
136
- subaccountName,
137
- subaccountOwner,
138
- productIds,
139
- triggerTypes,
140
- isolated
141
- } = params;
142
- const limit = requestedLimit + 1;
143
- const baseResponse = await this.getOrders({
144
- startCursor,
145
- maxTimestampInclusive,
146
- subaccounts: [{ subaccountName, subaccountOwner }],
147
- limit,
148
- productIds,
149
- triggerTypes,
150
- isolated
151
- });
152
- const truncatedOrders = baseResponse.slice(0, requestedLimit);
153
- const hasMore = baseResponse.length > truncatedOrders.length;
154
- return {
155
- meta: {
156
- hasMore,
157
- nextCursor: baseResponse[truncatedOrders.length]?.submissionIndex
158
- },
159
- orders: truncatedOrders
160
- };
161
- }
162
- async getPaginatedSubaccountSettlementEvents(params) {
163
- const {
164
- startCursor,
165
- maxTimestampInclusive,
166
- limit: requestedLimit,
167
- subaccountName,
168
- subaccountOwner
169
- } = params;
170
- const limit = requestedLimit + 1;
171
- const baseResponse = await this.getEvents({
172
- startCursor,
173
- maxTimestampInclusive,
174
- eventTypes: ["settle_pnl"],
175
- limit: {
176
- type: "txs",
177
- value: limit
178
- },
179
- subaccounts: [{ subaccountName, subaccountOwner }]
180
- });
181
- const events = baseResponse.map((event) => {
182
- if (event.state.market.productId === QUOTE_PRODUCT_ID) {
183
- return;
184
- }
185
- if (event.state.type !== ProductEngineType.PERP) {
186
- throw Error("Incorrect event state for settlement event");
187
- }
188
- return {
189
- timestamp: event.timestamp,
190
- submissionIndex: event.submissionIndex,
191
- snapshot: event.state,
192
- // Spot quote delta = -vQuote delta
193
- quoteDelta: event.state.preBalance.vQuoteBalance.minus(
194
- event.state.postBalance.vQuoteBalance
195
- ),
196
- isolated: event.isolated,
197
- tx: event.tx,
198
- ...subaccountFromHex(event.subaccount)
199
- };
200
- }).filter((event) => !!event);
201
- return this.getPaginationEventsResponse(events, requestedLimit);
202
- }
203
- async getPaginatedSubaccountLiquidationEvents(params) {
204
- const {
205
- startCursor,
206
- maxTimestampInclusive,
207
- limit: requestedLimit,
208
- subaccountName,
209
- subaccountOwner,
210
- productIds
211
- } = params;
212
- const limit = requestedLimit + 1;
213
- const baseResponse = await this.getEvents({
214
- startCursor,
215
- maxTimestampInclusive,
216
- eventTypes: ["liquidate_subaccount"],
217
- limit: {
218
- type: "txs",
219
- value: limit
220
- },
221
- subaccounts: [{ subaccountName, subaccountOwner }],
222
- productIds
223
- });
224
- const eventsBySubmissionIdx = /* @__PURE__ */ new Map();
225
- const productIdsSet = productIds ? new Set(productIds) : void 0;
226
- baseResponse.forEach((event) => {
227
- if (productIdsSet && !productIdsSet.has(
228
- // product_id can also encode a health group for spread liquidation, but we ignore
229
- // this case for now
230
- event.tx.liquidate_subaccount.product_id
231
- )) {
232
- return;
233
- }
234
- const mappedEvent = (() => {
235
- const existingEvent = eventsBySubmissionIdx.get(event.submissionIndex);
236
- if (existingEvent) {
237
- return existingEvent;
238
- }
239
- const newEvent = {
240
- perp: void 0,
241
- spot: void 0,
242
- quote: void 0,
243
- timestamp: event.timestamp,
244
- submissionIndex: event.submissionIndex
245
- };
246
- return newEvent;
247
- })();
248
- const balanceDelta = event.state.postBalance.amount.minus(
249
- event.state.preBalance.amount
250
- );
251
- if (balanceDelta.isZero() && event.state.market.productId !== QUOTE_PRODUCT_ID) {
252
- return;
253
- }
254
- if (event.state.type === ProductEngineType.PERP) {
255
- mappedEvent.perp = {
256
- amountLiquidated: balanceDelta.negated(),
257
- // This cast is safe because we're checking for event.state.type
258
- indexerEvent: event
259
- };
260
- } else if (event.state.market.productId === QUOTE_PRODUCT_ID) {
261
- mappedEvent.quote = {
262
- balanceDelta,
263
- indexerEvent: event
264
- };
265
- } else {
266
- mappedEvent.spot = {
267
- amountLiquidated: balanceDelta.negated(),
268
- indexerEvent: event
269
- };
270
- }
271
- eventsBySubmissionIdx.set(event.submissionIndex, mappedEvent);
272
- });
273
- const events = Array.from(
274
- eventsBySubmissionIdx.values()
275
- );
276
- return this.getPaginationEventsResponse(events, requestedLimit);
277
- }
278
- /**
279
- * Get all interest funding payments for a given subaccount with the standard pagination response
280
- * This is a simple wrapper over the underlying `getInterestFundingPayments` function. Very little
281
- * additional processing is needed because the endpoint is well structured for pagination
282
- *
283
- * @param params
284
- */
285
- async getPaginatedSubaccountInterestFundingPayments(params) {
286
- const {
287
- limit,
288
- productIds,
289
- startCursor,
290
- maxTimestampInclusive,
291
- subaccountName,
292
- subaccountOwner
293
- } = params;
294
- const baseResponse = await this.getInterestFundingPayments({
295
- limit,
296
- productIds,
297
- startCursor,
298
- maxTimestampInclusive,
299
- subaccount: {
300
- subaccountName,
301
- subaccountOwner
302
- }
303
- });
304
- return {
305
- ...baseResponse,
306
- meta: {
307
- hasMore: baseResponse.nextCursor != null,
308
- nextCursor: baseResponse.nextCursor ?? void 0
309
- }
310
- };
311
- }
312
- /**
313
- * Paginated leaderboard query that paginates on rank number.
314
- *
315
- * @param params
316
- */
317
- async getPaginatedLeaderboard(params) {
318
- const requestedLimit = params.limit;
319
- const baseResponse = await this.getLeaderboard({
320
- contestId: params.contestId,
321
- rankType: params.rankType,
322
- // Query for 1 more result for proper pagination
323
- limit: requestedLimit + 1,
324
- // Start cursor is the next rank number
325
- startCursor: params.startCursor
326
- });
327
- const overflowParticipant = baseResponse.participants[requestedLimit];
328
- let nextCursor;
329
- if (overflowParticipant) {
330
- const trackData = params.rankType ? overflowParticipant.tracks[params.rankType] : Object.values(overflowParticipant.tracks)[0];
331
- nextCursor = trackData.rank;
332
- }
333
- return {
334
- ...baseResponse,
335
- // Truncate the response to the requested limit
336
- participants: baseResponse.participants.slice(0, requestedLimit),
337
- meta: {
338
- hasMore: baseResponse.participants.length > requestedLimit,
339
- nextCursor: nextCursor !== void 0 ? toIntegerString(nextCursor) : void 0
340
- }
341
- };
342
- }
343
- /**
344
- * A util function to generate the standard pagination response for events
345
- * @param events
346
- * @param requestedLimit given by consumers of the SDK
347
- * @private
348
- */
349
- getPaginationEventsResponse(events, requestedLimit) {
350
- const truncatedEvents = events.slice(0, requestedLimit);
351
- const hasMore = events.length > truncatedEvents.length;
352
- return {
353
- events: truncatedEvents,
354
- meta: {
355
- hasMore,
356
- // We want the NEXT available cursor, so we use the first event after the truncation cutoff
357
- // If len(events) === len(truncatedEvents), there are no more entries and this is undefined
358
- nextCursor: events[truncatedEvents.length]?.submissionIndex
359
- }
360
- };
361
- }
362
- };
363
- export {
364
- IndexerClient
8
+ async getPaginatedSubaccountMatchEvents(params) {
9
+ const { startCursor, maxTimestampInclusive, limit: requestedLimit, subaccountName, subaccountOwner, isolated, productIds } = params;
10
+ const limit = requestedLimit + 1;
11
+ const events = await this.getMatchEvents({
12
+ startCursor,
13
+ maxTimestampInclusive,
14
+ limit,
15
+ subaccounts: [{
16
+ subaccountName,
17
+ subaccountOwner
18
+ }],
19
+ productIds,
20
+ isolated
21
+ });
22
+ return this.getPaginationEventsResponse(events, requestedLimit);
23
+ }
24
+ async getPaginatedSubaccountNlpEvents(params) {
25
+ const { startCursor, maxTimestampInclusive, limit: requestedLimit, subaccountName, subaccountOwner } = params;
26
+ const limit = requestedLimit + 1;
27
+ const baseResponse = await this.getEvents({
28
+ startCursor,
29
+ maxTimestampInclusive,
30
+ eventTypes: ["mint_nlp", "burn_nlp"],
31
+ limit: {
32
+ type: "txs",
33
+ value: limit
34
+ },
35
+ subaccounts: [{
36
+ subaccountName,
37
+ subaccountOwner
38
+ }]
39
+ });
40
+ const eventsBySubmissionIdx = /* @__PURE__ */ new Map();
41
+ baseResponse.forEach((event) => {
42
+ const mappedEvent = (() => {
43
+ const existingEvent = eventsBySubmissionIdx.get(event.submissionIndex);
44
+ if (existingEvent) return existingEvent;
45
+ const newEvent = {
46
+ nlpDelta: toBigNumber(0),
47
+ primaryQuoteDelta: toBigNumber(0),
48
+ timestamp: event.timestamp,
49
+ submissionIndex: event.submissionIndex,
50
+ tx: event.tx,
51
+ ...subaccountFromHex(event.subaccount)
52
+ };
53
+ eventsBySubmissionIdx.set(event.submissionIndex, newEvent);
54
+ return newEvent;
55
+ })();
56
+ const balanceDelta = event.state.postBalance.amount.minus(event.state.preBalance.amount);
57
+ const productId = event.state.market.productId;
58
+ if (productId === QUOTE_PRODUCT_ID) mappedEvent.primaryQuoteDelta = balanceDelta;
59
+ else if (productId === NLP_PRODUCT_ID) mappedEvent.nlpDelta = balanceDelta;
60
+ else throw Error(`Invalid product ID for NLP event ${productId}`);
61
+ });
62
+ const events = Array.from(eventsBySubmissionIdx.values());
63
+ return this.getPaginationEventsResponse(events, requestedLimit);
64
+ }
65
+ async getPaginatedSubaccountCollateralEvents(params) {
66
+ const { startCursor, maxTimestampInclusive, limit: requestedLimit, subaccountName, subaccountOwner, eventTypes, isolated } = params;
67
+ const limit = requestedLimit + 1;
68
+ const events = (await this.getEvents({
69
+ startCursor,
70
+ maxTimestampInclusive,
71
+ eventTypes: eventTypes ?? [
72
+ "deposit_collateral",
73
+ "withdraw_collateral",
74
+ "transfer_quote"
75
+ ],
76
+ limit: {
77
+ type: "txs",
78
+ value: limit
79
+ },
80
+ subaccounts: [{
81
+ subaccountName,
82
+ subaccountOwner
83
+ }],
84
+ isolated
85
+ })).map((event) => {
86
+ if (event.state.type !== ProductEngineType.SPOT) throw Error("Incorrect event state for collateral event");
87
+ return {
88
+ timestamp: event.timestamp,
89
+ eventType: event.eventType,
90
+ submissionIndex: event.submissionIndex,
91
+ snapshot: event.state,
92
+ amount: event.state.postBalance.amount.minus(event.state.preBalance.amount),
93
+ newAmount: event.state.postBalance.amount,
94
+ tx: event.tx,
95
+ ...subaccountFromHex(event.subaccount)
96
+ };
97
+ });
98
+ return this.getPaginationEventsResponse(events, requestedLimit);
99
+ }
100
+ async getPaginatedSubaccountOrders(params) {
101
+ const { startCursor, maxTimestampInclusive, limit: requestedLimit, subaccountName, subaccountOwner, productIds, triggerTypes, isolated } = params;
102
+ const limit = requestedLimit + 1;
103
+ const baseResponse = await this.getOrders({
104
+ startCursor,
105
+ maxTimestampInclusive,
106
+ subaccounts: [{
107
+ subaccountName,
108
+ subaccountOwner
109
+ }],
110
+ limit,
111
+ productIds,
112
+ triggerTypes,
113
+ isolated
114
+ });
115
+ const truncatedOrders = baseResponse.slice(0, requestedLimit);
116
+ return {
117
+ meta: {
118
+ hasMore: baseResponse.length > truncatedOrders.length,
119
+ nextCursor: baseResponse[truncatedOrders.length]?.submissionIndex
120
+ },
121
+ orders: truncatedOrders
122
+ };
123
+ }
124
+ async getPaginatedSubaccountSettlementEvents(params) {
125
+ const { startCursor, maxTimestampInclusive, limit: requestedLimit, subaccountName, subaccountOwner } = params;
126
+ const limit = requestedLimit + 1;
127
+ const events = (await this.getEvents({
128
+ startCursor,
129
+ maxTimestampInclusive,
130
+ eventTypes: ["settle_pnl"],
131
+ limit: {
132
+ type: "txs",
133
+ value: limit
134
+ },
135
+ subaccounts: [{
136
+ subaccountName,
137
+ subaccountOwner
138
+ }]
139
+ })).map((event) => {
140
+ if (event.state.market.productId === QUOTE_PRODUCT_ID) return;
141
+ if (event.state.type !== ProductEngineType.PERP) throw Error("Incorrect event state for settlement event");
142
+ return {
143
+ timestamp: event.timestamp,
144
+ submissionIndex: event.submissionIndex,
145
+ snapshot: event.state,
146
+ quoteDelta: event.state.preBalance.vQuoteBalance.minus(event.state.postBalance.vQuoteBalance),
147
+ isolated: event.isolated,
148
+ tx: event.tx,
149
+ ...subaccountFromHex(event.subaccount)
150
+ };
151
+ }).filter((event) => !!event);
152
+ return this.getPaginationEventsResponse(events, requestedLimit);
153
+ }
154
+ async getPaginatedSubaccountLiquidationEvents(params) {
155
+ const { startCursor, maxTimestampInclusive, limit: requestedLimit, subaccountName, subaccountOwner, productIds } = params;
156
+ const limit = requestedLimit + 1;
157
+ const baseResponse = await this.getEvents({
158
+ startCursor,
159
+ maxTimestampInclusive,
160
+ eventTypes: ["liquidate_subaccount"],
161
+ limit: {
162
+ type: "txs",
163
+ value: limit
164
+ },
165
+ subaccounts: [{
166
+ subaccountName,
167
+ subaccountOwner
168
+ }],
169
+ productIds
170
+ });
171
+ const eventsBySubmissionIdx = /* @__PURE__ */ new Map();
172
+ const productIdsSet = productIds ? new Set(productIds) : void 0;
173
+ baseResponse.forEach((event) => {
174
+ if (productIdsSet && !productIdsSet.has(event.tx.liquidate_subaccount.product_id)) return;
175
+ const mappedEvent = (() => {
176
+ const existingEvent = eventsBySubmissionIdx.get(event.submissionIndex);
177
+ if (existingEvent) return existingEvent;
178
+ return {
179
+ perp: void 0,
180
+ spot: void 0,
181
+ quote: void 0,
182
+ timestamp: event.timestamp,
183
+ submissionIndex: event.submissionIndex
184
+ };
185
+ })();
186
+ const balanceDelta = event.state.postBalance.amount.minus(event.state.preBalance.amount);
187
+ if (balanceDelta.isZero() && event.state.market.productId !== QUOTE_PRODUCT_ID) return;
188
+ if (event.state.type === ProductEngineType.PERP) mappedEvent.perp = {
189
+ amountLiquidated: balanceDelta.negated(),
190
+ indexerEvent: event
191
+ };
192
+ else if (event.state.market.productId === QUOTE_PRODUCT_ID) mappedEvent.quote = {
193
+ balanceDelta,
194
+ indexerEvent: event
195
+ };
196
+ else mappedEvent.spot = {
197
+ amountLiquidated: balanceDelta.negated(),
198
+ indexerEvent: event
199
+ };
200
+ eventsBySubmissionIdx.set(event.submissionIndex, mappedEvent);
201
+ });
202
+ const events = Array.from(eventsBySubmissionIdx.values());
203
+ return this.getPaginationEventsResponse(events, requestedLimit);
204
+ }
205
+ /**
206
+ * Get all interest funding payments for a given subaccount with the standard pagination response
207
+ * This is a simple wrapper over the underlying `getInterestFundingPayments` function. Very little
208
+ * additional processing is needed because the endpoint is well structured for pagination
209
+ *
210
+ * @param params
211
+ */
212
+ async getPaginatedSubaccountInterestFundingPayments(params) {
213
+ const { limit, productIds, startCursor, maxTimestampInclusive, subaccountName, subaccountOwner } = params;
214
+ const baseResponse = await this.getInterestFundingPayments({
215
+ limit,
216
+ productIds,
217
+ startCursor,
218
+ maxTimestampInclusive,
219
+ subaccount: {
220
+ subaccountName,
221
+ subaccountOwner
222
+ }
223
+ });
224
+ return {
225
+ ...baseResponse,
226
+ meta: {
227
+ hasMore: baseResponse.nextCursor != null,
228
+ nextCursor: baseResponse.nextCursor ?? void 0
229
+ }
230
+ };
231
+ }
232
+ /**
233
+ * Paginated leaderboard query that paginates on rank number.
234
+ *
235
+ * @param params
236
+ */
237
+ async getPaginatedLeaderboard(params) {
238
+ const requestedLimit = params.limit;
239
+ const baseResponse = await this.getLeaderboard({
240
+ contestId: params.contestId,
241
+ rankType: params.rankType,
242
+ limit: requestedLimit + 1,
243
+ startCursor: params.startCursor
244
+ });
245
+ const overflowParticipant = baseResponse.participants[requestedLimit];
246
+ let nextCursor;
247
+ if (overflowParticipant) nextCursor = (params.rankType ? overflowParticipant.tracks[params.rankType] : Object.values(overflowParticipant.tracks)[0]).rank;
248
+ return {
249
+ ...baseResponse,
250
+ participants: baseResponse.participants.slice(0, requestedLimit),
251
+ meta: {
252
+ hasMore: baseResponse.participants.length > requestedLimit,
253
+ nextCursor: nextCursor !== void 0 ? toIntegerString(nextCursor) : void 0
254
+ }
255
+ };
256
+ }
257
+ /**
258
+ * A util function to generate the standard pagination response for events
259
+ * @param events
260
+ * @param requestedLimit given by consumers of the SDK
261
+ * @private
262
+ */
263
+ getPaginationEventsResponse(events, requestedLimit) {
264
+ const truncatedEvents = events.slice(0, requestedLimit);
265
+ return {
266
+ events: truncatedEvents,
267
+ meta: {
268
+ hasMore: events.length > truncatedEvents.length,
269
+ nextCursor: events[truncatedEvents.length]?.submissionIndex
270
+ }
271
+ };
272
+ }
365
273
  };
274
+ //#endregion
275
+ export { IndexerClient };
276
+
366
277
  //# sourceMappingURL=IndexerClient.js.map