@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
@@ -0,0 +1,86 @@
1
+ export { parseBoolean, validateConfig, assertValidConfig };
2
+ const TRUE_VALUES = new Set(['true', '1', 'yes', 'on']);
3
+ const FALSE_VALUES = new Set(['false', '0', 'no', 'off']);
4
+ const BOOLEAN_VARS = [
5
+ 'ENABLE_GRAPHIQL',
6
+ 'ENABLE_INTROSPECTION',
7
+ 'ENABLE_LOGGING',
8
+ 'ENABLE_METRICS',
9
+ 'ENABLE_JAEGER',
10
+ 'ENABLE_BLOCK_TRANSACTION_DETAILS',
11
+ 'ENABLE_ZKAPP_COMMANDS_QUERY',
12
+ ];
13
+ const POSITIVE_INT_VARS = ['PORT', 'BLOCK_RANGE_SIZE'];
14
+ const KNOWN_QUERIES = [
15
+ 'events',
16
+ 'actions',
17
+ 'verificationKeyUpdates',
18
+ 'zkappCommands',
19
+ 'networkState',
20
+ 'blocks',
21
+ ];
22
+ function parseBoolean(value, fallback = false) {
23
+ if (value === undefined)
24
+ return fallback;
25
+ const normalized = value.trim().toLowerCase();
26
+ if (normalized === '')
27
+ return fallback;
28
+ if (TRUE_VALUES.has(normalized))
29
+ return true;
30
+ if (FALSE_VALUES.has(normalized))
31
+ return false;
32
+ return fallback;
33
+ }
34
+ function isRecognisedBoolean(value) {
35
+ const normalized = value.trim().toLowerCase();
36
+ return TRUE_VALUES.has(normalized) || FALSE_VALUES.has(normalized);
37
+ }
38
+ function validateConfig(env = process.env) {
39
+ const errors = [];
40
+ if (!env.PG_CONN || env.PG_CONN.trim() === '') {
41
+ errors.push('PG_CONN is required (Postgres connection string).');
42
+ }
43
+ for (const name of BOOLEAN_VARS) {
44
+ const value = env[name];
45
+ if (value !== undefined &&
46
+ value.trim() !== '' &&
47
+ !isRecognisedBoolean(value)) {
48
+ errors.push(`${name} must be a boolean (true/false), got "${value}".`);
49
+ }
50
+ }
51
+ for (const name of POSITIVE_INT_VARS) {
52
+ const value = env[name];
53
+ if (value !== undefined && value.trim() !== '') {
54
+ const parsed = Number(value);
55
+ if (!Number.isInteger(parsed) || parsed <= 0) {
56
+ errors.push(`${name} must be a positive integer, got "${value}".`);
57
+ }
58
+ }
59
+ }
60
+ const enabledQueries = env.ENABLED_QUERIES;
61
+ if (enabledQueries !== undefined) {
62
+ const names = enabledQueries
63
+ .split(',')
64
+ .map((query) => query.trim())
65
+ .filter((query) => query !== '');
66
+ if (names.length === 0) {
67
+ errors.push('ENABLED_QUERIES is set but lists no queries; unset it to expose all of ' +
68
+ `${KNOWN_QUERIES.join(', ')}.`);
69
+ }
70
+ const unknown = names.filter((name) => !KNOWN_QUERIES.includes(name) &&
71
+ name !== 'schemaVersion');
72
+ if (unknown.length > 0) {
73
+ errors.push(`ENABLED_QUERIES contains unknown queries: ${unknown.join(', ')}. ` +
74
+ `Known queries: ${KNOWN_QUERIES.join(', ')}. ` +
75
+ 'schemaVersion is always served and does not need listing.');
76
+ }
77
+ }
78
+ return errors;
79
+ }
80
+ function assertValidConfig(env = process.env) {
81
+ const errors = validateConfig(env);
82
+ if (errors.length > 0) {
83
+ throw new Error(`Invalid configuration:\n${errors.map((e) => ` - ${e}`).join('\n')}`);
84
+ }
85
+ }
86
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,29 @@
1
1
  import postgres from 'postgres';
2
2
  import { getTables, USED_TABLES } from '../../db/sql/events-actions/queries.js';
3
+ import { buildPostgresOptions } from './postgres-options.js';
3
4
  import { EventsService } from '../../services/events-service/events-service.js';
4
5
  import { ActionsService } from '../../services/actions-service/actions-service.js';
6
+ import { ZkappCommandsService } from '../../services/zkapp-commands-service/zkapp-commands-service.js';
5
7
  import { NetworkService } from '../../services/network-service/network-service.js';
6
8
  import { BlocksService } from '../../services/blocks-service/blocks-service.js';
9
+ import { VerificationKeyUpdatesService } from '../../services/verification-key-updates-service/verification-key-updates-service.js';
10
+ const PING_CONNECT_TIMEOUT_S = 2;
7
11
  export class ArchiveNodeAdapter {
8
12
  constructor(connectionString) {
9
13
  if (!connectionString)
10
14
  throw new Error('Missing Postgres Connection String. Please provide a valid connection string in the environment variables or in your configuration file to connect to the Postgres database.');
11
- this.client = postgres(connectionString);
15
+ this.client = postgres(connectionString, buildPostgresOptions());
16
+ this.pingClient = postgres(connectionString, {
17
+ max: 1,
18
+ idle_timeout: 60,
19
+ connect_timeout: PING_CONNECT_TIMEOUT_S,
20
+ });
12
21
  this.eventsService = new EventsService(this.client);
13
22
  this.actionsService = new ActionsService(this.client);
23
+ this.zkappCommandsService = new ZkappCommandsService(this.client);
14
24
  this.networkService = new NetworkService(this.client);
15
25
  this.blocksService = new BlocksService(this.client);
26
+ this.verificationKeyUpdatesService = new VerificationKeyUpdatesService(this.client);
16
27
  }
17
28
  async getEvents(input, options) {
18
29
  return this.eventsService.getEvents(input, options);
@@ -20,9 +31,15 @@ export class ArchiveNodeAdapter {
20
31
  async getActions(input, options) {
21
32
  return this.actionsService.getActions(input, options);
22
33
  }
34
+ async getZkappCommands(input, options) {
35
+ return this.zkappCommandsService.getZkappCommands(input, options);
36
+ }
23
37
  async getNetworkState(options) {
24
38
  return this.networkService.getNetworkState(options);
25
39
  }
40
+ async getVerificationKeyUpdates(input, options) {
41
+ return this.verificationKeyUpdatesService.getVerificationKeyUpdates(input, options);
42
+ }
26
43
  async getBlocks(query, limit, sortBy, options) {
27
44
  return this.blocksService.getBlocks(query, limit, sortBy, options);
28
45
  }
@@ -40,8 +57,18 @@ export class ArchiveNodeAdapter {
40
57
  }
41
58
  }
42
59
  }
60
+ async ping() {
61
+ try {
62
+ await this.pingClient `SELECT 1`;
63
+ return true;
64
+ }
65
+ catch (error) {
66
+ console.warn(`[readiness] database ping failed: ${error instanceof Error ? error.message : String(error)}`);
67
+ return false;
68
+ }
69
+ }
43
70
  async close() {
44
- return this.client.end();
71
+ await Promise.all([this.client.end(), this.pingClient.end()]);
45
72
  }
46
73
  }
47
74
  //# sourceMappingURL=archive-node-adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"archive-node-adapter.js","sourceRoot":"","sources":["../../../../src/db/archive-node-adapter/archive-node-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAchC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAEhF,OAAO,EAAE,cAAc,EAAE,MAAM,mDAAmD,CAAC;AAEnF,OAAO,EAAE,cAAc,EAAE,MAAM,mDAAmD,CAAC;AAEnF,OAAO,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAGhF,MAAM,OAAO,kBAAkB;IAa7B,YAAY,gBAAoC;QAC9C,IAAI,CAAC,gBAAgB;YACnB,MAAM,IAAI,KAAK,CACb,8KAA8K,CAC/K,CAAC;QACJ,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,SAAS,CACb,KAA8B,EAC9B,OAAgB;QAEhB,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,UAAU,CACd,KAA+B,EAC/B,OAAgB;QAEhB,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAgB;QACpC,OAAO,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,SAAS,CACb,KAAyC,EACzC,KAAgC,EAChC,MAA2C,EAC3C,OAAgB;QAEhB,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,CACb,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAC7B,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,kLAAkL,CAAC,EAAE,CACtL,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CACb,iBAAiB,KAAK,sDAAsD,CAC7E,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IAC3B,CAAC;CACF"}
1
+ {"version":3,"file":"archive-node-adapter.js","sourceRoot":"","sources":["../../../../src/db/archive-node-adapter/archive-node-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export { buildPostgresOptions, resolvePoolConfig, POOL_DEFAULTS };
2
+ const POOL_DEFAULTS = {
3
+ max: 10,
4
+ idleTimeout: 30,
5
+ connectTimeout: 30,
6
+ statementTimeout: 15_000,
7
+ };
8
+ function intFromEnv(value, fallback) {
9
+ if (value === undefined || value.trim() === '')
10
+ return fallback;
11
+ const parsed = Number(value);
12
+ if (!Number.isInteger(parsed) || parsed < 0)
13
+ return fallback;
14
+ return parsed;
15
+ }
16
+ function resolvePoolConfig(env = process.env) {
17
+ return {
18
+ max: Math.max(1, intFromEnv(env.PG_MAX_CONNECTIONS, POOL_DEFAULTS.max)),
19
+ idleTimeout: intFromEnv(env.PG_IDLE_TIMEOUT, POOL_DEFAULTS.idleTimeout),
20
+ connectTimeout: intFromEnv(env.PG_CONNECT_TIMEOUT, POOL_DEFAULTS.connectTimeout),
21
+ statementTimeout: intFromEnv(env.PG_STATEMENT_TIMEOUT, POOL_DEFAULTS.statementTimeout),
22
+ };
23
+ }
24
+ function buildPostgresOptions(env = process.env) {
25
+ const config = resolvePoolConfig(env);
26
+ return {
27
+ max: config.max,
28
+ idle_timeout: config.idleTimeout,
29
+ connect_timeout: config.connectTimeout,
30
+ connection: {
31
+ statement_timeout: String(config.statementTimeout),
32
+ },
33
+ };
34
+ }
35
+ //# sourceMappingURL=postgres-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-options.js","sourceRoot":"","sources":["../../../../src/db/archive-node-adapter/postgres-options.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,aAAa,EAAE,CAAC;AA4BlE,MAAM,aAAa,GAAuB;IACxC,GAAG,EAAE,EAAE;IACP,WAAW,EAAE,EAAE;IACf,cAAc,EAAE,EAAE;IAClB,gBAAgB,EAAE,MAAM;CACzB,CAAC;AAOF,SAAS,UAAU,CAAC,KAAyB,EAAE,QAAgB;IAC7D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7D,OAAO,MAAM,CAAC;AAChB,CAAC;AAID,SAAS,iBAAiB,CAAC,MAAiB,OAAO,CAAC,GAAG;IACrD,OAAO;QAEL,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,kBAAkB,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;QACvE,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,WAAW,CAAC;QACvE,cAAc,EAAE,UAAU,CACxB,GAAG,CAAC,kBAAkB,EACtB,aAAa,CAAC,cAAc,CAC7B;QACD,gBAAgB,EAAE,UAAU,CAC1B,GAAG,CAAC,oBAAoB,EACxB,aAAa,CAAC,gBAAgB,CAC/B;KACF,CAAC;AACJ,CAAC;AAOD,SAAS,oBAAoB,CAC3B,MAAiB,OAAO,CAAC,GAAG;IAE5B,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,YAAY,EAAE,MAAM,CAAC,WAAW;QAChC,eAAe,EAAE,MAAM,CAAC,cAAc;QACtC,UAAU,EAAE;YAMV,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAsB;SACxE;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export const BEST_CHAIN_TIP_HEIGHT_SQL = "(SELECT MAX(height) FROM blocks WHERE chain_status <> 'orphaned')";
2
+ export function bestChainTipHeight(db_client) {
3
+ return db_client.unsafe(BEST_CHAIN_TIP_HEIGHT_SQL);
4
+ }
5
+ //# sourceMappingURL=best-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"best-chain.js","sourceRoot":"","sources":["../../../../src/db/sql/best-chain.ts"],"names":[],"mappings":"AAwBA,MAAM,CAAC,MAAM,yBAAyB,GACpC,mEAAmE,CAAC;AAMtE,MAAM,UAAU,kBAAkB,CAAC,SAAuB;IACxD,OAAO,SAAS,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;AACrD,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { BlockStatusFilter } from '../../../blockchain/types.js';
2
2
  import { BLOCK_RANGE_SIZE } from '../../../server/server.js';
3
+ import { bestChainTipHeight } from '../best-chain.js';
3
4
  function fullChainCTE(db_client, from, to) {
4
5
  let toAsNum = to ? Number(to) : undefined;
5
6
  let fromAsNum = from ? Number(from) : undefined;
@@ -18,20 +19,25 @@ function fullChainCTE(db_client, from, to) {
18
19
  FROM
19
20
  blocks b
20
21
  WHERE
21
- height = (SELECT max(height) FROM blocks)
22
+ height = ${bestChainTipHeight(db_client)}
22
23
  )
23
24
  UNION ALL
24
25
  SELECT
25
26
  b.id, b.state_hash, b.parent_hash, b.parent_id, b.height, b.global_slot_since_genesis, b.global_slot_since_hard_fork, b.timestamp, b.chain_status, b.ledger_hash, b.last_vrf_output
26
27
  FROM
27
28
  blocks b
29
+ -- The walk terminates because genesis has parent_id = NULL, so the
30
+ -- id = parent_id join can never match there. No block is its own parent
31
+ -- (parent_id is a FK to blocks.id; a self-reference would be a cycle), so
32
+ -- no explicit id <> parent_id guard is needed. A schema/hard-fork change
33
+ -- that ever self-references a block would loop here — see the matching
34
+ -- note in getZkappsWithPendingEventsQuery.
28
35
  INNER JOIN pending_chain ON b.id = pending_chain.parent_id
29
- AND pending_chain.id <> pending_chain.parent_id
30
36
  AND pending_chain.chain_status <> 'canonical'
31
- ),
37
+ ),
32
38
  full_chain AS (
33
39
  SELECT
34
- DISTINCT id, state_hash, parent_id, parent_hash, height, global_slot_since_genesis, global_slot_since_hard_fork, timestamp, chain_status, ledger_hash, (SELECT max(height) FROM blocks) - height AS distance_from_max_block_height, last_vrf_output
40
+ DISTINCT id, state_hash, parent_id, parent_hash, height, global_slot_since_genesis, global_slot_since_hard_fork, timestamp, chain_status, ledger_hash, ${bestChainTipHeight(db_client)} - height AS distance_from_max_block_height, last_vrf_output
35
41
  FROM
36
42
  (
37
43
  SELECT
@@ -54,10 +60,7 @@ function fullChainCTE(db_client, from, to) {
54
60
  chain_status = 'canonical'
55
61
  ${fromAsNum
56
62
  ? db_client `AND b.height >= ${fromAsNum} AND b.height < ${toAsNum}`
57
- : db_client `AND b.height >= (
58
- SELECT MAX(b2.height)
59
- FROM blocks b2
60
- ) - ${BLOCK_RANGE_SIZE}`}
63
+ : db_client `AND b.height >= ${bestChainTipHeight(db_client)} - ${BLOCK_RANGE_SIZE}`}
61
64
  ) AS full_chain
62
65
  )
63
66
  `;
@@ -232,7 +235,7 @@ function emittedActionsCTE(db_client) {
232
235
  )
233
236
  `;
234
237
  }
235
- function emittedActionStateCTE(db_client, fromActionState, endActionState) {
238
+ function emittedActionStateCTE(db_client, fromActionStateHeight, endActionStateHeight) {
236
239
  return db_client `
237
240
  emitted_action_state AS (
238
241
  SELECT
@@ -282,11 +285,25 @@ function emittedActionStateCTE(db_client, fromActionState, endActionState) {
282
285
  INNER JOIN zkapp_field zkf4 ON zkf4.id = zks.element4
283
286
  WHERE
284
287
  1 = 1
285
- ${fromActionState
286
- ? db_client `AND zkf0.id >= (SELECT id FROM zkapp_field WHERE field = ${fromActionState})`
288
+ -- Filter on the position of the checkpoint ON THE CHAIN, resolved by
289
+ -- resolveActionStateBoundary() before this query runs.
290
+ --
291
+ -- This used to compare zkf0.id against the id of the requested action state.
292
+ -- zkapp_field is the interning table for every field value in the archive,
293
+ -- and its id records when a value was FIRST WRITTEN, not where it sits on
294
+ -- the chain. Any archive filled out of chain order — a bulk import, a
295
+ -- hard-fork migration, a bootstrap — breaks that assumption, and the filter
296
+ -- then silently dropped real actions or returned actions from before the
297
+ -- checkpoint. See tests/integration/action-state-ordering.test.ts.
298
+ --
299
+ -- Greater-or-equal keeps the checkpoint's own block in the answer. o1js
300
+ -- removes it in createActionsList by comparing actionStateOne with the
301
+ -- requested value, so excluding it here would change what clients receive.
302
+ ${fromActionStateHeight
303
+ ? db_client `AND emitted_actions.height >= ${fromActionStateHeight}`
287
304
  : db_client ``}
288
- ${endActionState
289
- ? db_client `AND zkf0.id <= (SELECT id FROM zkapp_field WHERE field = ${endActionState})`
305
+ ${endActionStateHeight
306
+ ? db_client `AND emitted_actions.height <= ${endActionStateHeight}`
290
307
  : db_client ``}
291
308
  )`;
292
309
  }
@@ -332,15 +349,15 @@ export function getEventsQuery(db_client, address, tokenId, status, to, from) {
332
349
  FROM emitted_events
333
350
  `;
334
351
  }
335
- export function getActionsQuery(db_client, address, tokenId, status, to, from, fromActionState, endActionState) {
352
+ export function getActionsQuery(db_client, address, tokenId, status, to, from, fromActionStateHeight, endActionStateHeight) {
336
353
  return db_client `
337
- WITH
354
+ WITH
338
355
  ${fullChainCTE(db_client, from, to)},
339
356
  ${accountIdentifierCTE(db_client, address, tokenId)},
340
357
  ${blocksAccessedCTE(db_client, status)},
341
358
  ${emittedZkAppCommandsCTE(db_client)},
342
359
  ${emittedActionsCTE(db_client)},
343
- ${emittedActionStateCTE(db_client, fromActionState, endActionState)}
360
+ ${emittedActionStateCTE(db_client, fromActionStateHeight, endActionStateHeight)}
344
361
  SELECT *
345
362
  FROM emitted_action_state
346
363
  `;
@@ -362,9 +379,60 @@ JOIN max_heights mh
362
379
  AND b.height = mh.max_height;
363
380
  `;
364
381
  }
365
- export function checkActionState(db_client, actionState) {
382
+ export function resolveActionStateBoundary(db_client, address, tokenId, actionState, from, to) {
383
+ const fromAsNum = from ? Number(from) : null;
384
+ const toAsNum = to ? Number(to) : null;
366
385
  return db_client `
367
- SELECT field FROM zkapp_field WHERE field = ${actionState}
386
+ WITH RECURSIVE pending_chain AS (
387
+ (
388
+ SELECT id, parent_id, chain_status
389
+ FROM blocks
390
+ WHERE height = ${bestChainTipHeight(db_client)}
391
+ )
392
+ UNION ALL
393
+ SELECT b.id, b.parent_id, b.chain_status
394
+ FROM blocks b
395
+ -- Same invariant as fullChainCTE: genesis has parent_id = NULL, and no
396
+ -- block is its own parent, so an explicit id <> parent_id guard never
397
+ -- excludes a row.
398
+ INNER JOIN pending_chain ON b.id = pending_chain.parent_id
399
+ AND pending_chain.chain_status <> 'canonical'
400
+ ),
401
+ bounds AS (
402
+ SELECT ${fromAsNum !== null
403
+ ? db_client `${fromAsNum}::bigint`
404
+ : toAsNum !== null
405
+ ? db_client `${toAsNum - BLOCK_RANGE_SIZE}::bigint`
406
+ : db_client `${bestChainTipHeight(db_client)} - ${BLOCK_RANGE_SIZE}::bigint`} AS window_start
407
+ ),
408
+ target AS (
409
+ SELECT id FROM zkapp_field WHERE field = ${actionState}
410
+ ),
411
+ account_action_states AS (
412
+ SELECT b.height, zks.element0 AS state_field_id
413
+ FROM accounts_accessed aa
414
+ INNER JOIN blocks b ON b.id = aa.block_id
415
+ INNER JOIN zkapp_accounts zkacc ON zkacc.id = aa.zkapp_id
416
+ INNER JOIN zkapp_action_states zks ON zks.id = zkacc.action_state_id
417
+ WHERE aa.account_identifier_id = (
418
+ SELECT ai.id FROM account_identifiers ai
419
+ WHERE ai.public_key_id = (SELECT id FROM public_keys WHERE value = ${address})
420
+ AND ai.token_id = (SELECT id FROM tokens WHERE value = ${tokenId})
421
+ )
422
+ AND (b.chain_status = 'canonical' OR b.id IN (SELECT id FROM pending_chain))
423
+ )
424
+ SELECT
425
+ (
426
+ SELECT min(height) FROM account_action_states
427
+ WHERE state_field_id = (SELECT id FROM target)
428
+ ) AS boundary_height,
429
+ (SELECT window_start FROM bounds) AS window_start,
430
+ (
431
+ SELECT state_field_id FROM account_action_states
432
+ WHERE height < (SELECT window_start FROM bounds)
433
+ ORDER BY height DESC
434
+ LIMIT 1
435
+ ) = (SELECT id FROM target) AS state_entering_window
368
436
  `;
369
437
  }
370
438
  export function getTables(db_client) {
@@ -375,16 +443,27 @@ export function getTables(db_client) {
375
443
  export const USED_TABLES = [
376
444
  'blocks',
377
445
  'account_identifiers',
446
+ 'public_keys',
447
+ 'tokens',
378
448
  'accounts_accessed',
379
449
  'blocks_zkapp_commands',
450
+ 'public_keys',
451
+ 'tokens',
380
452
  'zkapp_commands',
453
+ 'zkapp_fee_payer_body',
381
454
  'zkapp_account_update',
382
455
  'zkapp_account_update_body',
456
+ 'zkapp_updates',
383
457
  'zkapp_events',
384
458
  'zkapp_field_array',
385
459
  'zkapp_field',
460
+ 'zkapp_account_precondition',
461
+ 'zkapp_network_precondition',
462
+ 'zkapp_global_slot_bounds',
463
+ 'zkapp_states_nullable',
386
464
  'zkapp_verification_key_hashes',
387
465
  'zkapp_verification_keys',
466
+ 'zkapp_updates',
388
467
  'zkapp_accounts',
389
468
  'zkapp_action_states',
390
469
  ];
@@ -394,17 +473,19 @@ export function getZkappsWithPendingEventsQuery(db_client) {
394
473
  -- start at the tip
395
474
  SELECT id, parent_id, chain_status
396
475
  FROM blocks
397
- WHERE height = (SELECT MAX(height) FROM blocks)
476
+ WHERE height = ${bestChainTipHeight(db_client)}
398
477
 
399
478
  UNION ALL
400
479
 
401
480
  -- walk back until we re-join the canonical branch
481
+ -- The id <> parent_id guard was dropped here for the same reason as in
482
+ -- fullChainCTE: no block is its own parent, so it never excludes a row, and
483
+ -- the walk terminates on genesis's NULL parent_id regardless.
402
484
  SELECT b.id, b.parent_id, b.chain_status
403
485
  FROM blocks b
404
486
  JOIN pending_chain pc
405
487
  ON b.id = pc.parent_id
406
- WHERE pc.id <> pc.parent_id
407
- AND pc.chain_status <> 'canonical'
488
+ WHERE pc.chain_status <> 'canonical'
408
489
  )
409
490
  SELECT DISTINCT
410
491
  pk.value AS public_key
@@ -1 +1 @@
1
- {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../../../src/db/sql/events-actions/queries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../../../src/db/sql/events-actions/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import { BlockStatusFilter } from '../../../blockchain/types.js';
2
+ export function getVerificationKeyUpdatesQuery(client, verificationKeyHash, from, to, status) {
3
+ const statusClause = status === BlockStatusFilter.all
4
+ ? client `AND b.chain_status <> 'orphaned'`
5
+ : client `AND b.chain_status = ${status.toLowerCase()}`;
6
+ return client `
7
+ WITH RECURSIVE pending_chain AS (
8
+ SELECT id, parent_id
9
+ FROM blocks
10
+ WHERE chain_status = 'pending'
11
+ AND height = (
12
+ SELECT MAX(height) FROM blocks WHERE chain_status = 'pending'
13
+ )
14
+
15
+ UNION ALL
16
+
17
+ SELECT parent.id, parent.parent_id
18
+ FROM blocks parent
19
+ INNER JOIN pending_chain child ON parent.id = child.parent_id
20
+ WHERE parent.chain_status <> 'canonical'
21
+ AND child.id <> child.parent_id
22
+ ),
23
+ -- Resolve the requested hash to the set of zkapp_updates rows that SET
24
+ -- that verification key, before touching any block. The set is small — one
25
+ -- row per distinct update that ever wrote this key — and MATERIALIZED
26
+ -- keeps the planner from inlining it back into the join tree, where it
27
+ -- would hash the whole of zkapp_updates and zkapp_account_update_body once
28
+ -- per query. Measured on a 681k-block devnet archive over the maximum
29
+ -- 10 000-block range: 405 ms inlined, 199 ms materialised.
30
+ target_updates AS MATERIALIZED (
31
+ SELECT zu.id
32
+ FROM zkapp_verification_key_hashes vkh
33
+ INNER JOIN zkapp_verification_keys vk ON vk.hash_id = vkh.id
34
+ INNER JOIN zkapp_updates zu ON zu.verification_key_id = vk.id
35
+ WHERE vkh.value = ${verificationKeyHash}
36
+ ),
37
+ full_chain AS (
38
+ SELECT b.*
39
+ FROM blocks b
40
+ WHERE b.height >= ${from}
41
+ AND b.height < ${to}
42
+ AND (
43
+ b.chain_status = 'canonical'
44
+ OR b.id IN (SELECT id FROM pending_chain)
45
+ )
46
+ )
47
+ SELECT
48
+ zau.id AS account_update_id,
49
+ pk.value AS address,
50
+ t.value AS token_id,
51
+ ${verificationKeyHash}::text AS verification_key_hash,
52
+ b.state_hash,
53
+ b.parent_hash,
54
+ b.height,
55
+ b.global_slot_since_genesis,
56
+ b.global_slot_since_hard_fork,
57
+ b.timestamp,
58
+ b.chain_status,
59
+ b.ledger_hash,
60
+ (SELECT MAX(height) FROM blocks) - b.height
61
+ AS distance_from_max_block_height,
62
+ b.last_vrf_output,
63
+ bzc.status,
64
+ zc.hash,
65
+ zc.memo,
66
+ zaub.authorization_kind,
67
+ bzc.sequence_no AS sequence_number,
68
+ zc.zkapp_account_updates_ids
69
+ FROM full_chain b
70
+ INNER JOIN blocks_zkapp_commands bzc ON bzc.block_id = b.id
71
+ INNER JOIN zkapp_commands zc ON zc.id = bzc.zkapp_command_id
72
+ INNER JOIN LATERAL UNNEST(zc.zkapp_account_updates_ids)
73
+ WITH ORDINALITY AS update_ref(id, position) ON TRUE
74
+ INNER JOIN zkapp_account_update zau ON zau.id = update_ref.id
75
+ -- An account update SETS a verification key through update_id. The other
76
+ -- column that names a verification key on this table,
77
+ -- verification_key_hash_id, is the PRECONDITION: the key the update
78
+ -- requires the account to already have. Filtering on that one would answer
79
+ -- "who called this contract" instead of "who deployed it".
80
+ INNER JOIN zkapp_account_update_body zaub ON zaub.id = zau.body_id
81
+ AND zaub.update_id IN (SELECT id FROM target_updates)
82
+ INNER JOIN account_identifiers ai ON ai.id = zaub.account_identifier_id
83
+ INNER JOIN public_keys pk ON pk.id = ai.public_key_id
84
+ INNER JOIN tokens t ON t.id = ai.token_id
85
+ WHERE bzc.status = 'applied'
86
+ ${statusClause}
87
+ -- state_hash is what makes this order total. Two competing tips sit at the
88
+ -- same height, and pending_chain seeds from every block at the maximum
89
+ -- pending height, so both are in the answer. A command carried by both —
90
+ -- the normal case during a reorg; one command was measured in 8 blocks at
91
+ -- a single height on devnet — then produces rows that agree on height,
92
+ -- sequence_no, account-update position and zkapp_account_update.id alike.
93
+ ORDER BY
94
+ b.height ASC,
95
+ b.state_hash ASC,
96
+ bzc.sequence_no ASC,
97
+ update_ref.position ASC
98
+ `;
99
+ }
100
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../../../src/db/sql/verification-key-updates/queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAyBjE,MAAM,UAAU,8BAA8B,CAC5C,MAAoB,EACpB,mBAA2B,EAC3B,IAAY,EACZ,EAAU,EACV,MAAyB;IAEzB,MAAM,YAAY,GAChB,MAAM,KAAK,iBAAiB,CAAC,GAAG;QAC9B,CAAC,CAAC,MAAM,CAAA,kCAAkC;QAC1C,CAAC,CAAC,MAAM,CAAA,wBAAwB,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;IAE3D,OAAO,MAAM,CAAoC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BA6BvB,mBAAmB;;;;;4BAKnB,IAAI;2BACL,EAAE;;;;;;;;;;UAUnB,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAmCnB,YAAY;;;;;;;;;;;;KAYjB,CAAC;AACN,CAAC"}