@deriverse/kit 1.0.39 → 1.0.42

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 (62) hide show
  1. package/dist/auto_buffer.d.ts +0 -2
  2. package/dist/auto_data.d.ts +0 -2
  3. package/dist/constants.d.ts +14 -0
  4. package/dist/constants.js +28 -0
  5. package/dist/engine/account-helpers.d.ts +59 -0
  6. package/dist/engine/account-helpers.js +177 -0
  7. package/dist/engine/account-helpers.test.d.ts +1 -0
  8. package/dist/engine/account-helpers.test.js +199 -0
  9. package/dist/engine/client-queries.d.ts +36 -0
  10. package/dist/engine/client-queries.js +498 -0
  11. package/dist/engine/client-queries.test.d.ts +1 -0
  12. package/dist/engine/client-queries.test.js +341 -0
  13. package/dist/engine/context-builders.d.ts +16 -0
  14. package/dist/engine/context-builders.js +158 -0
  15. package/dist/engine/context-builders.test.d.ts +1 -0
  16. package/dist/engine/context-builders.test.js +156 -0
  17. package/dist/engine/index.d.ts +101 -0
  18. package/dist/engine/index.js +745 -0
  19. package/dist/engine/index.test.d.ts +1 -0
  20. package/dist/engine/index.test.js +685 -0
  21. package/dist/engine/logs-decoder.d.ts +18 -0
  22. package/dist/engine/logs-decoder.js +525 -0
  23. package/dist/engine/logs-decoder.test.d.ts +1 -0
  24. package/dist/engine/logs-decoder.test.js +836 -0
  25. package/dist/engine/perp-instructions.d.ts +68 -0
  26. package/dist/engine/perp-instructions.js +497 -0
  27. package/dist/engine/perp-instructions.test.d.ts +1 -0
  28. package/dist/engine/perp-instructions.test.js +292 -0
  29. package/dist/engine/spot-instructions.d.ts +52 -0
  30. package/dist/engine/spot-instructions.js +399 -0
  31. package/dist/engine/spot-instructions.test.d.ts +1 -0
  32. package/dist/engine/spot-instructions.test.js +221 -0
  33. package/dist/engine/utils.d.ts +23 -0
  34. package/dist/engine/utils.js +332 -0
  35. package/dist/engine/utils.test.d.ts +1 -0
  36. package/dist/engine/utils.test.js +120 -0
  37. package/dist/index.d.ts +6 -247
  38. package/dist/index.js +14 -2923
  39. package/dist/instruction_models.d.ts +10 -9
  40. package/dist/instruction_models.js +88 -69
  41. package/dist/logs_models.d.ts +147 -5
  42. package/dist/logs_models.js +243 -13
  43. package/dist/structure_models.d.ts +104 -99
  44. package/dist/structure_models.js +152 -129
  45. package/dist/types/engine-args.d.ts +32 -0
  46. package/dist/types/engine-args.js +2 -0
  47. package/dist/types/enums.d.ts +43 -0
  48. package/dist/{types.js → types/enums.js} +3 -5
  49. package/dist/types/index.d.ts +8 -0
  50. package/dist/types/index.js +38 -0
  51. package/dist/types/log-message.d.ts +2 -0
  52. package/dist/types/log-message.js +2 -0
  53. package/dist/types/responses.d.ts +248 -0
  54. package/dist/types/responses.js +2 -0
  55. package/dist/types/schemas.d.ts +168 -0
  56. package/dist/types/schemas.js +239 -0
  57. package/dist/types/schemas.test.d.ts +1 -0
  58. package/dist/types/schemas.test.js +93 -0
  59. package/dist/utils.d.ts +0 -0
  60. package/dist/utils.js +1 -0
  61. package/package.json +26 -6
  62. package/dist/types.d.ts +0 -565
@@ -0,0 +1,836 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const base64_arraybuffer_1 = require("base64-arraybuffer");
5
+ const logs_decoder_1 = require("./logs-decoder");
6
+ const structure_models_1 = require("../structure_models");
7
+ const logs_models_1 = require("../logs_models");
8
+ // Helper to create a minimal context for testing
9
+ function createTestContext(overrides = {}) {
10
+ return Object.assign({ instruments: new Map(), tokens: new Map(), uiNumbers: true }, overrides);
11
+ }
12
+ // Helper to create a mock token
13
+ function createMockToken(id, decimals = 9) {
14
+ const token = new structure_models_1.TokenStateModel();
15
+ token.id = id;
16
+ token.mask = decimals;
17
+ return token;
18
+ }
19
+ // Helper to create a mock instrument
20
+ function createMockInstrument(instrId, assetTokenId = 1, crncyTokenId = 0) {
21
+ const header = new structure_models_1.InstrAccountHeaderModel();
22
+ header.instrId = instrId;
23
+ header.assetTokenId = assetTokenId;
24
+ header.crncyTokenId = crncyTokenId;
25
+ return {
26
+ address: '11111111111111111111111111111111',
27
+ header,
28
+ spotBids: [],
29
+ spotAsks: [],
30
+ perpBids: [],
31
+ perpAsks: [],
32
+ };
33
+ }
34
+ // Helper to create a deposit report buffer
35
+ function createDepositBuffer(clientId, tokenId, time, amount) {
36
+ const buffer = Buffer.alloc(logs_models_1.DepositReportModel.LENGTH);
37
+ buffer.writeUInt8(logs_models_1.LogType.deposit, 0); // tag
38
+ buffer.writeUInt8(0, 1); // padding
39
+ buffer.writeUInt16LE(0, 2); // padding
40
+ buffer.writeUInt32LE(clientId, 4);
41
+ buffer.writeUInt32LE(tokenId, 8);
42
+ buffer.writeUInt32LE(time, 12);
43
+ buffer.writeBigInt64LE(amount, 16);
44
+ return buffer;
45
+ }
46
+ // Helper to create a withdraw report buffer
47
+ function createWithdrawBuffer(clientId, tokenId, time, amount) {
48
+ const buffer = Buffer.alloc(logs_models_1.WithdrawReportModel.LENGTH);
49
+ buffer.writeUInt8(logs_models_1.LogType.withdraw, 0); // tag
50
+ buffer.writeUInt8(0, 1); // padding
51
+ buffer.writeUInt16LE(0, 2); // padding
52
+ buffer.writeUInt32LE(clientId, 4);
53
+ buffer.writeUInt32LE(tokenId, 8);
54
+ buffer.writeUInt32LE(time, 12);
55
+ buffer.writeBigInt64LE(amount, 16);
56
+ return buffer;
57
+ }
58
+ // Helper to create a spot place order report buffer
59
+ function createSpotPlaceOrderBuffer(ioc, side, orderType, clientId, orderId, qty, price, instrId, time) {
60
+ const buffer = Buffer.alloc(logs_models_1.SpotPlaceOrderReportModel.LENGTH);
61
+ buffer.writeUInt8(logs_models_1.LogType.spotPlaceOrder, 0); // tag
62
+ buffer.writeUInt8(ioc, 1);
63
+ buffer.writeUInt8(side, 2);
64
+ buffer.writeUInt8(orderType, 3);
65
+ buffer.writeUInt32LE(clientId, 4);
66
+ buffer.writeBigInt64LE(orderId, 8);
67
+ buffer.writeBigInt64LE(qty, 16);
68
+ buffer.writeBigInt64LE(price, 24);
69
+ buffer.writeUInt32LE(instrId, 32);
70
+ buffer.writeUInt32LE(time, 36);
71
+ return buffer;
72
+ }
73
+ // Helper to create a perp place order report buffer
74
+ function createPerpPlaceOrderBuffer(ioc, side, orderType, clientId, orderId, perps, price, instrId, leverage, time) {
75
+ const buffer = Buffer.alloc(logs_models_1.PerpPlaceOrderReportModel.LENGTH);
76
+ buffer.writeUInt8(logs_models_1.LogType.perpPlaceOrder, 0); // tag
77
+ buffer.writeUInt8(ioc, 1);
78
+ buffer.writeUInt8(side, 2);
79
+ buffer.writeUInt8(orderType, 3);
80
+ buffer.writeUInt32LE(clientId, 4);
81
+ buffer.writeBigInt64LE(orderId, 8);
82
+ buffer.writeBigInt64LE(perps, 16);
83
+ buffer.writeBigInt64LE(price, 24);
84
+ buffer.writeUInt32LE(instrId, 32);
85
+ buffer.writeUInt32LE(leverage, 36);
86
+ buffer.writeUInt32LE(time, 40);
87
+ buffer.writeUInt32LE(0, 44); // padding
88
+ return buffer;
89
+ }
90
+ // Helper to create a spot new order report buffer
91
+ function createSpotNewOrderBuffer(side, qty, crncy) {
92
+ const buffer = Buffer.alloc(logs_models_1.SpotNewOrderReportModel.LENGTH);
93
+ buffer.writeUInt8(logs_models_1.LogType.spotNewOrder, 0); // tag
94
+ buffer.writeUInt8(side, 1);
95
+ buffer.writeUInt16LE(0, 2); // padding
96
+ buffer.writeUInt32LE(0, 4); // padding
97
+ buffer.writeBigInt64LE(qty, 8);
98
+ buffer.writeBigInt64LE(crncy, 16);
99
+ return buffer;
100
+ }
101
+ // Helper to create a perp new order report buffer
102
+ function createPerpNewOrderBuffer(side, perps, crncy) {
103
+ const buffer = Buffer.alloc(logs_models_1.PerpNewOrderReportModel.LENGTH);
104
+ buffer.writeUInt8(logs_models_1.LogType.perpNewOrder, 0); // tag
105
+ buffer.writeUInt8(side, 1);
106
+ buffer.writeUInt16LE(0, 2); // padding
107
+ buffer.writeUInt32LE(0, 4); // padding
108
+ buffer.writeBigInt64LE(perps, 8);
109
+ buffer.writeBigInt64LE(crncy, 16);
110
+ return buffer;
111
+ }
112
+ function createPerpDepositBuffer(clientId, instrId, time, amount) {
113
+ const buffer = Buffer.alloc(logs_models_1.PerpDepositReportModel.LENGTH);
114
+ buffer.writeUInt8(logs_models_1.LogType.perpDeposit, 0);
115
+ buffer.writeUInt8(0, 1);
116
+ buffer.writeUInt16LE(0, 2);
117
+ buffer.writeUInt32LE(clientId, 4);
118
+ buffer.writeUInt32LE(instrId, 8);
119
+ buffer.writeUInt32LE(time, 12);
120
+ buffer.writeBigInt64LE(amount, 16);
121
+ return buffer;
122
+ }
123
+ function createPerpWithdrawBuffer(clientId, instrId, time, amount) {
124
+ const buffer = Buffer.alloc(logs_models_1.PerpWithdrawReportModel.LENGTH);
125
+ buffer.writeUInt8(logs_models_1.LogType.perpWithdraw, 0);
126
+ buffer.writeUInt8(0, 1);
127
+ buffer.writeUInt16LE(0, 2);
128
+ buffer.writeUInt32LE(clientId, 4);
129
+ buffer.writeUInt32LE(instrId, 8);
130
+ buffer.writeUInt32LE(time, 12);
131
+ buffer.writeBigInt64LE(amount, 16);
132
+ return buffer;
133
+ }
134
+ function createFeesDepositBuffer(clientId, tokenId, time, amount) {
135
+ const buffer = Buffer.alloc(logs_models_1.FeesDepositReportModel.LENGTH);
136
+ buffer.writeUInt8(logs_models_1.LogType.feesDeposit, 0);
137
+ buffer.writeUInt8(0, 1);
138
+ buffer.writeUInt16LE(0, 2);
139
+ buffer.writeUInt32LE(clientId, 4);
140
+ buffer.writeUInt32LE(tokenId, 8);
141
+ buffer.writeUInt32LE(time, 12);
142
+ buffer.writeBigInt64LE(amount, 16);
143
+ return buffer;
144
+ }
145
+ function createFeesWithdrawBuffer(clientId, tokenId, time, amount) {
146
+ const buffer = Buffer.alloc(logs_models_1.FeesWithdrawReportModel.LENGTH);
147
+ buffer.writeUInt8(logs_models_1.LogType.feesWithdraw, 0);
148
+ buffer.writeUInt8(0, 1);
149
+ buffer.writeUInt16LE(0, 2);
150
+ buffer.writeUInt32LE(clientId, 4);
151
+ buffer.writeUInt32LE(tokenId, 8);
152
+ buffer.writeUInt32LE(time, 12);
153
+ buffer.writeBigInt64LE(amount, 16);
154
+ return buffer;
155
+ }
156
+ function createSpotOrderCancelBuffer(side, clientId, instrId, time, orderId, qty, crncy) {
157
+ const buffer = Buffer.alloc(logs_models_1.SpotOrderCancelReportModel.LENGTH);
158
+ buffer.writeUInt8(logs_models_1.LogType.spotOrderCancel, 0);
159
+ buffer.writeUInt8(side, 1);
160
+ buffer.writeUInt16LE(0, 2);
161
+ buffer.writeUInt32LE(clientId, 4);
162
+ buffer.writeUInt32LE(instrId, 8);
163
+ buffer.writeUInt32LE(time, 12);
164
+ buffer.writeBigInt64LE(orderId, 16);
165
+ buffer.writeBigInt64LE(qty, 24);
166
+ buffer.writeBigInt64LE(crncy, 32);
167
+ return buffer;
168
+ }
169
+ function createSpotFeesBuffer(refClientId, fees, refPayment) {
170
+ const buffer = Buffer.alloc(logs_models_1.SpotFeesReportModel.LENGTH);
171
+ buffer.writeUInt8(logs_models_1.LogType.spotFees, 0);
172
+ buffer.writeUInt8(0, 1);
173
+ buffer.writeUInt16LE(0, 2);
174
+ buffer.writeUInt32LE(refClientId, 4);
175
+ buffer.writeBigInt64LE(fees, 8);
176
+ buffer.writeBigInt64LE(refPayment, 16);
177
+ return buffer;
178
+ }
179
+ function createPerpOrderCancelBuffer(side, clientId, instrId, time, orderId, perps, crncy) {
180
+ const buffer = Buffer.alloc(logs_models_1.PerpOrderCancelReportModel.LENGTH);
181
+ buffer.writeUInt8(logs_models_1.LogType.perpOrderCancel, 0);
182
+ buffer.writeUInt8(side, 1);
183
+ buffer.writeUInt16LE(0, 2);
184
+ buffer.writeUInt32LE(clientId, 4);
185
+ buffer.writeUInt32LE(instrId, 8);
186
+ buffer.writeUInt32LE(time, 12);
187
+ buffer.writeBigInt64LE(orderId, 16);
188
+ buffer.writeBigInt64LE(perps, 24);
189
+ buffer.writeBigInt64LE(crncy, 32);
190
+ return buffer;
191
+ }
192
+ function createPerpFeesBuffer(refClientId, fees, refPayment) {
193
+ const buffer = Buffer.alloc(logs_models_1.PerpFeesReportModel.LENGTH);
194
+ buffer.writeUInt8(logs_models_1.LogType.perpFees, 0);
195
+ buffer.writeUInt8(0, 1);
196
+ buffer.writeUInt16LE(0, 2);
197
+ buffer.writeUInt32LE(refClientId, 4);
198
+ buffer.writeBigInt64LE(fees, 8);
199
+ buffer.writeBigInt64LE(refPayment, 16);
200
+ return buffer;
201
+ }
202
+ function createPerpFundingBuffer(clientId, instrId, time, funding) {
203
+ const buffer = Buffer.alloc(logs_models_1.PerpFundingReportModel.LENGTH);
204
+ buffer.writeUInt8(logs_models_1.LogType.perpFunding, 0);
205
+ buffer.writeUInt8(0, 1);
206
+ buffer.writeUInt16LE(0, 2);
207
+ buffer.writeUInt32LE(clientId, 4);
208
+ buffer.writeUInt32LE(instrId, 8);
209
+ buffer.writeUInt32LE(time, 12);
210
+ buffer.writeBigInt64LE(funding, 16);
211
+ return buffer;
212
+ }
213
+ function createPerpChangeLeverageBuffer(leverage, clientId, instrId, time) {
214
+ const buffer = Buffer.alloc(logs_models_1.PerpChangeLeverageReportModel.LENGTH);
215
+ buffer.writeUInt8(logs_models_1.LogType.perpChangeLeverage, 0);
216
+ buffer.writeUInt8(leverage, 1);
217
+ buffer.writeUInt16LE(0, 2);
218
+ buffer.writeUInt32LE(clientId, 4);
219
+ buffer.writeUInt32LE(instrId, 8);
220
+ buffer.writeUInt32LE(time, 12);
221
+ return buffer;
222
+ }
223
+ function createSpotFillOrderBuffer(side, clientId, orderId, qty, crncy, price, rebates) {
224
+ const buffer = Buffer.alloc(logs_models_1.SpotFillOrderReportModel.LENGTH);
225
+ buffer.writeUInt8(logs_models_1.LogType.spotFillOrder, 0);
226
+ buffer.writeUInt8(side, 1);
227
+ buffer.writeUInt16LE(0, 2);
228
+ buffer.writeUInt32LE(clientId, 4);
229
+ buffer.writeBigInt64LE(orderId, 8);
230
+ buffer.writeBigInt64LE(qty, 16);
231
+ buffer.writeBigInt64LE(crncy, 24);
232
+ buffer.writeBigInt64LE(price, 32);
233
+ buffer.writeBigInt64LE(rebates, 40);
234
+ return buffer;
235
+ }
236
+ function createPerpFillOrderBuffer(side, clientId, orderId, perps, crncy, price, rebates) {
237
+ const buffer = Buffer.alloc(logs_models_1.PerpFillOrderReportModel.LENGTH);
238
+ buffer.writeUInt8(logs_models_1.LogType.perpFillOrder, 0);
239
+ buffer.writeUInt8(side, 1);
240
+ buffer.writeUInt16LE(0, 2);
241
+ buffer.writeUInt32LE(clientId, 4);
242
+ buffer.writeBigInt64LE(orderId, 8);
243
+ buffer.writeBigInt64LE(perps, 16);
244
+ buffer.writeBigInt64LE(crncy, 24);
245
+ buffer.writeBigInt64LE(price, 32);
246
+ buffer.writeBigInt64LE(rebates, 40);
247
+ return buffer;
248
+ }
249
+ function createSpotPlaceMassCancelBuffer(clientId, instrId, time) {
250
+ const buffer = Buffer.alloc(logs_models_1.SpotPlaceMassCancelReportModel.LENGTH);
251
+ buffer.writeUInt8(logs_models_1.LogType.spotPlaceMassCancel, 0);
252
+ buffer.writeUInt8(0, 1);
253
+ buffer.writeUInt16LE(0, 2);
254
+ buffer.writeUInt32LE(clientId, 4);
255
+ buffer.writeUInt32LE(instrId, 8);
256
+ buffer.writeUInt32LE(time, 12);
257
+ return buffer;
258
+ }
259
+ function createPerpPlaceMassCancelBuffer(clientId, instrId, time) {
260
+ const buffer = Buffer.alloc(logs_models_1.PerpPlaceMassCancelReportModel.LENGTH);
261
+ buffer.writeUInt8(logs_models_1.LogType.perpPlaceMassCancel, 0);
262
+ buffer.writeUInt8(0, 1);
263
+ buffer.writeUInt16LE(0, 2);
264
+ buffer.writeUInt32LE(clientId, 4);
265
+ buffer.writeUInt32LE(instrId, 8);
266
+ buffer.writeUInt32LE(time, 12);
267
+ return buffer;
268
+ }
269
+ function createEarningsBuffer(clientId, tokenId, time, amount) {
270
+ const buffer = Buffer.alloc(logs_models_1.EarningsReportModel.LENGTH);
271
+ buffer.writeUInt8(logs_models_1.LogType.earnings, 0);
272
+ buffer.writeUInt8(0, 1);
273
+ buffer.writeUInt16LE(0, 2);
274
+ buffer.writeUInt32LE(clientId, 4);
275
+ buffer.writeUInt32LE(tokenId, 8);
276
+ buffer.writeUInt32LE(time, 12);
277
+ buffer.writeBigInt64LE(amount, 16);
278
+ return buffer;
279
+ }
280
+ function createSpotOrderRevokeBuffer(side, clientId, orderId, qty, crncy) {
281
+ const buffer = Buffer.alloc(logs_models_1.SpotOrderRevokeReportModel.LENGTH);
282
+ buffer.writeUInt8(logs_models_1.LogType.spotOrderRevoke, 0);
283
+ buffer.writeUInt8(side, 1);
284
+ buffer.writeUInt16LE(0, 2);
285
+ buffer.writeUInt32LE(clientId, 4);
286
+ buffer.writeBigInt64LE(orderId, 8);
287
+ buffer.writeBigInt64LE(qty, 16);
288
+ buffer.writeBigInt64LE(crncy, 24);
289
+ return buffer;
290
+ }
291
+ function createPerpOrderRevokeBuffer(side, clientId, orderId, perps, crncy) {
292
+ const buffer = Buffer.alloc(logs_models_1.PerpOrderRevokeReportModel.LENGTH);
293
+ buffer.writeUInt8(logs_models_1.LogType.perpOrderRevoke, 0);
294
+ buffer.writeUInt8(side, 1);
295
+ buffer.writeUInt16LE(0, 2);
296
+ buffer.writeUInt32LE(clientId, 4);
297
+ buffer.writeBigInt64LE(orderId, 8);
298
+ buffer.writeBigInt64LE(perps, 16);
299
+ buffer.writeBigInt64LE(crncy, 24);
300
+ return buffer;
301
+ }
302
+ function toLogString(buffer) {
303
+ const arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
304
+ return `Program data: ${(0, base64_arraybuffer_1.encode)(arrayBuffer)}`;
305
+ }
306
+ (0, vitest_1.describe)('decodeTransactionLogs', () => {
307
+ (0, vitest_1.describe)('error handling', () => {
308
+ (0, vitest_1.it)('returns empty array for error logs starting with "Program returned error"', () => {
309
+ const ctx = createTestContext();
310
+ const logs = ['Program returned error: insufficient funds'];
311
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
312
+ (0, vitest_1.expect)(result).toEqual([]);
313
+ });
314
+ (0, vitest_1.it)('returns empty array for error logs starting with "Program logged: Error"', () => {
315
+ const ctx = createTestContext();
316
+ const logs = ['Program logged: "Error: some error"'];
317
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
318
+ (0, vitest_1.expect)(result).toEqual([]);
319
+ });
320
+ (0, vitest_1.it)('returns empty array when error appears mid-stream', () => {
321
+ const ctx = createTestContext();
322
+ const logs = ['Program invoke', 'Program returned error: insufficient funds', 'Program data: AQAAAA=='];
323
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
324
+ (0, vitest_1.expect)(result).toEqual([]);
325
+ });
326
+ });
327
+ (0, vitest_1.describe)('log filtering', () => {
328
+ (0, vitest_1.it)('returns empty array for empty log array', () => {
329
+ const ctx = createTestContext();
330
+ const result = (0, logs_decoder_1.decodeTransactionLogs)([], ctx);
331
+ (0, vitest_1.expect)(result).toEqual([]);
332
+ });
333
+ (0, vitest_1.it)('ignores logs that do not start with "Program data: "', () => {
334
+ const ctx = createTestContext();
335
+ const logs = ['Program invoke', 'Program success', 'Some other log'];
336
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
337
+ (0, vitest_1.expect)(result).toEqual([]);
338
+ });
339
+ (0, vitest_1.it)('processes only "Program data: " prefixed logs', () => {
340
+ const ctx = createTestContext();
341
+ // A log with unknown type byte (0xFF) should not be added
342
+ const logs = [
343
+ 'Program invoke',
344
+ 'Program data: /w==', // 0xFF - unknown type
345
+ 'Program success',
346
+ ];
347
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
348
+ (0, vitest_1.expect)(result).toEqual([]);
349
+ });
350
+ });
351
+ (0, vitest_1.describe)('context usage', () => {
352
+ (0, vitest_1.it)('uses uiNumbers=false to skip decimal conversion', () => {
353
+ const ctx = createTestContext({ uiNumbers: false });
354
+ // Even with valid deposit data, if uiNumbers is false, amounts stay raw
355
+ // This is tested implicitly through the module behavior
356
+ (0, vitest_1.expect)(ctx.uiNumbers).toBe(false);
357
+ });
358
+ (0, vitest_1.it)('uses instruments map for token lookups', () => {
359
+ const instruments = new Map();
360
+ const header = new structure_models_1.InstrAccountHeaderModel();
361
+ header.instrId = 1;
362
+ header.assetTokenId = 0;
363
+ header.crncyTokenId = 1;
364
+ instruments.set(1, {
365
+ address: 'test',
366
+ header,
367
+ spotBids: [],
368
+ spotAsks: [],
369
+ perpBids: [],
370
+ perpAsks: [],
371
+ });
372
+ const ctx = createTestContext({ instruments });
373
+ (0, vitest_1.expect)(ctx.instruments.size).toBe(1);
374
+ });
375
+ (0, vitest_1.it)('uses tokens map for decimal calculations', () => {
376
+ const tokens = new Map();
377
+ const token = new structure_models_1.TokenStateModel();
378
+ token.id = 0;
379
+ token.mask = 9; // 10^9 decimals
380
+ tokens.set(0, token);
381
+ const ctx = createTestContext({ tokens });
382
+ (0, vitest_1.expect)(ctx.tokens.size).toBe(1);
383
+ });
384
+ });
385
+ (0, vitest_1.describe)('deposit log decoding', () => {
386
+ (0, vitest_1.it)('decodes deposit log without uiNumbers conversion', () => {
387
+ const tokens = new Map();
388
+ tokens.set(1, createMockToken(1, 9));
389
+ const ctx = createTestContext({ tokens, uiNumbers: false });
390
+ const depositBuffer = createDepositBuffer(100, 1, 1700000000, BigInt(5000000000));
391
+ const logs = [toLogString(depositBuffer)];
392
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
393
+ (0, vitest_1.expect)(result).toHaveLength(1);
394
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.DepositReportModel);
395
+ const deposit = result[0];
396
+ (0, vitest_1.expect)(deposit.tag).toBe(logs_models_1.LogType.deposit);
397
+ (0, vitest_1.expect)(deposit.clientId).toBe(100);
398
+ (0, vitest_1.expect)(deposit.tokenId).toBe(1);
399
+ (0, vitest_1.expect)(deposit.time).toBe(1700000000);
400
+ (0, vitest_1.expect)(deposit.amount).toBe(5000000000);
401
+ });
402
+ (0, vitest_1.it)('decodes deposit log with uiNumbers conversion', () => {
403
+ const tokens = new Map();
404
+ tokens.set(1, createMockToken(1, 9));
405
+ const ctx = createTestContext({ tokens, uiNumbers: true });
406
+ // 5 * 10^9 raw = 5 UI
407
+ const depositBuffer = createDepositBuffer(100, 1, 1700000000, BigInt(5000000000));
408
+ const logs = [toLogString(depositBuffer)];
409
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
410
+ (0, vitest_1.expect)(result).toHaveLength(1);
411
+ const deposit = result[0];
412
+ (0, vitest_1.expect)(deposit.amount).toBe(5); // Converted to UI number
413
+ });
414
+ (0, vitest_1.it)('handles deposit log with unknown token (no conversion)', () => {
415
+ const ctx = createTestContext({ uiNumbers: true });
416
+ const depositBuffer = createDepositBuffer(100, 99, 1700000000, BigInt(5000000000));
417
+ const logs = [toLogString(depositBuffer)];
418
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
419
+ (0, vitest_1.expect)(result).toHaveLength(1);
420
+ const deposit = result[0];
421
+ (0, vitest_1.expect)(deposit.amount).toBe(5000000000); // No conversion if token not found
422
+ });
423
+ });
424
+ (0, vitest_1.describe)('withdraw log decoding', () => {
425
+ (0, vitest_1.it)('decodes withdraw log without uiNumbers conversion', () => {
426
+ const tokens = new Map();
427
+ tokens.set(1, createMockToken(1, 6));
428
+ const ctx = createTestContext({ tokens, uiNumbers: false });
429
+ const withdrawBuffer = createWithdrawBuffer(200, 1, 1700000001, BigInt(2500000));
430
+ const logs = [toLogString(withdrawBuffer)];
431
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
432
+ (0, vitest_1.expect)(result).toHaveLength(1);
433
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.WithdrawReportModel);
434
+ const withdraw = result[0];
435
+ (0, vitest_1.expect)(withdraw.tag).toBe(logs_models_1.LogType.withdraw);
436
+ (0, vitest_1.expect)(withdraw.clientId).toBe(200);
437
+ (0, vitest_1.expect)(withdraw.tokenId).toBe(1);
438
+ (0, vitest_1.expect)(withdraw.time).toBe(1700000001);
439
+ (0, vitest_1.expect)(withdraw.amount).toBe(2500000);
440
+ });
441
+ (0, vitest_1.it)('decodes withdraw log with uiNumbers conversion', () => {
442
+ const tokens = new Map();
443
+ tokens.set(1, createMockToken(1, 6)); // 6 decimals
444
+ const ctx = createTestContext({ tokens, uiNumbers: true });
445
+ // 2.5 * 10^6 raw = 2.5 UI
446
+ const withdrawBuffer = createWithdrawBuffer(200, 1, 1700000001, BigInt(2500000));
447
+ const logs = [toLogString(withdrawBuffer)];
448
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
449
+ (0, vitest_1.expect)(result).toHaveLength(1);
450
+ const withdraw = result[0];
451
+ (0, vitest_1.expect)(withdraw.amount).toBe(2.5); // Converted to UI number
452
+ });
453
+ });
454
+ (0, vitest_1.describe)('spot order log decoding', () => {
455
+ (0, vitest_1.it)('decodes spot place order log', () => {
456
+ const tokens = new Map();
457
+ tokens.set(0, createMockToken(0, 9));
458
+ tokens.set(1, createMockToken(1, 9));
459
+ const instruments = new Map();
460
+ instruments.set(1, createMockInstrument(1, 1, 0));
461
+ const ctx = createTestContext({ tokens, instruments, uiNumbers: true });
462
+ // qty = 1 * 10^9, price = 100 * 10^9
463
+ const orderBuffer = createSpotPlaceOrderBuffer(0, 1, 0, 100, BigInt(12345), BigInt(1000000000), BigInt(100000000000), 1, 1700000002);
464
+ const logs = [toLogString(orderBuffer)];
465
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
466
+ (0, vitest_1.expect)(result).toHaveLength(1);
467
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.SpotPlaceOrderReportModel);
468
+ const order = result[0];
469
+ (0, vitest_1.expect)(order.tag).toBe(logs_models_1.LogType.spotPlaceOrder);
470
+ (0, vitest_1.expect)(order.clientId).toBe(100);
471
+ (0, vitest_1.expect)(order.orderId).toBe(12345);
472
+ (0, vitest_1.expect)(order.instrId).toBe(1);
473
+ (0, vitest_1.expect)(order.side).toBe(1);
474
+ (0, vitest_1.expect)(order.qty).toBe(1); // Converted from 10^9
475
+ (0, vitest_1.expect)(order.price).toBe(100); // Converted from 10^9
476
+ });
477
+ (0, vitest_1.it)('decodes spot new order log', () => {
478
+ const ctx = createTestContext({ uiNumbers: false });
479
+ const orderBuffer = createSpotNewOrderBuffer(0, BigInt(500000000), BigInt(50000000));
480
+ const logs = [toLogString(orderBuffer)];
481
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
482
+ (0, vitest_1.expect)(result).toHaveLength(1);
483
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.SpotNewOrderReportModel);
484
+ const order = result[0];
485
+ (0, vitest_1.expect)(order.tag).toBe(logs_models_1.LogType.spotNewOrder);
486
+ (0, vitest_1.expect)(order.side).toBe(0);
487
+ (0, vitest_1.expect)(order.qty).toBe(500000000);
488
+ (0, vitest_1.expect)(order.crncy).toBe(50000000);
489
+ });
490
+ });
491
+ (0, vitest_1.describe)('perp order log decoding', () => {
492
+ (0, vitest_1.it)('decodes perp place order log', () => {
493
+ const tokens = new Map();
494
+ tokens.set(0, createMockToken(0, 9));
495
+ tokens.set(1, createMockToken(1, 9));
496
+ const instruments = new Map();
497
+ instruments.set(1, createMockInstrument(1, 1, 0));
498
+ const ctx = createTestContext({ tokens, instruments, uiNumbers: true });
499
+ // perps = 2 * 10^9, price = 150 * 10^9
500
+ const orderBuffer = createPerpPlaceOrderBuffer(1, 0, 1, 300, BigInt(67890), BigInt(2000000000), BigInt(150000000000), 1, 5, 1700000003);
501
+ const logs = [toLogString(orderBuffer)];
502
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
503
+ (0, vitest_1.expect)(result).toHaveLength(1);
504
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.PerpPlaceOrderReportModel);
505
+ const order = result[0];
506
+ (0, vitest_1.expect)(order.tag).toBe(logs_models_1.LogType.perpPlaceOrder);
507
+ (0, vitest_1.expect)(order.clientId).toBe(300);
508
+ (0, vitest_1.expect)(order.orderId).toBe(67890);
509
+ (0, vitest_1.expect)(order.instrId).toBe(1);
510
+ (0, vitest_1.expect)(order.side).toBe(0);
511
+ (0, vitest_1.expect)(order.ioc).toBe(1);
512
+ (0, vitest_1.expect)(order.leverage).toBe(5);
513
+ (0, vitest_1.expect)(order.perps).toBe(2); // Converted from 10^9
514
+ (0, vitest_1.expect)(order.price).toBe(150); // Converted from 10^9
515
+ });
516
+ (0, vitest_1.it)('decodes perp new order log', () => {
517
+ const ctx = createTestContext({ uiNumbers: false });
518
+ const orderBuffer = createPerpNewOrderBuffer(1, BigInt(750000000), BigInt(112500000));
519
+ const logs = [toLogString(orderBuffer)];
520
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
521
+ (0, vitest_1.expect)(result).toHaveLength(1);
522
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.PerpNewOrderReportModel);
523
+ const order = result[0];
524
+ (0, vitest_1.expect)(order.tag).toBe(logs_models_1.LogType.perpNewOrder);
525
+ (0, vitest_1.expect)(order.side).toBe(1);
526
+ (0, vitest_1.expect)(order.perps).toBe(750000000);
527
+ (0, vitest_1.expect)(order.crncy).toBe(112500000);
528
+ });
529
+ });
530
+ (0, vitest_1.describe)('multiple logs decoding', () => {
531
+ (0, vitest_1.it)('decodes multiple logs in sequence', () => {
532
+ const tokens = new Map();
533
+ tokens.set(1, createMockToken(1, 9));
534
+ const ctx = createTestContext({ tokens, uiNumbers: false });
535
+ const depositBuffer = createDepositBuffer(100, 1, 1700000000, BigInt(5000000000));
536
+ const withdrawBuffer = createWithdrawBuffer(100, 1, 1700000001, BigInt(2000000000));
537
+ const logs = [
538
+ 'Program invoke',
539
+ toLogString(depositBuffer),
540
+ 'Program success',
541
+ toLogString(withdrawBuffer),
542
+ 'Program complete',
543
+ ];
544
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
545
+ (0, vitest_1.expect)(result).toHaveLength(2);
546
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.DepositReportModel);
547
+ (0, vitest_1.expect)(result[1]).toBeInstanceOf(logs_models_1.WithdrawReportModel);
548
+ });
549
+ (0, vitest_1.it)('ignores unknown log types', () => {
550
+ const ctx = createTestContext({ uiNumbers: false });
551
+ // Create a buffer with unknown type (0xFF)
552
+ const unknownBuffer = Buffer.alloc(24);
553
+ unknownBuffer.writeUInt8(0xff, 0); // Unknown type
554
+ const depositBuffer = createDepositBuffer(100, 1, 1700000000, BigInt(5000000000));
555
+ const logs = [toLogString(unknownBuffer), toLogString(depositBuffer)];
556
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
557
+ (0, vitest_1.expect)(result).toHaveLength(1);
558
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.DepositReportModel);
559
+ });
560
+ (0, vitest_1.it)('ignores logs with incorrect length', () => {
561
+ const ctx = createTestContext({ uiNumbers: false });
562
+ // Create a buffer with correct type but wrong length
563
+ const shortBuffer = Buffer.alloc(10);
564
+ shortBuffer.writeUInt8(logs_models_1.LogType.deposit, 0);
565
+ const depositBuffer = createDepositBuffer(100, 1, 1700000000, BigInt(5000000000));
566
+ const logs = [toLogString(shortBuffer), toLogString(depositBuffer)];
567
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
568
+ (0, vitest_1.expect)(result).toHaveLength(1);
569
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.DepositReportModel);
570
+ });
571
+ });
572
+ (0, vitest_1.describe)('perp deposit/withdraw log decoding', () => {
573
+ (0, vitest_1.it)('decodes perp deposit log', () => {
574
+ const tokens = new Map();
575
+ tokens.set(0, createMockToken(0, 9));
576
+ const instruments = new Map();
577
+ instruments.set(1, createMockInstrument(1, 1, 0));
578
+ const ctx = createTestContext({ tokens, instruments, uiNumbers: true });
579
+ const buffer = createPerpDepositBuffer(100, 1, 1700000000, BigInt(3000000000));
580
+ const logs = [toLogString(buffer)];
581
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
582
+ (0, vitest_1.expect)(result).toHaveLength(1);
583
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.PerpDepositReportModel);
584
+ const report = result[0];
585
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.perpDeposit);
586
+ (0, vitest_1.expect)(report.clientId).toBe(100);
587
+ (0, vitest_1.expect)(report.instrId).toBe(1);
588
+ (0, vitest_1.expect)(report.amount).toBe(3); // Converted
589
+ });
590
+ (0, vitest_1.it)('decodes perp withdraw log', () => {
591
+ const tokens = new Map();
592
+ tokens.set(0, createMockToken(0, 9));
593
+ const instruments = new Map();
594
+ instruments.set(1, createMockInstrument(1, 1, 0));
595
+ const ctx = createTestContext({ tokens, instruments, uiNumbers: true });
596
+ const buffer = createPerpWithdrawBuffer(100, 1, 1700000000, BigInt(2000000000));
597
+ const logs = [toLogString(buffer)];
598
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
599
+ (0, vitest_1.expect)(result).toHaveLength(1);
600
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.PerpWithdrawReportModel);
601
+ const report = result[0];
602
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.perpWithdraw);
603
+ (0, vitest_1.expect)(report.amount).toBe(2);
604
+ });
605
+ });
606
+ (0, vitest_1.describe)('fees log decoding', () => {
607
+ (0, vitest_1.it)('decodes fees deposit log', () => {
608
+ const tokens = new Map();
609
+ tokens.set(1, createMockToken(1, 6));
610
+ const ctx = createTestContext({ tokens, uiNumbers: true });
611
+ const buffer = createFeesDepositBuffer(100, 1, 1700000000, BigInt(1500000));
612
+ const logs = [toLogString(buffer)];
613
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
614
+ (0, vitest_1.expect)(result).toHaveLength(1);
615
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.FeesDepositReportModel);
616
+ const report = result[0];
617
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.feesDeposit);
618
+ (0, vitest_1.expect)(report.amount).toBe(1.5);
619
+ });
620
+ (0, vitest_1.it)('decodes fees withdraw log', () => {
621
+ const tokens = new Map();
622
+ tokens.set(1, createMockToken(1, 6));
623
+ const ctx = createTestContext({ tokens, uiNumbers: true });
624
+ const buffer = createFeesWithdrawBuffer(100, 1, 1700000000, BigInt(2500000));
625
+ const logs = [toLogString(buffer)];
626
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
627
+ (0, vitest_1.expect)(result).toHaveLength(1);
628
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.FeesWithdrawReportModel);
629
+ const report = result[0];
630
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.feesWithdraw);
631
+ (0, vitest_1.expect)(report.amount).toBe(2.5);
632
+ });
633
+ (0, vitest_1.it)('decodes spot fees log', () => {
634
+ const ctx = createTestContext({ uiNumbers: false });
635
+ const buffer = createSpotFeesBuffer(200, BigInt(100000), BigInt(10000));
636
+ const logs = [toLogString(buffer)];
637
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
638
+ (0, vitest_1.expect)(result).toHaveLength(1);
639
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.SpotFeesReportModel);
640
+ const report = result[0];
641
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.spotFees);
642
+ (0, vitest_1.expect)(report.refClientId).toBe(200);
643
+ (0, vitest_1.expect)(report.fees).toBe(100000);
644
+ (0, vitest_1.expect)(report.refPayment).toBe(10000);
645
+ });
646
+ (0, vitest_1.it)('decodes perp fees log', () => {
647
+ const ctx = createTestContext({ uiNumbers: false });
648
+ const buffer = createPerpFeesBuffer(300, BigInt(200000), BigInt(20000));
649
+ const logs = [toLogString(buffer)];
650
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
651
+ (0, vitest_1.expect)(result).toHaveLength(1);
652
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.PerpFeesReportModel);
653
+ const report = result[0];
654
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.perpFees);
655
+ (0, vitest_1.expect)(report.refClientId).toBe(300);
656
+ (0, vitest_1.expect)(report.fees).toBe(200000);
657
+ (0, vitest_1.expect)(report.refPayment).toBe(20000);
658
+ });
659
+ });
660
+ (0, vitest_1.describe)('order cancel log decoding', () => {
661
+ (0, vitest_1.it)('decodes spot order cancel log', () => {
662
+ const tokens = new Map();
663
+ tokens.set(0, createMockToken(0, 9));
664
+ tokens.set(1, createMockToken(1, 9));
665
+ const instruments = new Map();
666
+ instruments.set(1, createMockInstrument(1, 1, 0));
667
+ const ctx = createTestContext({ tokens, instruments, uiNumbers: true });
668
+ const buffer = createSpotOrderCancelBuffer(0, 100, 1, 1700000000, BigInt(12345), BigInt(1000000000), BigInt(500000000));
669
+ const logs = [toLogString(buffer)];
670
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
671
+ (0, vitest_1.expect)(result).toHaveLength(1);
672
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.SpotOrderCancelReportModel);
673
+ const report = result[0];
674
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.spotOrderCancel);
675
+ (0, vitest_1.expect)(report.side).toBe(0);
676
+ (0, vitest_1.expect)(report.orderId).toBe(12345);
677
+ (0, vitest_1.expect)(report.qty).toBe(1);
678
+ (0, vitest_1.expect)(report.crncy).toBe(0.5);
679
+ });
680
+ (0, vitest_1.it)('decodes perp order cancel log', () => {
681
+ const tokens = new Map();
682
+ tokens.set(0, createMockToken(0, 9));
683
+ tokens.set(1, createMockToken(1, 9));
684
+ const instruments = new Map();
685
+ instruments.set(1, createMockInstrument(1, 1, 0));
686
+ const ctx = createTestContext({ tokens, instruments, uiNumbers: true });
687
+ const buffer = createPerpOrderCancelBuffer(1, 100, 1, 1700000000, BigInt(67890), BigInt(2000000000), BigInt(1000000000));
688
+ const logs = [toLogString(buffer)];
689
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
690
+ (0, vitest_1.expect)(result).toHaveLength(1);
691
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.PerpOrderCancelReportModel);
692
+ const report = result[0];
693
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.perpOrderCancel);
694
+ (0, vitest_1.expect)(report.side).toBe(1);
695
+ (0, vitest_1.expect)(report.orderId).toBe(67890);
696
+ (0, vitest_1.expect)(report.perps).toBe(2);
697
+ (0, vitest_1.expect)(report.crncy).toBe(1);
698
+ });
699
+ });
700
+ (0, vitest_1.describe)('fill order log decoding', () => {
701
+ (0, vitest_1.it)('decodes spot fill order log', () => {
702
+ const ctx = createTestContext({ uiNumbers: false });
703
+ const buffer = createSpotFillOrderBuffer(0, 100, BigInt(11111), BigInt(500000000), BigInt(50000000), BigInt(100000000000), BigInt(1000));
704
+ const logs = [toLogString(buffer)];
705
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
706
+ (0, vitest_1.expect)(result).toHaveLength(1);
707
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.SpotFillOrderReportModel);
708
+ const report = result[0];
709
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.spotFillOrder);
710
+ (0, vitest_1.expect)(report.side).toBe(0);
711
+ (0, vitest_1.expect)(report.clientId).toBe(100);
712
+ (0, vitest_1.expect)(report.orderId).toBe(11111);
713
+ (0, vitest_1.expect)(report.qty).toBe(500000000);
714
+ (0, vitest_1.expect)(report.rebates).toBe(1000);
715
+ });
716
+ (0, vitest_1.it)('decodes perp fill order log', () => {
717
+ const ctx = createTestContext({ uiNumbers: false });
718
+ const buffer = createPerpFillOrderBuffer(1, 200, BigInt(22222), BigInt(750000000), BigInt(75000000), BigInt(150000000000), BigInt(2000));
719
+ const logs = [toLogString(buffer)];
720
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
721
+ (0, vitest_1.expect)(result).toHaveLength(1);
722
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.PerpFillOrderReportModel);
723
+ const report = result[0];
724
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.perpFillOrder);
725
+ (0, vitest_1.expect)(report.side).toBe(1);
726
+ (0, vitest_1.expect)(report.clientId).toBe(200);
727
+ (0, vitest_1.expect)(report.orderId).toBe(22222);
728
+ (0, vitest_1.expect)(report.perps).toBe(750000000);
729
+ (0, vitest_1.expect)(report.rebates).toBe(2000);
730
+ });
731
+ });
732
+ (0, vitest_1.describe)('perp specific log decoding', () => {
733
+ (0, vitest_1.it)('decodes perp funding log', () => {
734
+ const ctx = createTestContext({ uiNumbers: false });
735
+ const buffer = createPerpFundingBuffer(100, 1, 1700000000, BigInt(50000));
736
+ const logs = [toLogString(buffer)];
737
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
738
+ (0, vitest_1.expect)(result).toHaveLength(1);
739
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.PerpFundingReportModel);
740
+ const report = result[0];
741
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.perpFunding);
742
+ (0, vitest_1.expect)(report.clientId).toBe(100);
743
+ (0, vitest_1.expect)(report.instrId).toBe(1);
744
+ (0, vitest_1.expect)(report.funding).toBe(50000);
745
+ });
746
+ (0, vitest_1.it)('decodes perp change leverage log', () => {
747
+ const ctx = createTestContext({ uiNumbers: false });
748
+ const buffer = createPerpChangeLeverageBuffer(10, 100, 1, 1700000000);
749
+ const logs = [toLogString(buffer)];
750
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
751
+ (0, vitest_1.expect)(result).toHaveLength(1);
752
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.PerpChangeLeverageReportModel);
753
+ const report = result[0];
754
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.perpChangeLeverage);
755
+ (0, vitest_1.expect)(report.leverage).toBe(10);
756
+ (0, vitest_1.expect)(report.clientId).toBe(100);
757
+ (0, vitest_1.expect)(report.instrId).toBe(1);
758
+ });
759
+ });
760
+ (0, vitest_1.describe)('mass cancel log decoding', () => {
761
+ (0, vitest_1.it)('decodes spot place mass cancel log', () => {
762
+ const tokens = new Map();
763
+ tokens.set(0, createMockToken(0, 9));
764
+ tokens.set(1, createMockToken(1, 9));
765
+ const instruments = new Map();
766
+ instruments.set(1, createMockInstrument(1, 1, 0));
767
+ const ctx = createTestContext({ tokens, instruments, uiNumbers: true });
768
+ const buffer = createSpotPlaceMassCancelBuffer(100, 1, 1700000000);
769
+ const logs = [toLogString(buffer)];
770
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
771
+ (0, vitest_1.expect)(result).toHaveLength(1);
772
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.SpotPlaceMassCancelReportModel);
773
+ const report = result[0];
774
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.spotPlaceMassCancel);
775
+ (0, vitest_1.expect)(report.clientId).toBe(100);
776
+ (0, vitest_1.expect)(report.instrId).toBe(1);
777
+ });
778
+ (0, vitest_1.it)('decodes perp place mass cancel log', () => {
779
+ const ctx = createTestContext({ uiNumbers: false });
780
+ const buffer = createPerpPlaceMassCancelBuffer(200, 2, 1700000001);
781
+ const logs = [toLogString(buffer)];
782
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
783
+ (0, vitest_1.expect)(result).toHaveLength(1);
784
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.PerpPlaceMassCancelReportModel);
785
+ const report = result[0];
786
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.perpPlaceMassCancel);
787
+ (0, vitest_1.expect)(report.clientId).toBe(200);
788
+ (0, vitest_1.expect)(report.instrId).toBe(2);
789
+ });
790
+ });
791
+ (0, vitest_1.describe)('order revoke log decoding', () => {
792
+ (0, vitest_1.it)('decodes spot order revoke log', () => {
793
+ const ctx = createTestContext({ uiNumbers: false });
794
+ const buffer = createSpotOrderRevokeBuffer(0, 100, BigInt(33333), BigInt(400000000), BigInt(40000000));
795
+ const logs = [toLogString(buffer)];
796
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
797
+ (0, vitest_1.expect)(result).toHaveLength(1);
798
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.SpotOrderRevokeReportModel);
799
+ const report = result[0];
800
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.spotOrderRevoke);
801
+ (0, vitest_1.expect)(report.side).toBe(0);
802
+ (0, vitest_1.expect)(report.clientId).toBe(100);
803
+ (0, vitest_1.expect)(report.orderId).toBe(33333);
804
+ });
805
+ (0, vitest_1.it)('decodes perp order revoke log', () => {
806
+ const ctx = createTestContext({ uiNumbers: false });
807
+ const buffer = createPerpOrderRevokeBuffer(1, 200, BigInt(44444), BigInt(600000000), BigInt(60000000));
808
+ const logs = [toLogString(buffer)];
809
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
810
+ (0, vitest_1.expect)(result).toHaveLength(1);
811
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.PerpOrderRevokeReportModel);
812
+ const report = result[0];
813
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.perpOrderRevoke);
814
+ (0, vitest_1.expect)(report.side).toBe(1);
815
+ (0, vitest_1.expect)(report.clientId).toBe(200);
816
+ (0, vitest_1.expect)(report.orderId).toBe(44444);
817
+ });
818
+ });
819
+ (0, vitest_1.describe)('earnings log decoding', () => {
820
+ (0, vitest_1.it)('decodes earnings log', () => {
821
+ const tokens = new Map();
822
+ tokens.set(1, createMockToken(1, 6));
823
+ const ctx = createTestContext({ tokens, uiNumbers: true });
824
+ const buffer = createEarningsBuffer(100, 1, 1700000000, BigInt(5000000));
825
+ const logs = [toLogString(buffer)];
826
+ const result = (0, logs_decoder_1.decodeTransactionLogs)(logs, ctx);
827
+ (0, vitest_1.expect)(result).toHaveLength(1);
828
+ (0, vitest_1.expect)(result[0]).toBeInstanceOf(logs_models_1.EarningsReportModel);
829
+ const report = result[0];
830
+ (0, vitest_1.expect)(report.tag).toBe(logs_models_1.LogType.earnings);
831
+ (0, vitest_1.expect)(report.clientId).toBe(100);
832
+ (0, vitest_1.expect)(report.tokenId).toBe(1);
833
+ (0, vitest_1.expect)(report.amount).toBe(5); // 5000000 / 10^6
834
+ });
835
+ });
836
+ });