@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.
- package/dist/auto_buffer.d.ts +0 -2
- package/dist/auto_data.d.ts +0 -2
- package/dist/constants.d.ts +14 -0
- package/dist/constants.js +28 -0
- package/dist/engine/account-helpers.d.ts +59 -0
- package/dist/engine/account-helpers.js +177 -0
- package/dist/engine/account-helpers.test.d.ts +1 -0
- package/dist/engine/account-helpers.test.js +199 -0
- package/dist/engine/client-queries.d.ts +36 -0
- package/dist/engine/client-queries.js +498 -0
- package/dist/engine/client-queries.test.d.ts +1 -0
- package/dist/engine/client-queries.test.js +341 -0
- package/dist/engine/context-builders.d.ts +16 -0
- package/dist/engine/context-builders.js +158 -0
- package/dist/engine/context-builders.test.d.ts +1 -0
- package/dist/engine/context-builders.test.js +156 -0
- package/dist/engine/index.d.ts +101 -0
- package/dist/engine/index.js +745 -0
- package/dist/engine/index.test.d.ts +1 -0
- package/dist/engine/index.test.js +685 -0
- package/dist/engine/logs-decoder.d.ts +18 -0
- package/dist/engine/logs-decoder.js +525 -0
- package/dist/engine/logs-decoder.test.d.ts +1 -0
- package/dist/engine/logs-decoder.test.js +836 -0
- package/dist/engine/perp-instructions.d.ts +68 -0
- package/dist/engine/perp-instructions.js +497 -0
- package/dist/engine/perp-instructions.test.d.ts +1 -0
- package/dist/engine/perp-instructions.test.js +292 -0
- package/dist/engine/spot-instructions.d.ts +52 -0
- package/dist/engine/spot-instructions.js +399 -0
- package/dist/engine/spot-instructions.test.d.ts +1 -0
- package/dist/engine/spot-instructions.test.js +221 -0
- package/dist/engine/utils.d.ts +23 -0
- package/dist/engine/utils.js +332 -0
- package/dist/engine/utils.test.d.ts +1 -0
- package/dist/engine/utils.test.js +120 -0
- package/dist/index.d.ts +6 -247
- package/dist/index.js +14 -2923
- package/dist/instruction_models.d.ts +10 -9
- package/dist/instruction_models.js +88 -69
- package/dist/logs_models.d.ts +147 -5
- package/dist/logs_models.js +243 -13
- package/dist/structure_models.d.ts +104 -99
- package/dist/structure_models.js +152 -129
- package/dist/types/engine-args.d.ts +32 -0
- package/dist/types/engine-args.js +2 -0
- package/dist/types/enums.d.ts +43 -0
- package/dist/{types.js → types/enums.js} +3 -5
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.js +38 -0
- package/dist/types/log-message.d.ts +2 -0
- package/dist/types/log-message.js +2 -0
- package/dist/types/responses.d.ts +248 -0
- package/dist/types/responses.js +2 -0
- package/dist/types/schemas.d.ts +168 -0
- package/dist/types/schemas.js +239 -0
- package/dist/types/schemas.test.d.ts +1 -0
- package/dist/types/schemas.test.js +93 -0
- package/dist/utils.d.ts +0 -0
- package/dist/utils.js +1 -0
- package/package.json +26 -6
- 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
|
+
});
|