@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
|
@@ -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 (
|
|
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
|
|
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
|
|
204
|
-
AND
|
|
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
|
-
+
|
|
221
|
-
|
|
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
|
-
+
|
|
226
|
-
|
|
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
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
|
60
|
+
return {
|
|
61
|
+
maxBlockHeight: {
|
|
62
|
+
canonicalMaxBlockHeight,
|
|
63
|
+
pendingMaxBlockHeight,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
48
66
|
}
|
|
49
67
|
|
|
50
68
|
private async executeNetworkStateQuery() {
|
package/src/services/verification-key-updates-service/verification-key-updates-service.interface.ts
ADDED
|
@@ -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"}
|