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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +92 -268
  3. package/build/src/blockchain/utils.js.map +1 -1
  4. package/build/src/config.js +86 -0
  5. package/build/src/config.js.map +1 -0
  6. package/build/src/db/archive-node-adapter/archive-node-adapter.js +29 -2
  7. package/build/src/db/archive-node-adapter/archive-node-adapter.js.map +1 -1
  8. package/build/src/db/archive-node-adapter/postgres-options.js +35 -0
  9. package/build/src/db/archive-node-adapter/postgres-options.js.map +1 -0
  10. package/build/src/db/sql/best-chain.js +5 -0
  11. package/build/src/db/sql/best-chain.js.map +1 -0
  12. package/build/src/db/sql/events-actions/queries.js +102 -21
  13. package/build/src/db/sql/events-actions/queries.js.map +1 -1
  14. package/build/src/db/sql/verification-key-updates/queries.js +100 -0
  15. package/build/src/db/sql/verification-key-updates/queries.js.map +1 -0
  16. package/build/src/db/sql/zkapp-commands/queries.js +363 -0
  17. package/build/src/db/sql/zkapp-commands/queries.js.map +1 -0
  18. package/build/src/db/sql/zkapp-commands/types.js +2 -0
  19. package/build/src/db/sql/zkapp-commands/types.js.map +1 -0
  20. package/build/src/errors/error.js +4 -1
  21. package/build/src/errors/error.js.map +1 -1
  22. package/build/src/index.js +44 -7
  23. package/build/src/index.js.map +1 -1
  24. package/build/src/resolvers.js +42 -23
  25. package/build/src/resolvers.js.map +1 -1
  26. package/build/src/schema-version.js +2 -0
  27. package/build/src/schema-version.js.map +1 -0
  28. package/build/src/server/cors.js +41 -0
  29. package/build/src/server/cors.js.map +1 -0
  30. package/build/src/server/graceful-shutdown.js +42 -0
  31. package/build/src/server/graceful-shutdown.js.map +1 -0
  32. package/build/src/server/graphql-armor.js +39 -0
  33. package/build/src/server/graphql-armor.js.map +1 -0
  34. package/build/src/server/logger.js +45 -0
  35. package/build/src/server/logger.js.map +1 -0
  36. package/build/src/server/metrics.js +72 -0
  37. package/build/src/server/metrics.js.map +1 -0
  38. package/build/src/server/plugins.js +31 -15
  39. package/build/src/server/plugins.js.map +1 -1
  40. package/build/src/server/rate-limit.js +143 -0
  41. package/build/src/server/rate-limit.js.map +1 -0
  42. package/build/src/server/readiness.js +45 -0
  43. package/build/src/server/readiness.js.map +1 -0
  44. package/build/src/server/request-logging.js +58 -0
  45. package/build/src/server/request-logging.js.map +1 -0
  46. package/build/src/server/server.js +38 -13
  47. package/build/src/server/server.js.map +1 -1
  48. package/build/src/services/actions-service/actions-service.js +26 -15
  49. package/build/src/services/actions-service/actions-service.js.map +1 -1
  50. package/build/src/services/blocks-service/blocks-service.js +10 -9
  51. package/build/src/services/blocks-service/blocks-service.js.map +1 -1
  52. package/build/src/services/network-service/network-service.js +17 -9
  53. package/build/src/services/network-service/network-service.js.map +1 -1
  54. package/build/src/services/verification-key-updates-service/verification-key-updates-service.interface.js +2 -0
  55. package/build/src/services/verification-key-updates-service/verification-key-updates-service.interface.js.map +1 -0
  56. package/build/src/services/verification-key-updates-service/verification-key-updates-service.js +41 -0
  57. package/build/src/services/verification-key-updates-service/verification-key-updates-service.js.map +1 -0
  58. package/build/src/services/zkapp-commands-service/zkapp-commands-service.interface.js +2 -0
  59. package/build/src/services/zkapp-commands-service/zkapp-commands-service.interface.js.map +1 -0
  60. package/build/src/services/zkapp-commands-service/zkapp-commands-service.js +115 -0
  61. package/build/src/services/zkapp-commands-service/zkapp-commands-service.js.map +1 -0
  62. package/build/src/tracing/jaeger-tracing.js +2 -1
  63. package/build/src/tracing/jaeger-tracing.js.map +1 -1
  64. package/build/tests/devnet-dump/action-state-invariants.js +165 -0
  65. package/build/tests/devnet-dump/action-state-invariants.js.map +1 -0
  66. package/build/tests/devnet-dump/devnet-dump.test.js +24 -10
  67. package/build/tests/devnet-dump/devnet-dump.test.js.map +1 -1
  68. package/build/tests/devnet-dump/setup.js +63 -17
  69. package/build/tests/devnet-dump/setup.js.map +1 -1
  70. package/build/tests/integration/action-state-ordering.test.js +139 -0
  71. package/build/tests/integration/action-state-ordering.test.js.map +1 -0
  72. package/build/tests/integration/action-state-setup.js +48 -0
  73. package/build/tests/integration/action-state-setup.js.map +1 -0
  74. package/build/tests/integration/consensus-vs-chain.test.js +81 -0
  75. package/build/tests/integration/consensus-vs-chain.test.js.map +1 -0
  76. package/build/tests/integration/integration.test.js +166 -2
  77. package/build/tests/integration/integration.test.js.map +1 -1
  78. package/build/tests/integration/postgres-timeout.test.js +92 -0
  79. package/build/tests/integration/postgres-timeout.test.js.map +1 -0
  80. package/build/tests/integration/setup.js +58 -1
  81. package/build/tests/integration/setup.js.map +1 -1
  82. package/build/tests/integration/verification-key-setup.js +49 -0
  83. package/build/tests/integration/verification-key-setup.js.map +1 -0
  84. package/build/tests/integration/verification-key-updates.test.js +159 -0
  85. package/build/tests/integration/verification-key-updates.test.js.map +1 -0
  86. package/build/tests/live-api/events.test.js +11 -7
  87. package/build/tests/live-api/events.test.js.map +1 -1
  88. package/build/tests/live-api/networkState.test.js +1 -0
  89. package/build/tests/live-api/networkState.test.js.map +1 -1
  90. package/build/tests/live-network/live-network.test.js +1 -0
  91. package/build/tests/live-network/live-network.test.js.map +1 -1
  92. package/build/tests/resolvers.test.js +65 -37
  93. package/build/tests/resolvers.test.js.map +1 -1
  94. package/build/tests/services/verification-key-updates-service/verification-key-updates-service.test.js +35 -0
  95. package/build/tests/services/verification-key-updates-service/verification-key-updates-service.test.js.map +1 -0
  96. package/build/tests/services/zkapp-commands-service/zkapp-commands-service.test.js +159 -0
  97. package/build/tests/services/zkapp-commands-service/zkapp-commands-service.test.js.map +1 -0
  98. package/build/tests/test-helpers.js +15 -0
  99. package/build/tests/test-helpers.js.map +1 -1
  100. package/build/tests/unit/best-chain-anchor.test.js +70 -0
  101. package/build/tests/unit/best-chain-anchor.test.js.map +1 -0
  102. package/build/tests/unit/config.test.js +106 -0
  103. package/build/tests/unit/config.test.js.map +1 -0
  104. package/build/tests/unit/cors.test.js +95 -0
  105. package/build/tests/unit/cors.test.js.map +1 -0
  106. package/build/tests/unit/error-masking.test.js +119 -0
  107. package/build/tests/unit/error-masking.test.js.map +1 -0
  108. package/build/tests/unit/graceful-shutdown.test.js +99 -0
  109. package/build/tests/unit/graceful-shutdown.test.js.map +1 -0
  110. package/build/tests/unit/graphql-armor.test.js +121 -0
  111. package/build/tests/unit/graphql-armor.test.js.map +1 -0
  112. package/build/tests/unit/logging.test.js +120 -0
  113. package/build/tests/unit/logging.test.js.map +1 -0
  114. package/build/tests/unit/metrics.test.js +114 -0
  115. package/build/tests/unit/metrics.test.js.map +1 -0
  116. package/build/tests/unit/network-service.test.js +66 -0
  117. package/build/tests/unit/network-service.test.js.map +1 -0
  118. package/build/tests/unit/postgres-options.test.js +56 -0
  119. package/build/tests/unit/postgres-options.test.js.map +1 -0
  120. package/build/tests/unit/rate-limit.test.js +271 -0
  121. package/build/tests/unit/rate-limit.test.js.map +1 -0
  122. package/build/tests/unit/readiness.test.js +75 -0
  123. package/build/tests/unit/readiness.test.js.map +1 -0
  124. package/build/tests/unit/schema-nullability.test.js +40 -0
  125. package/build/tests/unit/schema-nullability.test.js.map +1 -0
  126. package/build/tests/unit/schema-version.test.js +48 -0
  127. package/build/tests/unit/schema-version.test.js.map +1 -0
  128. package/build/tests/unit/yoga-http-contract.test.js +30 -0
  129. package/build/tests/unit/yoga-http-contract.test.js.map +1 -0
  130. package/build/tests/unit/zkapp-commands-gating.test.js +38 -0
  131. package/build/tests/unit/zkapp-commands-gating.test.js.map +1 -0
  132. package/build/zkapp/utils.js +2 -0
  133. package/build/zkapp/utils.js.map +1 -1
  134. package/package.json +33 -14
  135. package/schema.graphql +126 -8
  136. package/src/blockchain/types.ts +65 -1
  137. package/src/blockchain/utils.ts +26 -2
  138. package/src/config.ts +133 -0
  139. package/src/db/archive-node-adapter/archive-node-adapter.interface.ts +26 -3
  140. package/src/db/archive-node-adapter/archive-node-adapter.ts +65 -2
  141. package/src/db/archive-node-adapter/postgres-options.ts +90 -0
  142. package/src/db/sql/best-chain.ts +34 -0
  143. package/src/db/sql/events-actions/queries.ts +168 -24
  144. package/src/db/sql/verification-key-updates/queries.ts +132 -0
  145. package/src/db/sql/zkapp-commands/queries.ts +406 -0
  146. package/src/db/sql/zkapp-commands/types.ts +43 -0
  147. package/src/envionment.d.ts +20 -0
  148. package/src/errors/error.ts +17 -1
  149. package/src/index.ts +64 -7
  150. package/src/resolvers-types.ts +311 -24
  151. package/src/resolvers.ts +70 -34
  152. package/src/schema-version.ts +24 -0
  153. package/src/server/cors.ts +97 -0
  154. package/src/server/graceful-shutdown.ts +76 -0
  155. package/src/server/graphql-armor.ts +78 -0
  156. package/src/server/logger.ts +72 -0
  157. package/src/server/metrics.ts +104 -0
  158. package/src/server/plugins.ts +53 -19
  159. package/src/server/rate-limit.ts +274 -0
  160. package/src/server/readiness.ts +78 -0
  161. package/src/server/request-logging.ts +83 -0
  162. package/src/server/server.ts +70 -15
  163. package/src/services/actions-service/actions-service.ts +87 -24
  164. package/src/services/blocks-service/blocks-service.ts +16 -14
  165. package/src/services/network-service/network-service.ts +30 -12
  166. package/src/services/verification-key-updates-service/verification-key-updates-service.interface.ts +9 -0
  167. package/src/services/verification-key-updates-service/verification-key-updates-service.ts +72 -0
  168. package/src/services/zkapp-commands-service/zkapp-commands-service.interface.ts +9 -0
  169. package/src/services/zkapp-commands-service/zkapp-commands-service.ts +181 -0
  170. package/src/tracing/jaeger-tracing.ts +2 -1
  171. package/build/tests/consensus/run-compare.js +0 -40
  172. package/build/tests/consensus/run-compare.js.map +0 -1
  173. package/build/tests/consensus/select-consensus-precomputed.js +0 -80
  174. package/build/tests/consensus/select-consensus-precomputed.js.map +0 -1
  175. package/build/tests/consensus/types.js +0 -15
  176. package/build/tests/consensus/types.js.map +0 -1
@@ -10,6 +10,7 @@ import type {
10
10
  BlockSortByInput,
11
11
  } from '../../resolvers-types.js';
12
12
  import { IBlocksService } from './blocks-service.interface.js';
13
+ import { BEST_CHAIN_TIP_HEIGHT_SQL } from '../../db/sql/best-chain.js';
13
14
  import {
14
15
  TracingState,
15
16
  extractTraceStateFromOptions,
@@ -79,7 +80,9 @@ class BlocksService implements IBlocksService {
79
80
  options: unknown
80
81
  ): Promise<Blocks> {
81
82
  const tracingState = extractTraceStateFromOptions(options);
82
- return (await this.getBlockData(query, limit, sortBy, { tracingState })) ?? [];
83
+ return (
84
+ (await this.getBlockData(query, limit, sortBy, { tracingState })) ?? []
85
+ );
83
86
  }
84
87
 
85
88
  async getBlockData(
@@ -128,7 +131,8 @@ class BlocksService implements IBlocksService {
128
131
  const dateTimeLt = query?.dateTime_lt;
129
132
  const canonical = query?.canonical;
130
133
  const inBestChain = query?.inBestChain;
131
- const orderBy = sortBy === 'BLOCKHEIGHT_DESC' ? 'DESC' : 'ASC';
134
+ const orderBy: 'ASC' | 'DESC' =
135
+ sortBy === 'BLOCKHEIGHT_DESC' ? 'DESC' : 'ASC';
132
136
  const limitValue = Math.min(limit ?? 200, BLOCK_RANGE_SIZE);
133
137
 
134
138
  // Build the SQL query for blocks with transactions
@@ -192,16 +196,15 @@ class BlocksService implements IBlocksService {
192
196
  paramIndex++;
193
197
  }
194
198
 
195
- const best_chain_til_canonical_cte =
196
- `
199
+ const best_chain_til_canonical_cte = `
197
200
  WITH RECURSIVE best_chain_til_canonical AS (
198
201
  SELECT
199
202
  id,
200
203
  parent_id,
201
204
  height
202
205
  FROM blocks
203
- WHERE height = (SELECT MAX(height) FROM blocks)
204
- AND chain_status = 'pending'
206
+ WHERE chain_status = 'pending'
207
+ AND height = ${BEST_CHAIN_TIP_HEIGHT_SQL}
205
208
 
206
209
  UNION
207
210
 
@@ -213,19 +216,18 @@ class BlocksService implements IBlocksService {
213
216
  JOIN best_chain_til_canonical ON potential_parent.id = best_chain_til_canonical.parent_id
214
217
  WHERE potential_parent.chain_status <> 'canonical'
215
218
  )
216
- `
219
+ `;
217
220
  if (inBestChain === true) {
218
221
  sql =
219
- best_chain_til_canonical_cte
220
- + sql
221
- + ` AND (b.id IN (SELECT id FROM best_chain_til_canonical) OR b.chain_status = 'canonical')`;
222
+ best_chain_til_canonical_cte +
223
+ sql +
224
+ ` AND (b.id IN (SELECT id FROM best_chain_til_canonical) OR b.chain_status = 'canonical')`;
222
225
  } else if (inBestChain === false) {
223
226
  sql =
224
- best_chain_til_canonical_cte
225
- + sql
226
- + ` AND (b.id NOT IN (SELECT id FROM best_chain_til_canonical)
227
+ best_chain_til_canonical_cte +
228
+ sql +
229
+ ` AND (b.id NOT IN (SELECT id FROM best_chain_til_canonical)
227
230
  OR b.chain_status = 'orphaned')`;
228
-
229
231
  }
230
232
 
231
233
  sql += ` ORDER BY b.height ${orderBy}`;
@@ -19,7 +19,7 @@ class NetworkService implements INetworkService {
19
19
 
20
20
  async getNetworkState(options: unknown): Promise<NetworkState> {
21
21
  const tracingState = extractTraceStateFromOptions(options);
22
- return (await this.getNetworkStateData({ tracingState })) ?? [];
22
+ return this.getNetworkStateData({ tracingState });
23
23
  }
24
24
 
25
25
  async getNetworkStateData({
@@ -32,19 +32,37 @@ class NetworkService implements INetworkService {
32
32
  sqlSpan.end();
33
33
 
34
34
  const processingSpan = tracingState.startSpan('networkState.processing');
35
- const maxBlockHeightInfo = {
36
- canonicalMaxBlockHeight: Number(
37
- rows.filter((row) => row.chain_status === 'canonical')[0].height
38
- ),
39
- pendingMaxBlockHeight: Number(
40
- rows.filter((row) => row.chain_status === 'pending')[0].height
41
- ),
42
- };
43
- const networkState = {
44
- maxBlockHeight: maxBlockHeightInfo
35
+
36
+ // The SQL returns at most one row per chain_status. Either row may be
37
+ // missing on a fresh archive or against a static fixture, so don't
38
+ // assume both are present.
39
+ const canonicalRow = rows.find((r) => r.chain_status === 'canonical');
40
+ const pendingRow = rows.find((r) => r.chain_status === 'pending');
41
+
42
+ // No data at all: surface as maxBlockHeight=null. The schema allows it
43
+ // (NetworkStateOutput.maxBlockHeight is nullable) and it's a clearer
44
+ // signal to clients than fake zeroes.
45
+ if (!canonicalRow && !pendingRow) {
46
+ processingSpan.end();
47
+ return { maxBlockHeight: null };
45
48
  }
49
+
50
+ // canonical ≤ pending by definition. When one side is missing, fall back
51
+ // so the schema's non-null Int! contract is honored without lying:
52
+ // - missing canonical → 0 (no block has been finalized yet)
53
+ // - missing pending → equal to canonical (archive is fully quiesced)
54
+ const canonicalMaxBlockHeight = canonicalRow ? Number(canonicalRow.height) : 0;
55
+ const pendingMaxBlockHeight = pendingRow
56
+ ? Number(pendingRow.height)
57
+ : canonicalMaxBlockHeight;
58
+
46
59
  processingSpan.end();
47
- return networkState;
60
+ return {
61
+ maxBlockHeight: {
62
+ canonicalMaxBlockHeight,
63
+ pendingMaxBlockHeight,
64
+ },
65
+ };
48
66
  }
49
67
 
50
68
  private async executeNetworkStateQuery() {
@@ -0,0 +1,9 @@
1
+ import type { VerificationKeyUpdates } from '../../blockchain/types.js';
2
+ import type { VerificationKeyUpdateFilterInput } from '../../resolvers-types.js';
3
+
4
+ export interface IVerificationKeyUpdatesService {
5
+ getVerificationKeyUpdates(
6
+ input: VerificationKeyUpdateFilterInput,
7
+ options: unknown
8
+ ): Promise<VerificationKeyUpdates>;
9
+ }
@@ -0,0 +1,72 @@
1
+ import type postgres from 'postgres';
2
+ import { BlockStatusFilter } from '../../blockchain/types.js';
3
+ import type { VerificationKeyUpdates } from '../../blockchain/types.js';
4
+ import {
5
+ createBlockInfo,
6
+ createTransactionInfo,
7
+ } from '../../blockchain/utils.js';
8
+ import { throwBlockRangeError } from '../../errors/error.js';
9
+ import type { VerificationKeyUpdateFilterInput } from '../../resolvers-types.js';
10
+ import { BLOCK_RANGE_SIZE } from '../../server/server.js';
11
+ import {
12
+ extractTraceStateFromOptions,
13
+ TracingState,
14
+ } from '../../tracing/tracer.js';
15
+ import { getVerificationKeyUpdatesQuery } from '../../db/sql/verification-key-updates/queries.js';
16
+ import type { IVerificationKeyUpdatesService } from './verification-key-updates-service.interface.js';
17
+
18
+ export class VerificationKeyUpdatesService
19
+ implements IVerificationKeyUpdatesService
20
+ {
21
+ constructor(private readonly client: postgres.Sql) {}
22
+
23
+ async getVerificationKeyUpdates(
24
+ input: VerificationKeyUpdateFilterInput,
25
+ options: unknown
26
+ ): Promise<VerificationKeyUpdates> {
27
+ const tracingState = extractTraceStateFromOptions(options);
28
+ return this.getVerificationKeyUpdateData(input, { tracingState });
29
+ }
30
+
31
+ async getVerificationKeyUpdateData(
32
+ input: VerificationKeyUpdateFilterInput,
33
+ { tracingState }: { tracingState: TracingState }
34
+ ): Promise<VerificationKeyUpdates> {
35
+ this.validateRange(input.from, input.to);
36
+
37
+ const sqlSpan = tracingState.startSpan('verificationKeyUpdates.SQL');
38
+ const rows = await getVerificationKeyUpdatesQuery(
39
+ this.client,
40
+ input.verificationKeyHash,
41
+ input.from,
42
+ input.to,
43
+ input.status ?? BlockStatusFilter.all
44
+ );
45
+ sqlSpan.end();
46
+
47
+ const processingSpan = tracingState.startSpan(
48
+ 'verificationKeyUpdates.processing'
49
+ );
50
+ const updates = rows.map((row) => ({
51
+ accountUpdateId: row.account_update_id.toString(),
52
+ address: row.address,
53
+ tokenId: row.token_id,
54
+ verificationKeyHash: row.verification_key_hash,
55
+ blockInfo: createBlockInfo(row),
56
+ transactionInfo: createTransactionInfo(row),
57
+ }));
58
+ processingSpan.end();
59
+ return updates;
60
+ }
61
+
62
+ private validateRange(from: number, to: number) {
63
+ if (to <= from) {
64
+ throwBlockRangeError('to must be greater than from');
65
+ }
66
+ if (to - from > BLOCK_RANGE_SIZE) {
67
+ throwBlockRangeError(
68
+ `The block range is too large. The maximum range is ${BLOCK_RANGE_SIZE}`
69
+ );
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,9 @@
1
+ import type { ZkappCommands } from '../../blockchain/types.js';
2
+ import type { ZkappCommandFilterOptionsInput } from '../../resolvers-types.js';
3
+
4
+ export interface IZkappCommandsService {
5
+ getZkappCommands(
6
+ input: ZkappCommandFilterOptionsInput,
7
+ options: unknown
8
+ ): Promise<ZkappCommands>;
9
+ }
@@ -0,0 +1,181 @@
1
+ import type postgres from 'postgres';
2
+ import {
3
+ BlockStatusFilter,
4
+ type BlockInfo,
5
+ type ZkappCommand,
6
+ type ZkappCommands,
7
+ } from '../../blockchain/types.js';
8
+ import type { ZkappCommandFilterOptionsInput } from '../../resolvers-types.js';
9
+ import {
10
+ getZkappCommandAccountUpdateCountQuery,
11
+ getZkappCommandsQuery,
12
+ } from '../../db/sql/zkapp-commands/queries.js';
13
+ import type { ZkappCommandDatabaseRow } from '../../db/sql/zkapp-commands/types.js';
14
+ import {
15
+ TracingState,
16
+ extractTraceStateFromOptions,
17
+ } from '../../tracing/tracer.js';
18
+ import {
19
+ ZKAPP_COMMAND_ACCOUNT_UPDATE_LIMIT,
20
+ ZKAPP_COMMAND_RANGE_SIZE,
21
+ } from '../../server/server.js';
22
+ import { throwBlockRangeError } from '../../errors/error.js';
23
+ import type { IZkappCommandsService } from './zkapp-commands-service.interface.js';
24
+
25
+ export { ZkappCommandsService };
26
+ export { normalizeZkappCommandRange };
27
+ export { assertZkappCommandAccountUpdateLimit };
28
+
29
+ function normalizeZkappCommandRange(input: ZkappCommandFilterOptionsInput): {
30
+ from: number;
31
+ to: number;
32
+ } {
33
+ const { from, to } = input;
34
+
35
+ if (from === null || from === undefined || to === null || to === undefined) {
36
+ throwBlockRangeError('from and to are required');
37
+ }
38
+ if (to <= from) {
39
+ throwBlockRangeError('to must be greater than from');
40
+ }
41
+ if (to - from > ZKAPP_COMMAND_RANGE_SIZE) {
42
+ throwBlockRangeError(
43
+ `The zkApp command block range is too large. The maximum range is ${ZKAPP_COMMAND_RANGE_SIZE}`
44
+ );
45
+ }
46
+
47
+ return { from, to };
48
+ }
49
+
50
+ function assertZkappCommandAccountUpdateLimit(accountUpdateCount: number) {
51
+ if (accountUpdateCount > ZKAPP_COMMAND_ACCOUNT_UPDATE_LIMIT) {
52
+ throwBlockRangeError(
53
+ `The zkApp command range expands to ${accountUpdateCount} account updates. The maximum is ${ZKAPP_COMMAND_ACCOUNT_UPDATE_LIMIT}; use a smaller block range.`
54
+ );
55
+ }
56
+ }
57
+
58
+ class ZkappCommandsService implements IZkappCommandsService {
59
+ private readonly client: postgres.Sql;
60
+
61
+ constructor(client: postgres.Sql) {
62
+ this.client = client;
63
+ }
64
+
65
+ async getZkappCommands(
66
+ input: ZkappCommandFilterOptionsInput,
67
+ options: unknown
68
+ ): Promise<ZkappCommands> {
69
+ const tracingState = extractTraceStateFromOptions(options);
70
+ return (await this.getZkappCommandData(input, { tracingState })) ?? [];
71
+ }
72
+
73
+ async getZkappCommandData(
74
+ input: ZkappCommandFilterOptionsInput,
75
+ { tracingState }: { tracingState: TracingState }
76
+ ): Promise<ZkappCommands> {
77
+ const sqlSpan = tracingState.startSpan('zkappCommands.SQL');
78
+ const rows = await this.executeZkappCommandsQuery(input);
79
+ sqlSpan.end();
80
+
81
+ const processingSpan = tracingState.startSpan('zkappCommands.processing');
82
+ const commands = this.rowsToZkappCommands(rows);
83
+ processingSpan.end();
84
+ return commands;
85
+ }
86
+
87
+ private async executeZkappCommandsQuery(
88
+ input: ZkappCommandFilterOptionsInput
89
+ ) {
90
+ const { accountPublicKey, tokenId } = input;
91
+ let { blockStatus } = input;
92
+ const range = normalizeZkappCommandRange(input);
93
+
94
+ blockStatus ||= BlockStatusFilter.all;
95
+ const [{ count }] = await getZkappCommandAccountUpdateCountQuery(
96
+ this.client,
97
+ blockStatus,
98
+ range.to,
99
+ range.from,
100
+ accountPublicKey?.toString(),
101
+ tokenId?.toString()
102
+ );
103
+ assertZkappCommandAccountUpdateLimit(Number(count));
104
+
105
+ return getZkappCommandsQuery(
106
+ this.client,
107
+ blockStatus,
108
+ range.to,
109
+ range.from,
110
+ accountPublicKey?.toString(),
111
+ tokenId?.toString()
112
+ );
113
+ }
114
+
115
+ rowsToZkappCommands(rows: ZkappCommandDatabaseRow[]): ZkappCommands {
116
+ const commandsByKey = new Map<string, ZkappCommand>();
117
+
118
+ for (const row of rows) {
119
+ const commandKey = `${row.state_hash}:${row.sequence_number}:${row.hash}`;
120
+ let command = commandsByKey.get(commandKey);
121
+ if (!command) {
122
+ command = this.createZkappCommand(row);
123
+ commandsByKey.set(commandKey, command);
124
+ }
125
+
126
+ command.accountUpdates.push({
127
+ id: row.account_update_id.toString(),
128
+ publicKey: row.public_key,
129
+ tokenId: row.token_id,
130
+ authorizationKind: row.authorization_kind,
131
+ balanceChange: row.balance_change,
132
+ incrementNonce: row.increment_nonce,
133
+ callDepth: row.call_depth,
134
+ actions: row.actions,
135
+ events: row.events,
136
+ appState: row.app_state,
137
+ accountPrecondition: {
138
+ state: row.account_precondition_state,
139
+ actionState: row.account_precondition_action_state,
140
+ provedState: row.account_precondition_proved_state,
141
+ isNew: row.account_precondition_is_new,
142
+ },
143
+ networkPrecondition: {
144
+ globalSlotSinceGenesis: {
145
+ lowerBound: row.network_precondition_global_slot_lower_bound,
146
+ upperBound: row.network_precondition_global_slot_upper_bound,
147
+ },
148
+ },
149
+ });
150
+ }
151
+
152
+ return Array.from(commandsByKey.values());
153
+ }
154
+
155
+ private createZkappCommand(row: ZkappCommandDatabaseRow): ZkappCommand {
156
+ return {
157
+ blockInfo: this.createBlockInfo(row),
158
+ hash: row.hash,
159
+ feePayer: row.fee_payer,
160
+ fee: row.fee,
161
+ memo: row.memo,
162
+ sequenceNumber: row.sequence_number,
163
+ accountUpdates: [],
164
+ };
165
+ }
166
+
167
+ private createBlockInfo(row: ZkappCommandDatabaseRow): BlockInfo {
168
+ return {
169
+ height: Number(row.height),
170
+ stateHash: row.state_hash,
171
+ parentHash: row.parent_hash,
172
+ ledgerHash: row.ledger_hash,
173
+ chainStatus: row.chain_status,
174
+ timestamp: row.timestamp,
175
+ globalSlotSinceHardfork: Number(row.global_slot_since_hard_fork),
176
+ globalSlotSinceGenesis: Number(row.global_slot_since_genesis),
177
+ distanceFromMaxBlockHeight: Number(row.distance_from_max_block_height),
178
+ lastVrfOutput: row.last_vrf_output,
179
+ };
180
+ }
181
+ }
@@ -11,6 +11,7 @@ import {
11
11
  parseEndpoint,
12
12
  checkJaegerEndpointAvailability,
13
13
  } from './jaeger-setup.js';
14
+ import { parseBoolean } from '../config.js';
14
15
 
15
16
  export { initJaegerProvider };
16
17
 
@@ -20,7 +21,7 @@ function createJaegerExporter(endpoint: string) {
20
21
 
21
22
  async function initJaegerProvider(): Promise<BasicTracerProvider | undefined> {
22
23
  const jaegerEndpoint = process.env.JAEGER_ENDPOINT;
23
- if (!process.env.ENABLE_JAEGER || !jaegerEndpoint) {
24
+ if (!parseBoolean(process.env.ENABLE_JAEGER) || !jaegerEndpoint) {
24
25
  return undefined;
25
26
  }
26
27
 
@@ -1,40 +0,0 @@
1
- import pwd from 'process';
2
- import path from 'path';
3
- import fs from 'fs/promises';
4
- const TYPESCRIPT_OUTPUT_DIR_NAME = process.env.TYPESCRIPT_OUTPUT_DIR_NAME || 'precomputed_ts';
5
- const OCAML_OUTPUT_DIR_NAME = process.env.OCAML_OUTPUT_DIR_NAME || 'precomputed_ocaml';
6
- const TYPESCRIPT_DIR = path.join(pwd.cwd(), TYPESCRIPT_OUTPUT_DIR_NAME);
7
- const OCAML_DIR = path.join(pwd.cwd(), OCAML_OUTPUT_DIR_NAME);
8
- async function compareFiles() {
9
- const typescriptFiles = await fs.readdir(TYPESCRIPT_DIR);
10
- const ocamlFiles = await fs.readdir(OCAML_DIR);
11
- if (typescriptFiles.length !== ocamlFiles.length) {
12
- console.error('Directories do not contain the same number of files!');
13
- console.error(`TypeScript: ${typescriptFiles.length}`);
14
- console.error(`OCaml: ${ocamlFiles.length}`);
15
- return;
16
- }
17
- for (let i = 0; i < typescriptFiles.length; i++) {
18
- const tsFile = typescriptFiles[i];
19
- const ocamlFile = ocamlFiles[i];
20
- if (tsFile !== ocamlFile) {
21
- console.error(`File names do not match! (${tsFile} vs ${ocamlFile})`);
22
- continue;
23
- }
24
- const tsContent = await fs.readFile(path.join(TYPESCRIPT_DIR, tsFile), 'utf-8');
25
- const ocamlContent = await fs.readFile(path.join(OCAML_DIR, ocamlFile), 'utf-8');
26
- const tsContentJson = JSON.parse(tsContent);
27
- const ocamlContentJson = JSON.parse(ocamlContent);
28
- if (tsContentJson['height'] !== ocamlContentJson['height'] ||
29
- tsContentJson['previous_state_hash'] !==
30
- ocamlContentJson['previous_state_hash']) {
31
- console.error(`File contents do not match! (${tsFile}), (${ocamlFile}})`);
32
- console.error(`TypeScript: ${JSON.stringify(tsContentJson)}`);
33
- console.error(`OCaml: ${JSON.stringify(ocamlContentJson)}`);
34
- return;
35
- }
36
- }
37
- console.log('🎉 All files match!');
38
- }
39
- compareFiles();
40
- //# sourceMappingURL=run-compare.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-compare.js","sourceRoot":"","sources":["../../../tests/consensus/run-compare.ts"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,SAAS,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAE7B,MAAM,0BAA0B,GAC9B,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,gBAAgB,CAAC;AAC7D,MAAM,qBAAqB,GACzB,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,mBAAmB,CAAC;AAE3D,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC;AACxE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAC;AAE9D,KAAK,UAAU,YAAY;IACzB,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAG/C,IAAI,eAAe,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,eAAe,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,KAAK,CAAC,UAAU,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAGD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAGhC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,6BAA6B,MAAM,OAAO,SAAS,GAAG,CAAC,CAAC;YACtE,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CACjC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EACjC,OAAO,CACR,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CACpC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAC/B,OAAO,CACR,CAAC;QAEF,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAGlD,IACE,aAAa,CAAC,QAAQ,CAAC,KAAK,gBAAgB,CAAC,QAAQ,CAAC;YACtD,aAAa,CAAC,qBAAqB,CAAC;gBAClC,gBAAgB,CAAC,qBAAqB,CAAC,EACzC,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,gCAAgC,MAAM,OAAO,SAAS,IAAI,CAAC,CAAC;YAC1E,OAAO,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AACrC,CAAC;AAED,YAAY,EAAE,CAAC"}
@@ -1,80 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import { select } from '../../src/consensus/mina-consensus.js';
4
- import { GetSlot, } from './types.js';
5
- const outputDir = process.env.OUTPUT_DIR || 'precomputed_ts';
6
- function readPrecomputedBlocks() {
7
- const directoryPath = path.join(process.cwd(), 'precomputed_berkeley');
8
- const files = fs.readdirSync(directoryPath);
9
- const blocks = [];
10
- for (const file of files) {
11
- const data = fs.readFileSync(path.join(directoryPath, file));
12
- const block = mapPrecomputedToBlockInfo(data.toString());
13
- blocks.push(block);
14
- }
15
- blocks.sort((a, b) => {
16
- if (a.height < b.height)
17
- return -1;
18
- if (a.height > b.height)
19
- return 1;
20
- if (a.timestamp < b.timestamp)
21
- return -1;
22
- if (a.timestamp > b.timestamp)
23
- return 1;
24
- return 0;
25
- });
26
- return blocks;
27
- }
28
- function mapPrecomputedToBlockInfo(block) {
29
- const json = JSON.parse(block);
30
- return {
31
- height: parseInt(json.data.protocol_state.body.consensus_state.blockchain_length),
32
- parentHash: json.data.protocol_state.previous_state_hash,
33
- ledgerHash: json.data.protocol_state.body.blockchain_state.staged_ledger_hash
34
- .non_snark.ledger_hash,
35
- chainStatus: '',
36
- timestamp: json.data.protocol_state.body.constants.genesis_state_timestamp,
37
- globalSlotSinceHardfork: GetSlot(json.data.protocol_state.body.consensus_state.curr_global_slot.slot_number),
38
- globalSlotSinceGenesis: GetSlot(json.data.protocol_state.body.consensus_state.global_slot_since_genesis),
39
- lastVrfOutput: json.data.protocol_state.body.consensus_state.last_vrf_output,
40
- stateHash: '',
41
- distanceFromMaxBlockHeight: 0,
42
- };
43
- }
44
- function runSelect(candidate, currentChain) {
45
- const existing = currentChain[currentChain.length - 1];
46
- const newBlock = select({ blockInfo: existing }, { blockInfo: candidate });
47
- if (newBlock.blockInfo.height > existing.height) {
48
- currentChain.push(newBlock.blockInfo);
49
- return;
50
- }
51
- if (newBlock.blockInfo.height === existing.height) {
52
- currentChain[currentChain.length - 1] = newBlock.blockInfo;
53
- return;
54
- }
55
- }
56
- function writeBlocksOutput(blocks) {
57
- if (!fs.existsSync(outputDir)) {
58
- fs.mkdirSync(outputDir, { recursive: true });
59
- }
60
- for (let i = 0; i < blocks.length; i++) {
61
- const block = blocks[i];
62
- const json = {
63
- height: block.height,
64
- previous_state_hash: block.parentHash,
65
- };
66
- fs.writeFileSync(path.join(process.cwd(), outputDir, `block_${i}.json`), JSON.stringify(json));
67
- }
68
- }
69
- function main() {
70
- const precomputed_blocks = readPrecomputedBlocks();
71
- const [firstBlock, ...restOfPrecomputedBlocks] = precomputed_blocks;
72
- const currentChain = [];
73
- currentChain.push(firstBlock);
74
- for (const precomputed_block of restOfPrecomputedBlocks) {
75
- runSelect(precomputed_block, currentChain);
76
- }
77
- writeBlocksOutput(currentChain);
78
- }
79
- main();
80
- //# sourceMappingURL=select-consensus-precomputed.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"select-consensus-precomputed.js","sourceRoot":"","sources":["../../../tests/consensus/select-consensus-precomputed.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- export var Permission;
2
- (function (Permission) {
3
- Permission["None"] = "None";
4
- Permission["Signature"] = "Signature";
5
- })(Permission || (Permission = {}));
6
- export function GetSlot(slot) {
7
- for (let i = 0; i < slot.length; i++) {
8
- const slotElement = parseInt(slot[i]);
9
- if (!isNaN(slotElement)) {
10
- return slotElement;
11
- }
12
- }
13
- throw new Error('Invalid slot');
14
- }
15
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../tests/consensus/types.ts"],"names":[],"mappings":"AA4CA,MAAM,CAAN,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,qCAAuB,CAAA;AACzB,CAAC,EAHW,UAAU,KAAV,UAAU,QAGrB;AAsGD,MAAM,UAAU,OAAO,CAAC,IAAc;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YACxB,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;AAClC,CAAC"}