@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.
- package/LICENSE +201 -0
- package/README.md +92 -268
- package/build/src/blockchain/utils.js.map +1 -1
- package/build/src/config.js +86 -0
- package/build/src/config.js.map +1 -0
- package/build/src/db/archive-node-adapter/archive-node-adapter.js +29 -2
- package/build/src/db/archive-node-adapter/archive-node-adapter.js.map +1 -1
- package/build/src/db/archive-node-adapter/postgres-options.js +35 -0
- package/build/src/db/archive-node-adapter/postgres-options.js.map +1 -0
- package/build/src/db/sql/best-chain.js +5 -0
- package/build/src/db/sql/best-chain.js.map +1 -0
- package/build/src/db/sql/events-actions/queries.js +102 -21
- package/build/src/db/sql/events-actions/queries.js.map +1 -1
- package/build/src/db/sql/verification-key-updates/queries.js +100 -0
- package/build/src/db/sql/verification-key-updates/queries.js.map +1 -0
- package/build/src/db/sql/zkapp-commands/queries.js +363 -0
- package/build/src/db/sql/zkapp-commands/queries.js.map +1 -0
- package/build/src/db/sql/zkapp-commands/types.js +2 -0
- package/build/src/db/sql/zkapp-commands/types.js.map +1 -0
- package/build/src/errors/error.js +4 -1
- package/build/src/errors/error.js.map +1 -1
- package/build/src/index.js +44 -7
- package/build/src/index.js.map +1 -1
- package/build/src/resolvers.js +42 -23
- package/build/src/resolvers.js.map +1 -1
- package/build/src/schema-version.js +2 -0
- package/build/src/schema-version.js.map +1 -0
- package/build/src/server/cors.js +41 -0
- package/build/src/server/cors.js.map +1 -0
- package/build/src/server/graceful-shutdown.js +42 -0
- package/build/src/server/graceful-shutdown.js.map +1 -0
- package/build/src/server/graphql-armor.js +39 -0
- package/build/src/server/graphql-armor.js.map +1 -0
- package/build/src/server/logger.js +45 -0
- package/build/src/server/logger.js.map +1 -0
- package/build/src/server/metrics.js +72 -0
- package/build/src/server/metrics.js.map +1 -0
- package/build/src/server/plugins.js +31 -15
- package/build/src/server/plugins.js.map +1 -1
- package/build/src/server/rate-limit.js +143 -0
- package/build/src/server/rate-limit.js.map +1 -0
- package/build/src/server/readiness.js +45 -0
- package/build/src/server/readiness.js.map +1 -0
- package/build/src/server/request-logging.js +58 -0
- package/build/src/server/request-logging.js.map +1 -0
- package/build/src/server/server.js +38 -13
- package/build/src/server/server.js.map +1 -1
- package/build/src/services/actions-service/actions-service.js +26 -15
- package/build/src/services/actions-service/actions-service.js.map +1 -1
- package/build/src/services/blocks-service/blocks-service.js +10 -9
- package/build/src/services/blocks-service/blocks-service.js.map +1 -1
- package/build/src/services/network-service/network-service.js +17 -9
- package/build/src/services/network-service/network-service.js.map +1 -1
- package/build/src/services/verification-key-updates-service/verification-key-updates-service.interface.js +2 -0
- package/build/src/services/verification-key-updates-service/verification-key-updates-service.interface.js.map +1 -0
- package/build/src/services/verification-key-updates-service/verification-key-updates-service.js +41 -0
- package/build/src/services/verification-key-updates-service/verification-key-updates-service.js.map +1 -0
- package/build/src/services/zkapp-commands-service/zkapp-commands-service.interface.js +2 -0
- package/build/src/services/zkapp-commands-service/zkapp-commands-service.interface.js.map +1 -0
- package/build/src/services/zkapp-commands-service/zkapp-commands-service.js +115 -0
- package/build/src/services/zkapp-commands-service/zkapp-commands-service.js.map +1 -0
- package/build/src/tracing/jaeger-tracing.js +2 -1
- package/build/src/tracing/jaeger-tracing.js.map +1 -1
- package/build/tests/devnet-dump/action-state-invariants.js +165 -0
- package/build/tests/devnet-dump/action-state-invariants.js.map +1 -0
- package/build/tests/devnet-dump/devnet-dump.test.js +24 -10
- package/build/tests/devnet-dump/devnet-dump.test.js.map +1 -1
- package/build/tests/devnet-dump/setup.js +63 -17
- package/build/tests/devnet-dump/setup.js.map +1 -1
- package/build/tests/integration/action-state-ordering.test.js +139 -0
- package/build/tests/integration/action-state-ordering.test.js.map +1 -0
- package/build/tests/integration/action-state-setup.js +48 -0
- package/build/tests/integration/action-state-setup.js.map +1 -0
- package/build/tests/integration/consensus-vs-chain.test.js +81 -0
- package/build/tests/integration/consensus-vs-chain.test.js.map +1 -0
- package/build/tests/integration/integration.test.js +166 -2
- package/build/tests/integration/integration.test.js.map +1 -1
- package/build/tests/integration/postgres-timeout.test.js +92 -0
- package/build/tests/integration/postgres-timeout.test.js.map +1 -0
- package/build/tests/integration/setup.js +58 -1
- package/build/tests/integration/setup.js.map +1 -1
- package/build/tests/integration/verification-key-setup.js +49 -0
- package/build/tests/integration/verification-key-setup.js.map +1 -0
- package/build/tests/integration/verification-key-updates.test.js +159 -0
- package/build/tests/integration/verification-key-updates.test.js.map +1 -0
- package/build/tests/live-api/events.test.js +11 -7
- package/build/tests/live-api/events.test.js.map +1 -1
- package/build/tests/live-api/networkState.test.js +1 -0
- package/build/tests/live-api/networkState.test.js.map +1 -1
- package/build/tests/live-network/live-network.test.js +1 -0
- package/build/tests/live-network/live-network.test.js.map +1 -1
- package/build/tests/resolvers.test.js +65 -37
- package/build/tests/resolvers.test.js.map +1 -1
- package/build/tests/services/verification-key-updates-service/verification-key-updates-service.test.js +35 -0
- package/build/tests/services/verification-key-updates-service/verification-key-updates-service.test.js.map +1 -0
- package/build/tests/services/zkapp-commands-service/zkapp-commands-service.test.js +159 -0
- package/build/tests/services/zkapp-commands-service/zkapp-commands-service.test.js.map +1 -0
- package/build/tests/test-helpers.js +15 -0
- package/build/tests/test-helpers.js.map +1 -1
- package/build/tests/unit/best-chain-anchor.test.js +70 -0
- package/build/tests/unit/best-chain-anchor.test.js.map +1 -0
- package/build/tests/unit/config.test.js +106 -0
- package/build/tests/unit/config.test.js.map +1 -0
- package/build/tests/unit/cors.test.js +95 -0
- package/build/tests/unit/cors.test.js.map +1 -0
- package/build/tests/unit/error-masking.test.js +119 -0
- package/build/tests/unit/error-masking.test.js.map +1 -0
- package/build/tests/unit/graceful-shutdown.test.js +99 -0
- package/build/tests/unit/graceful-shutdown.test.js.map +1 -0
- package/build/tests/unit/graphql-armor.test.js +121 -0
- package/build/tests/unit/graphql-armor.test.js.map +1 -0
- package/build/tests/unit/logging.test.js +120 -0
- package/build/tests/unit/logging.test.js.map +1 -0
- package/build/tests/unit/metrics.test.js +114 -0
- package/build/tests/unit/metrics.test.js.map +1 -0
- package/build/tests/unit/network-service.test.js +66 -0
- package/build/tests/unit/network-service.test.js.map +1 -0
- package/build/tests/unit/postgres-options.test.js +56 -0
- package/build/tests/unit/postgres-options.test.js.map +1 -0
- package/build/tests/unit/rate-limit.test.js +271 -0
- package/build/tests/unit/rate-limit.test.js.map +1 -0
- package/build/tests/unit/readiness.test.js +75 -0
- package/build/tests/unit/readiness.test.js.map +1 -0
- package/build/tests/unit/schema-nullability.test.js +40 -0
- package/build/tests/unit/schema-nullability.test.js.map +1 -0
- package/build/tests/unit/schema-version.test.js +48 -0
- package/build/tests/unit/schema-version.test.js.map +1 -0
- package/build/tests/unit/yoga-http-contract.test.js +30 -0
- package/build/tests/unit/yoga-http-contract.test.js.map +1 -0
- package/build/tests/unit/zkapp-commands-gating.test.js +38 -0
- package/build/tests/unit/zkapp-commands-gating.test.js.map +1 -0
- package/build/zkapp/utils.js +2 -0
- package/build/zkapp/utils.js.map +1 -1
- package/package.json +33 -14
- package/schema.graphql +126 -8
- package/src/blockchain/types.ts +65 -1
- package/src/blockchain/utils.ts +26 -2
- package/src/config.ts +133 -0
- package/src/db/archive-node-adapter/archive-node-adapter.interface.ts +26 -3
- package/src/db/archive-node-adapter/archive-node-adapter.ts +65 -2
- package/src/db/archive-node-adapter/postgres-options.ts +90 -0
- package/src/db/sql/best-chain.ts +34 -0
- package/src/db/sql/events-actions/queries.ts +168 -24
- package/src/db/sql/verification-key-updates/queries.ts +132 -0
- package/src/db/sql/zkapp-commands/queries.ts +406 -0
- package/src/db/sql/zkapp-commands/types.ts +43 -0
- package/src/envionment.d.ts +20 -0
- package/src/errors/error.ts +17 -1
- package/src/index.ts +64 -7
- package/src/resolvers-types.ts +311 -24
- package/src/resolvers.ts +70 -34
- package/src/schema-version.ts +24 -0
- package/src/server/cors.ts +97 -0
- package/src/server/graceful-shutdown.ts +76 -0
- package/src/server/graphql-armor.ts +78 -0
- package/src/server/logger.ts +72 -0
- package/src/server/metrics.ts +104 -0
- package/src/server/plugins.ts +53 -19
- package/src/server/rate-limit.ts +274 -0
- package/src/server/readiness.ts +78 -0
- package/src/server/request-logging.ts +83 -0
- package/src/server/server.ts +70 -15
- package/src/services/actions-service/actions-service.ts +87 -24
- package/src/services/blocks-service/blocks-service.ts +16 -14
- package/src/services/network-service/network-service.ts +30 -12
- package/src/services/verification-key-updates-service/verification-key-updates-service.interface.ts +9 -0
- package/src/services/verification-key-updates-service/verification-key-updates-service.ts +72 -0
- package/src/services/zkapp-commands-service/zkapp-commands-service.interface.ts +9 -0
- package/src/services/zkapp-commands-service/zkapp-commands-service.ts +181 -0
- package/src/tracing/jaeger-tracing.ts +2 -1
- package/build/tests/consensus/run-compare.js +0 -40
- package/build/tests/consensus/run-compare.js.map +0 -1
- package/build/tests/consensus/select-consensus-precomputed.js +0 -80
- package/build/tests/consensus/select-consensus-precomputed.js.map +0 -1
- package/build/tests/consensus/types.js +0 -15
- 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
|
-
|
|
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;
|
|
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 @@
|
|
|
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 = (
|
|
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, (
|
|
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,
|
|
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
|
-
|
|
286
|
-
|
|
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
|
-
${
|
|
289
|
-
? db_client `AND
|
|
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,
|
|
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,
|
|
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
|
|
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
|
-
|
|
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 = (
|
|
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.
|
|
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":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;
|
|
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"}
|