@o1-labs/mina-archive-node-graphql 0.0.6

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 (138) hide show
  1. package/README.md +321 -0
  2. package/build/benchmark/setup.js +32 -0
  3. package/build/benchmark/setup.js.map +1 -0
  4. package/build/src/blockchain/constants.js +2 -0
  5. package/build/src/blockchain/constants.js.map +1 -0
  6. package/build/src/blockchain/types.js +7 -0
  7. package/build/src/blockchain/types.js.map +1 -0
  8. package/build/src/blockchain/utils.js +39 -0
  9. package/build/src/blockchain/utils.js.map +1 -0
  10. package/build/src/consensus/mina-consensus.js +59 -0
  11. package/build/src/consensus/mina-consensus.js.map +1 -0
  12. package/build/src/context.js +10 -0
  13. package/build/src/context.js.map +1 -0
  14. package/build/src/db/archive-node-adapter/archive-node-adapter.interface.js +2 -0
  15. package/build/src/db/archive-node-adapter/archive-node-adapter.interface.js.map +1 -0
  16. package/build/src/db/archive-node-adapter/archive-node-adapter.js +47 -0
  17. package/build/src/db/archive-node-adapter/archive-node-adapter.js.map +1 -0
  18. package/build/src/db/sql/events-actions/queries.js +438 -0
  19. package/build/src/db/sql/events-actions/queries.js.map +1 -0
  20. package/build/src/db/sql/events-actions/types.js +2 -0
  21. package/build/src/db/sql/events-actions/types.js.map +1 -0
  22. package/build/src/errors/error.js +17 -0
  23. package/build/src/errors/error.js.map +1 -0
  24. package/build/src/index.js +27 -0
  25. package/build/src/index.js.map +1 -0
  26. package/build/src/resolvers-types.js +8 -0
  27. package/build/src/resolvers-types.js.map +1 -0
  28. package/build/src/resolvers.js +67 -0
  29. package/build/src/resolvers.js.map +1 -0
  30. package/build/src/server/plugins.js +39 -0
  31. package/build/src/server/plugins.js.map +1 -0
  32. package/build/src/server/server.js +25 -0
  33. package/build/src/server/server.js.map +1 -0
  34. package/build/src/services/actions-service/actions-service.interface.js +2 -0
  35. package/build/src/services/actions-service/actions-service.interface.js.map +1 -0
  36. package/build/src/services/actions-service/actions-service.js +94 -0
  37. package/build/src/services/actions-service/actions-service.js.map +1 -0
  38. package/build/src/services/blocks-service/blocks-service.interface.js +2 -0
  39. package/build/src/services/blocks-service/blocks-service.interface.js.map +1 -0
  40. package/build/src/services/blocks-service/blocks-service.js +263 -0
  41. package/build/src/services/blocks-service/blocks-service.js.map +1 -0
  42. package/build/src/services/data-adapters/database-row-adapters.js +116 -0
  43. package/build/src/services/data-adapters/database-row-adapters.js.map +1 -0
  44. package/build/src/services/events-service/events-service.interface.js +2 -0
  45. package/build/src/services/events-service/events-service.interface.js.map +1 -0
  46. package/build/src/services/events-service/events-service.js +64 -0
  47. package/build/src/services/events-service/events-service.js.map +1 -0
  48. package/build/src/services/network-service/network-service.interface.js +2 -0
  49. package/build/src/services/network-service/network-service.interface.js.map +1 -0
  50. package/build/src/services/network-service/network-service.js +31 -0
  51. package/build/src/services/network-service/network-service.js.map +1 -0
  52. package/build/src/tracing/jaeger-setup.js +39 -0
  53. package/build/src/tracing/jaeger-setup.js.map +1 -0
  54. package/build/src/tracing/jaeger-tracing.js +29 -0
  55. package/build/src/tracing/jaeger-tracing.js.map +1 -0
  56. package/build/src/tracing/tracer.js +31 -0
  57. package/build/src/tracing/tracer.js.map +1 -0
  58. package/build/tests/__mocks__/generate_mock_data.js +13 -0
  59. package/build/tests/__mocks__/generate_mock_data.js.map +1 -0
  60. package/build/tests/consensus/run-compare.js +40 -0
  61. package/build/tests/consensus/run-compare.js.map +1 -0
  62. package/build/tests/consensus/select-consensus-precomputed.js +80 -0
  63. package/build/tests/consensus/select-consensus-precomputed.js.map +1 -0
  64. package/build/tests/consensus/types.js +15 -0
  65. package/build/tests/consensus/types.js.map +1 -0
  66. package/build/tests/devnet-dump/devnet-dump.test.js +311 -0
  67. package/build/tests/devnet-dump/devnet-dump.test.js.map +1 -0
  68. package/build/tests/devnet-dump/setup.js +58 -0
  69. package/build/tests/devnet-dump/setup.js.map +1 -0
  70. package/build/tests/integration/integration.test.js +226 -0
  71. package/build/tests/integration/integration.test.js.map +1 -0
  72. package/build/tests/integration/setup.js +82 -0
  73. package/build/tests/integration/setup.js.map +1 -0
  74. package/build/tests/live-api/actions.test.js +4 -0
  75. package/build/tests/live-api/actions.test.js.map +1 -0
  76. package/build/tests/live-api/blocks.test.js +116 -0
  77. package/build/tests/live-api/blocks.test.js.map +1 -0
  78. package/build/tests/live-api/events.test.js +97 -0
  79. package/build/tests/live-api/events.test.js.map +1 -0
  80. package/build/tests/live-api/networkState.test.js +27 -0
  81. package/build/tests/live-api/networkState.test.js.map +1 -0
  82. package/build/tests/live-network/live-network.test.js +144 -0
  83. package/build/tests/live-network/live-network.test.js.map +1 -0
  84. package/build/tests/live-network/setup.js +206 -0
  85. package/build/tests/live-network/setup.js.map +1 -0
  86. package/build/tests/resolvers.test.js +475 -0
  87. package/build/tests/resolvers.test.js.map +1 -0
  88. package/build/tests/services/actions-service/actions-service.test.js +124 -0
  89. package/build/tests/services/actions-service/actions-service.test.js.map +1 -0
  90. package/build/tests/services/blocks-service/blocks-service.test.js +348 -0
  91. package/build/tests/services/blocks-service/blocks-service.test.js.map +1 -0
  92. package/build/tests/services/events-service/events-service.test.js +185 -0
  93. package/build/tests/services/events-service/events-service.test.js.map +1 -0
  94. package/build/tests/test-helpers.js +11 -0
  95. package/build/tests/test-helpers.js.map +1 -0
  96. package/build/tests/unit/blockchain-utils.test.js +106 -0
  97. package/build/tests/unit/blockchain-utils.test.js.map +1 -0
  98. package/build/tests/unit/consensus.test.js +154 -0
  99. package/build/tests/unit/consensus.test.js.map +1 -0
  100. package/build/tests/unit/error-handling.test.js +52 -0
  101. package/build/tests/unit/error-handling.test.js.map +1 -0
  102. package/build/tests/utils.test.js +313 -0
  103. package/build/tests/utils.test.js.map +1 -0
  104. package/build/zkapp/contract.js +144 -0
  105. package/build/zkapp/contract.js.map +1 -0
  106. package/build/zkapp/utils.js +174 -0
  107. package/build/zkapp/utils.js.map +1 -0
  108. package/package.json +85 -0
  109. package/schema.graphql +221 -0
  110. package/src/blockchain/constants.ts +2 -0
  111. package/src/blockchain/types.ts +121 -0
  112. package/src/blockchain/utils.ts +54 -0
  113. package/src/consensus/mina-consensus.ts +137 -0
  114. package/src/context.ts +18 -0
  115. package/src/db/archive-node-adapter/archive-node-adapter.interface.ts +23 -0
  116. package/src/db/archive-node-adapter/archive-node-adapter.ts +101 -0
  117. package/src/db/sql/events-actions/queries.ts +490 -0
  118. package/src/db/sql/events-actions/types.ts +208 -0
  119. package/src/envionment.d.ts +18 -0
  120. package/src/errors/error.ts +20 -0
  121. package/src/index.ts +31 -0
  122. package/src/resolvers-types.ts +754 -0
  123. package/src/resolvers.ts +102 -0
  124. package/src/server/plugins.ts +56 -0
  125. package/src/server/server.ts +30 -0
  126. package/src/services/actions-service/actions-service.interface.ts +9 -0
  127. package/src/services/actions-service/actions-service.ts +195 -0
  128. package/src/services/blocks-service/blocks-service.interface.ts +11 -0
  129. package/src/services/blocks-service/blocks-service.ts +407 -0
  130. package/src/services/data-adapters/database-row-adapters.ts +261 -0
  131. package/src/services/events-service/events-service.interface.ts +6 -0
  132. package/src/services/events-service/events-service.ts +118 -0
  133. package/src/services/network-service/network-service.interface.ts +5 -0
  134. package/src/services/network-service/network-service.ts +53 -0
  135. package/src/tracing/jaeger-setup.ts +65 -0
  136. package/src/tracing/jaeger-tracing.ts +44 -0
  137. package/src/tracing/tracer.ts +52 -0
  138. package/tsconfig.json +104 -0
@@ -0,0 +1,475 @@
1
+ import { test, before, describe, after } from 'node:test';
2
+ import assert from 'node:assert';
3
+ import { createYoga, createSchema } from 'graphql-yoga';
4
+ import { loadSchemaSync } from '@graphql-tools/load';
5
+ import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader';
6
+ import { buildHTTPExecutor, } from '@graphql-tools/executor-http';
7
+ import { parse } from 'graphql';
8
+ import { Field, Lightnet, UInt64, } from 'o1js';
9
+ import { resolvers } from '../src/resolvers.js';
10
+ import { buildContext } from '../src/context.js';
11
+ import { deployContract, emitAction, emitMultipleFieldsEvent, emitSingleEvent, setNetworkConfig, emitMultipleFieldsEvents, fetchNetworkState, randomStruct, } from '../zkapp/utils.js';
12
+ import { TestStruct } from '../zkapp/contract.js';
13
+ const eventsQuery = `
14
+ query getEvents($input: EventFilterOptionsInput!) {
15
+ events(input: $input) {
16
+ blockInfo {
17
+ stateHash
18
+ timestamp
19
+ height
20
+ parentHash
21
+ chainStatus
22
+ distanceFromMaxBlockHeight
23
+ globalSlotSinceHardfork
24
+ globalSlotSinceGenesis
25
+ }
26
+ eventData {
27
+ data
28
+ transactionInfo {
29
+ status
30
+ hash
31
+ memo
32
+ }
33
+ }
34
+ }
35
+ }
36
+ `;
37
+ const actionsQuery = `
38
+ query getActions($input: ActionFilterOptionsInput!) {
39
+ actions(input: $input) {
40
+ blockInfo {
41
+ stateHash
42
+ timestamp
43
+ height
44
+ parentHash
45
+ chainStatus
46
+ distanceFromMaxBlockHeight
47
+ globalSlotSinceGenesis
48
+ }
49
+ actionState {
50
+ actionStateOne
51
+ actionStateTwo
52
+ actionStateThree
53
+ actionStateFour
54
+ actionStateFive
55
+ }
56
+ actionData {
57
+ data
58
+ accountUpdateId
59
+ transactionInfo {
60
+ status
61
+ hash
62
+ memo
63
+ sequenceNumber
64
+ zkappAccountUpdateIds
65
+ }
66
+ }
67
+ }
68
+ }
69
+ `;
70
+ const networkQuery = `
71
+ query maxBlockHeightInfo {
72
+ networkState {
73
+ maxBlockHeight {
74
+ canonicalMaxBlockHeight
75
+ pendingMaxBlockHeight
76
+ }
77
+ }
78
+ }
79
+ `;
80
+ const PG_CONN = 'postgresql://postgres:postgres@localhost:5432/archive ';
81
+ describe('Query Resolvers', async () => {
82
+ let executor;
83
+ let senderKeypair;
84
+ let zkAppKeypair;
85
+ let zkApp;
86
+ async function executeActionsQuery(variableInput) {
87
+ return (await executor({
88
+ variables: {
89
+ input: variableInput,
90
+ },
91
+ document: parse(`${actionsQuery}`),
92
+ }));
93
+ }
94
+ async function executeEventsQuery(variableInput) {
95
+ return (await executor({
96
+ variables: {
97
+ input: variableInput,
98
+ },
99
+ document: parse(`${eventsQuery}`),
100
+ }));
101
+ }
102
+ async function executeNetworkStateQuery() {
103
+ return (await executor({
104
+ document: parse(`${networkQuery}`),
105
+ }));
106
+ }
107
+ before(async () => {
108
+ try {
109
+ setNetworkConfig();
110
+ const schema = createSchema({
111
+ typeDefs: loadSchemaSync('./schema.graphql', {
112
+ loaders: [new GraphQLFileLoader()],
113
+ }),
114
+ resolvers,
115
+ });
116
+ const context = await buildContext(PG_CONN);
117
+ const yoga = createYoga({ schema, context });
118
+ executor = buildHTTPExecutor({
119
+ fetch: yoga.fetch,
120
+ });
121
+ zkAppKeypair = await Lightnet.acquireKeyPair();
122
+ senderKeypair = await Lightnet.acquireKeyPair();
123
+ zkApp = await deployContract(zkAppKeypair, senderKeypair, false);
124
+ }
125
+ catch (error) {
126
+ console.error(error);
127
+ }
128
+ });
129
+ after(() => {
130
+ process.on('uncaughtException', (err) => {
131
+ console.error('Uncaught exception:', err);
132
+ process.exit(1);
133
+ });
134
+ process.on('unhandledRejection', (reason, promise) => {
135
+ console.error('Unhandled rejection at:', promise, 'reason:', reason);
136
+ process.exit(1);
137
+ });
138
+ process.exit(0);
139
+ });
140
+ describe('NetworkState', async () => {
141
+ let blockResponse;
142
+ let results;
143
+ let fetchedBlockchainLength;
144
+ before(async () => {
145
+ results = await executeNetworkStateQuery();
146
+ blockResponse = results.data.networkState;
147
+ fetchedBlockchainLength = await fetchNetworkState(zkApp, senderKeypair);
148
+ });
149
+ test('Fetching the max block height should not throw', async () => {
150
+ assert.doesNotThrow(async () => {
151
+ await executeNetworkStateQuery();
152
+ });
153
+ });
154
+ test('Fetching the max block height should return the max block height', async () => {
155
+ blockResponse = results.data.networkState;
156
+ assert.ok(blockResponse.maxBlockHeight.canonicalMaxBlockHeight > 0);
157
+ assert.ok(blockResponse.maxBlockHeight.pendingMaxBlockHeight > 0);
158
+ assert.ok(blockResponse.maxBlockHeight.pendingMaxBlockHeight >
159
+ blockResponse.maxBlockHeight.canonicalMaxBlockHeight);
160
+ });
161
+ test('Fetched max block height from archive node should match with the one from mina node', async () => {
162
+ assert.deepStrictEqual(blockResponse.maxBlockHeight.pendingMaxBlockHeight, fetchedBlockchainLength);
163
+ });
164
+ describe('Advance a block', async () => {
165
+ before(async () => {
166
+ await new Promise((resolve) => setTimeout(resolve, 25000));
167
+ results = await executeNetworkStateQuery();
168
+ blockResponse = results.data.networkState;
169
+ fetchedBlockchainLength = await fetchNetworkState(zkApp, senderKeypair);
170
+ });
171
+ test('Fetched max block height from archive node should match the one from mina node after one block', () => {
172
+ assert.deepStrictEqual(blockResponse.maxBlockHeight.pendingMaxBlockHeight, fetchedBlockchainLength);
173
+ });
174
+ });
175
+ });
176
+ describe('Events', async () => {
177
+ let eventsResponse;
178
+ let lastBlockEvents;
179
+ let results;
180
+ test('Fetching events with a valid address but no emitted events should not throw', async () => {
181
+ assert.doesNotThrow(async () => {
182
+ await executeEventsQuery({
183
+ address: zkAppKeypair.publicKey.toBase58(),
184
+ });
185
+ });
186
+ });
187
+ test('Fetching events with a empty address should return empty list', async () => {
188
+ results = await executeEventsQuery({
189
+ address: '',
190
+ });
191
+ assert.strictEqual(results.data.events.length, 0);
192
+ });
193
+ test('Fetching events with from block greater than to block should throw', async () => {
194
+ assert.rejects(async () => {
195
+ await executeEventsQuery({
196
+ address: zkApp.address.toBase58(),
197
+ from: '100',
198
+ to: '10',
199
+ });
200
+ }, (err) => {
201
+ assert.strictEqual(err.message, 'to must be greater than from');
202
+ return true;
203
+ });
204
+ });
205
+ test('Fetching events with to block more than BLOCK_RANGE_SIZE greater than from should throw', async () => {
206
+ const resetValue = process.env.BLOCK_RANGE_SIZE;
207
+ process.env.BLOCK_RANGE_SIZE = '10';
208
+ assert.rejects(async () => {
209
+ await executeEventsQuery({
210
+ address: zkApp.address.toBase58(),
211
+ from: '100',
212
+ to: '111',
213
+ });
214
+ }, (err) => {
215
+ assert.strictEqual(err.message, 'The block range is too large. The maximum range is 10');
216
+ return true;
217
+ });
218
+ process.env.BLOCK_RANGE_SIZE = resetValue;
219
+ });
220
+ describe('After emitting an event with a single field once', async () => {
221
+ before(async () => {
222
+ await emitSingleEvent(zkApp, senderKeypair);
223
+ results = await executeEventsQuery({
224
+ address: zkApp.address.toBase58(),
225
+ });
226
+ eventsResponse = results.data.events;
227
+ lastBlockEvents = eventsResponse[eventsResponse.length - 1].eventData;
228
+ });
229
+ test('GQL response contains one event in the latest block', async () => {
230
+ assert.strictEqual(lastBlockEvents.length, 1);
231
+ });
232
+ test('The event has the correct data', async () => {
233
+ const eventData = lastBlockEvents[0];
234
+ assert.deepStrictEqual(eventData.data, ['0', '2']);
235
+ });
236
+ });
237
+ describe('After emitting an event with a single field multiple times', async () => {
238
+ let results;
239
+ const numberOfEmits = 3;
240
+ before(async () => {
241
+ await emitSingleEvent(zkApp, senderKeypair, { numberOfEmits });
242
+ results = await executeEventsQuery({
243
+ address: zkApp.address.toBase58(),
244
+ });
245
+ eventsResponse = results.data.events;
246
+ lastBlockEvents = eventsResponse[eventsResponse.length - 1].eventData;
247
+ });
248
+ test('GQL response contains multiple events in the latest block', async () => {
249
+ assert.strictEqual(lastBlockEvents.length, numberOfEmits);
250
+ });
251
+ test('the events have the correct data', async () => {
252
+ for (let i = 0; i < numberOfEmits; i++) {
253
+ const eventData = lastBlockEvents[i];
254
+ assert.deepStrictEqual(eventData.data, ['0', '2']);
255
+ }
256
+ });
257
+ });
258
+ describe('After emitting an event with multiple fields once', async () => {
259
+ let results;
260
+ const baseStruct = randomStruct();
261
+ before(async () => {
262
+ await emitMultipleFieldsEvent(zkApp, senderKeypair, undefined, baseStruct);
263
+ results = await executeEventsQuery({
264
+ address: zkApp.address.toBase58(),
265
+ });
266
+ eventsResponse = results.data.events;
267
+ lastBlockEvents = eventsResponse[eventsResponse.length - 1].eventData;
268
+ });
269
+ test('GQL response contains one event in the latest block', async () => {
270
+ assert.strictEqual(lastBlockEvents.length, 1);
271
+ });
272
+ test('The event has the correct data', async () => {
273
+ const eventData = lastBlockEvents[0];
274
+ const expectedStructData = structToAction(baseStruct);
275
+ assert.deepStrictEqual(eventData.data, ['1', ...expectedStructData]);
276
+ });
277
+ });
278
+ describe('After emitting an event with multiple fields multiple times', async () => {
279
+ let results;
280
+ const numberOfEmits = 3;
281
+ const baseStruct = randomStruct();
282
+ before(async () => {
283
+ await emitMultipleFieldsEvent(zkApp, senderKeypair, { numberOfEmits }, baseStruct);
284
+ results = await executeEventsQuery({
285
+ address: zkApp.address.toBase58(),
286
+ });
287
+ eventsResponse = results.data.events;
288
+ lastBlockEvents = eventsResponse[eventsResponse.length - 1].eventData;
289
+ });
290
+ test('GQL response contains multiple events in the latest block', async () => {
291
+ assert.strictEqual(lastBlockEvents.length, numberOfEmits);
292
+ });
293
+ test('the events have the correct data', async () => {
294
+ for (let i = 0; i < numberOfEmits; i++) {
295
+ const expectedStruct = new TestStruct(baseStruct);
296
+ expectedStruct.x = expectedStruct.x.add(Field(i));
297
+ const expectedStructData = structToAction(expectedStruct);
298
+ const eventData = lastBlockEvents[i];
299
+ assert.deepStrictEqual(eventData.data, ['1', ...expectedStructData]);
300
+ }
301
+ });
302
+ });
303
+ describe('After emitting multiple events with multiple fields', async () => {
304
+ let results;
305
+ const numberOfEmits = 3;
306
+ const baseStruct = randomStruct();
307
+ before(async () => {
308
+ await emitMultipleFieldsEvents(zkApp, senderKeypair, { numberOfEmits }, baseStruct);
309
+ results = await executeEventsQuery({
310
+ address: zkApp.address.toBase58(),
311
+ });
312
+ eventsResponse = results.data.events;
313
+ lastBlockEvents = eventsResponse[eventsResponse.length - 1].eventData;
314
+ });
315
+ test('GQL response contains multiple events in the latest block', async () => {
316
+ assert.strictEqual(lastBlockEvents.length, numberOfEmits);
317
+ });
318
+ test('the events have the correct data', async () => {
319
+ for (let i = 0; i < numberOfEmits; i++) {
320
+ const expectedStruct = new TestStruct(baseStruct);
321
+ expectedStruct.x = expectedStruct.x.add(Field(i));
322
+ const expectedS1 = new TestStruct(expectedStruct);
323
+ const expectedS2 = new TestStruct(expectedStruct);
324
+ const expectedS3 = new TestStruct(expectedStruct);
325
+ expectedS1.z = expectedS1.z.add(UInt64.from(i));
326
+ expectedS2.z = expectedS2.z.add(UInt64.from(i + 1));
327
+ expectedS3.z = expectedS3.z.add(UInt64.from(i + 2));
328
+ const eventData = lastBlockEvents[i];
329
+ const structData = eventData.data;
330
+ assert.strictEqual(structData.length, 16);
331
+ assert.strictEqual(structData[0], '2');
332
+ assert.deepStrictEqual(structData.slice(1, 6), structToAction(expectedS1));
333
+ assert.deepStrictEqual(structData.slice(6, 11), structToAction(expectedS2));
334
+ assert.deepStrictEqual(structData.slice(11, 16), structToAction(expectedS3));
335
+ }
336
+ });
337
+ });
338
+ });
339
+ describe('Actions', async () => {
340
+ let actionsResponse;
341
+ let lastBlockActions;
342
+ let results;
343
+ test('Fetching actions with a valid address should not throw', async () => {
344
+ assert.doesNotThrow(async () => {
345
+ await executeActionsQuery({
346
+ address: zkAppKeypair.publicKey.toBase58(),
347
+ });
348
+ });
349
+ });
350
+ test('Fetching actions with a empty address should return empty list', async () => {
351
+ results = await executeActionsQuery({
352
+ address: '',
353
+ });
354
+ assert.strictEqual(results.data.actions.length, 0);
355
+ });
356
+ test('Fetching actions with from block greater than to block should throw', async () => {
357
+ assert.rejects(async () => {
358
+ await executeActionsQuery({
359
+ address: zkApp.address.toBase58(),
360
+ from: '100',
361
+ to: '10',
362
+ });
363
+ }, (err) => {
364
+ assert.strictEqual(err.message, 'to must be greater than from');
365
+ return true;
366
+ });
367
+ });
368
+ test('Fetching actions with to block more than BLOCK_RANGE_SIZE greater than from should throw', async () => {
369
+ const resetValue = process.env.BLOCK_RANGE_SIZE;
370
+ process.env.BLOCK_RANGE_SIZE = '10';
371
+ assert.rejects(async () => {
372
+ await executeActionsQuery({
373
+ address: zkApp.address.toBase58(),
374
+ from: '100',
375
+ to: '111',
376
+ });
377
+ }, (err) => {
378
+ assert.strictEqual(err.message, 'The block range is too large. The maximum range is 10');
379
+ return true;
380
+ });
381
+ process.env.BLOCK_RANGE_SIZE = resetValue;
382
+ });
383
+ describe('After emitting an action', async () => {
384
+ const [s1, s2, s3] = [randomStruct(), randomStruct(), randomStruct()];
385
+ const testStructArray = {
386
+ structs: [s1, s2, s3],
387
+ };
388
+ before(async () => {
389
+ await emitAction(zkApp, senderKeypair, undefined, testStructArray);
390
+ results = await executeActionsQuery({
391
+ address: zkApp.address.toBase58(),
392
+ });
393
+ actionsResponse = results.data.actions;
394
+ lastBlockActions =
395
+ actionsResponse[actionsResponse.length - 1].actionData;
396
+ });
397
+ test('GQL response contains one action', async () => {
398
+ assert.strictEqual(lastBlockActions.length, 1);
399
+ });
400
+ test('The action has the correct data', async () => {
401
+ const actionFieldData = lastBlockActions[0].data;
402
+ assert.strictEqual(actionFieldData.length, 15);
403
+ assert.deepStrictEqual(actionFieldData.slice(0, 5), structToAction(s1));
404
+ assert.deepStrictEqual(actionFieldData.slice(5, 10), structToAction(s2));
405
+ assert.deepStrictEqual(actionFieldData.slice(10, 15), structToAction(s3));
406
+ });
407
+ });
408
+ describe('After emitting multiple actions', () => {
409
+ const numberOfEmits = 3;
410
+ let results;
411
+ const s1 = randomStruct();
412
+ const s2 = randomStruct();
413
+ const s3 = randomStruct();
414
+ const testStructs = {
415
+ structs: [s1, s2, s3],
416
+ };
417
+ before(async () => {
418
+ await emitAction(zkApp, senderKeypair, { numberOfEmits }, testStructs);
419
+ results = await executeActionsQuery({
420
+ address: zkApp.address.toBase58(),
421
+ });
422
+ actionsResponse = results.data.actions;
423
+ lastBlockActions =
424
+ actionsResponse[actionsResponse.length - 1].actionData;
425
+ });
426
+ test('GQL response contains multiple actions', async () => {
427
+ assert.strictEqual(lastBlockActions.length, numberOfEmits);
428
+ });
429
+ test('Fetched actions have correct data', async () => {
430
+ const lastAction = lastBlockActions[lastBlockActions.length - 1];
431
+ const actionFieldData = lastAction.data;
432
+ assert.strictEqual(actionFieldData.length, 15);
433
+ assert.deepStrictEqual(actionFieldData.slice(0, 5), structToAction(s1));
434
+ assert.deepStrictEqual(actionFieldData.slice(5, 10), structToAction(s2));
435
+ assert.deepStrictEqual(actionFieldData.slice(10, 15), structToAction(s3));
436
+ });
437
+ test('Fetched actions have order metadata', async () => {
438
+ for (const block of actionsResponse) {
439
+ const actionData = block.actionData;
440
+ for (const action of actionData) {
441
+ assert(typeof action.transactionInfo.sequenceNumber === 'number');
442
+ assert(action.transactionInfo.zkappAccountUpdateIds.length > 0);
443
+ }
444
+ }
445
+ });
446
+ test('Fetched actions have correct order', async () => {
447
+ let testedAccountUpdateOrder = false;
448
+ for (const block of actionsResponse) {
449
+ const actionData = block.actionData;
450
+ for (let i = 1; i < actionData.length; i++) {
451
+ const previousAction = actionData[i - 1];
452
+ const currentAction = actionData[i];
453
+ assert.ok(previousAction.transactionInfo.sequenceNumber <=
454
+ currentAction.transactionInfo.sequenceNumber);
455
+ if (previousAction.transactionInfo.sequenceNumber ===
456
+ currentAction.transactionInfo.sequenceNumber) {
457
+ testedAccountUpdateOrder = true;
458
+ assert.ok(previousAction.accountUpdateId < currentAction.accountUpdateId);
459
+ }
460
+ }
461
+ }
462
+ assert.ok(testedAccountUpdateOrder);
463
+ });
464
+ });
465
+ });
466
+ });
467
+ function structToAction(s) {
468
+ return [
469
+ s.x.toString(),
470
+ s.y.toField().toString(),
471
+ s.z.toString(),
472
+ ...s.address.toFields().map((f) => f.toString()),
473
+ ];
474
+ }
475
+ //# sourceMappingURL=resolvers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolvers.test.js","sourceRoot":"","sources":["../../tests/resolvers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ import { test, before, describe } from 'node:test';
2
+ import assert from 'node:assert';
3
+ import { ActionsService } from '../../../src/services/actions-service/actions-service.js';
4
+ import { makeClient } from '../../test-helpers.js';
5
+ describe('ActionsService', () => {
6
+ let actionsService;
7
+ before(() => {
8
+ actionsService = new ActionsService(makeClient());
9
+ });
10
+ describe('sortActions', () => {
11
+ let actions;
12
+ describe('with actions with different sequence numbers', () => {
13
+ before(() => {
14
+ actions = [
15
+ dummyAction({ sequenceNumber: 2 }),
16
+ dummyAction({ sequenceNumber: 1 }),
17
+ ];
18
+ });
19
+ test('it sorts actions by their sequence number', () => {
20
+ const sortedActions = actionsService.sortActions(actions);
21
+ assert.strictEqual(sortedActions[0].transactionInfo.sequenceNumber, 1);
22
+ assert.strictEqual(sortedActions[1].transactionInfo.sequenceNumber, 2);
23
+ });
24
+ });
25
+ describe('with actions with the same sequence number', () => {
26
+ const sequenceNumber = 1;
27
+ describe('with actions with different account update ids', () => {
28
+ const zkappAccountUpdateIds = [1, 2];
29
+ before(() => {
30
+ actions = [
31
+ dummyAction({
32
+ sequenceNumber,
33
+ zkappAccountUpdateIds,
34
+ accountUpdateId: '2',
35
+ }),
36
+ dummyAction({
37
+ sequenceNumber,
38
+ zkappAccountUpdateIds,
39
+ accountUpdateId: '1',
40
+ }),
41
+ ];
42
+ });
43
+ test('it sorts actions by their account update index', () => {
44
+ const sortedActions = actionsService.sortActions(actions);
45
+ assert.strictEqual(sortedActions[0].accountUpdateId, '1');
46
+ assert.strictEqual(sortedActions[1].accountUpdateId, '2');
47
+ });
48
+ });
49
+ describe('with account update ids that are ordered in non-ascending or descending order', () => {
50
+ const zkappAccountUpdateIds = [1, 3, 2];
51
+ before(() => {
52
+ actions = [
53
+ dummyAction({
54
+ sequenceNumber,
55
+ zkappAccountUpdateIds,
56
+ accountUpdateId: '2',
57
+ }),
58
+ dummyAction({
59
+ sequenceNumber,
60
+ zkappAccountUpdateIds,
61
+ accountUpdateId: '1',
62
+ }),
63
+ dummyAction({
64
+ sequenceNumber,
65
+ zkappAccountUpdateIds,
66
+ accountUpdateId: '3',
67
+ }),
68
+ ];
69
+ });
70
+ test('it sorts actions by their account update index', () => {
71
+ const sortedActions = actionsService.sortActions(actions);
72
+ assert.strictEqual(sortedActions[0].accountUpdateId, '1');
73
+ assert.strictEqual(sortedActions[1].accountUpdateId, '3');
74
+ assert.strictEqual(sortedActions[2].accountUpdateId, '2');
75
+ });
76
+ });
77
+ });
78
+ test('it handles mixed sequence numbers and account update indices', () => {
79
+ const ids = [1, 2];
80
+ const actions = [
81
+ dummyAction({ sequenceNumber: 2, accountUpdateId: '2', zkappAccountUpdateIds: ids }),
82
+ dummyAction({ sequenceNumber: 1, accountUpdateId: '2', zkappAccountUpdateIds: ids }),
83
+ dummyAction({ sequenceNumber: 1, accountUpdateId: '1', zkappAccountUpdateIds: ids }),
84
+ dummyAction({ sequenceNumber: 2, accountUpdateId: '1', zkappAccountUpdateIds: ids }),
85
+ ];
86
+ const sorted = actionsService.sortActions(actions);
87
+ assert.strictEqual(sorted[0].transactionInfo.sequenceNumber, 1);
88
+ assert.strictEqual(sorted[0].accountUpdateId, '1');
89
+ assert.strictEqual(sorted[1].transactionInfo.sequenceNumber, 1);
90
+ assert.strictEqual(sorted[1].accountUpdateId, '2');
91
+ assert.strictEqual(sorted[2].transactionInfo.sequenceNumber, 2);
92
+ assert.strictEqual(sorted[2].accountUpdateId, '1');
93
+ assert.strictEqual(sorted[3].transactionInfo.sequenceNumber, 2);
94
+ assert.strictEqual(sorted[3].accountUpdateId, '2');
95
+ });
96
+ test('it returns empty array for empty input', () => {
97
+ assert.strictEqual(actionsService.sortActions([]).length, 0);
98
+ });
99
+ test('it handles account update id not in the list', () => {
100
+ const actions = [
101
+ dummyAction({ sequenceNumber: 1, accountUpdateId: '99', zkappAccountUpdateIds: [1, 2] }),
102
+ dummyAction({ sequenceNumber: 1, accountUpdateId: '1', zkappAccountUpdateIds: [1, 2] }),
103
+ ];
104
+ const sorted = actionsService.sortActions(actions);
105
+ assert.strictEqual(sorted[0].accountUpdateId, '99');
106
+ assert.strictEqual(sorted[1].accountUpdateId, '1');
107
+ });
108
+ });
109
+ });
110
+ function dummyAction({ sequenceNumber = 1, accountUpdateId = '1', zkappAccountUpdateIds = [1], }) {
111
+ return {
112
+ accountUpdateId,
113
+ data: ['dummy'],
114
+ transactionInfo: {
115
+ sequenceNumber,
116
+ zkappAccountUpdateIds,
117
+ authorizationKind: 'dummy',
118
+ hash: 'dummy',
119
+ memo: 'dummy',
120
+ status: 'dummy',
121
+ },
122
+ };
123
+ }
124
+ //# sourceMappingURL=actions-service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions-service.test.js","sourceRoot":"","sources":["../../../../tests/services/actions-service/actions-service.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAS,MAAM,WAAW,CAAC;AAC1D,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE1F,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,cAA8B,CAAC;IAEnC,MAAM,CAAC,GAAG,EAAE;QACV,cAAc,GAAG,IAAI,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,IAAI,OAAiB,CAAC;QACtB,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;YAC5D,MAAM,CAAC,GAAG,EAAE;gBACV,OAAO,GAAG;oBACR,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;oBAClC,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;iBACnC,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;gBACrD,MAAM,aAAa,GAAG,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC1D,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;gBACvE,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YACzE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;YAC1D,MAAM,cAAc,GAAG,CAAC,CAAC;YACzB,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;gBAC9D,MAAM,qBAAqB,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrC,MAAM,CAAC,GAAG,EAAE;oBACV,OAAO,GAAG;wBACR,WAAW,CAAC;4BACV,cAAc;4BACd,qBAAqB;4BACrB,eAAe,EAAE,GAAG;yBACrB,CAAC;wBACF,WAAW,CAAC;4BACV,cAAc;4BACd,qBAAqB;4BACrB,eAAe,EAAE,GAAG;yBACrB,CAAC;qBACH,CAAC;gBACJ,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;oBAC1D,MAAM,aAAa,GAAG,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;oBAC1D,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;oBAC1D,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;gBAC5D,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,+EAA+E,EAAE,GAAG,EAAE;gBAC7F,MAAM,qBAAqB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxC,MAAM,CAAC,GAAG,EAAE;oBACV,OAAO,GAAG;wBACR,WAAW,CAAC;4BACV,cAAc;4BACd,qBAAqB;4BACrB,eAAe,EAAE,GAAG;yBACrB,CAAC;wBACF,WAAW,CAAC;4BACV,cAAc;4BACd,qBAAqB;4BACrB,eAAe,EAAE,GAAG;yBACrB,CAAC;wBACF,WAAW,CAAC;4BACV,cAAc;4BACd,qBAAqB;4BACrB,eAAe,EAAE,GAAG;yBACrB,CAAC;qBACH,CAAC;gBACJ,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;oBAC1D,MAAM,aAAa,GAAG,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;oBAC1D,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;oBAC1D,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;oBAC1D,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;gBAC5D,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACxE,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACnB,MAAM,OAAO,GAAG;gBACd,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,qBAAqB,EAAE,GAAG,EAAE,CAAC;gBACpF,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,qBAAqB,EAAE,GAAG,EAAE,CAAC;gBACpF,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,qBAAqB,EAAE,GAAG,EAAE,CAAC;gBACpF,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,qBAAqB,EAAE,GAAG,EAAE,CAAC;aACrF,CAAC;YACF,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAChE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YACnD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAChE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YACnD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAChE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YACnD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAChE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACxD,MAAM,OAAO,GAAG;gBACd,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxF,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;aACxF,CAAC;YACF,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAEnD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YACpD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,EACnB,cAAc,GAAG,CAAC,EAClB,eAAe,GAAG,GAAG,EACrB,qBAAqB,GAAG,CAAC,CAAC,CAAC,GAM5B;IACC,OAAO;QACL,eAAe;QACf,IAAI,EAAE,CAAC,OAAO,CAAC;QACf,eAAe,EAAE;YACf,cAAc;YACd,qBAAqB;YACrB,iBAAiB,EAAE,OAAO;YAC1B,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,OAAO;SAChB;KACF,CAAC;AACJ,CAAC"}