@aztec/stdlib 1.0.0-staging.2 → 1.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/dest/block/l2_block_stream/l2_block_stream.js +1 -1
- package/dest/block/proposal/committee_attestation.d.ts +3 -3
- package/dest/block/proposal/committee_attestation.d.ts.map +1 -1
- package/dest/block/proposal/committee_attestation.js +2 -41
- package/dest/contract/contract_instance_update.d.ts +1 -2
- package/dest/contract/contract_instance_update.d.ts.map +1 -1
- package/dest/contract/contract_instance_update.js +6 -6
- package/dest/contract/interfaces/contract_data_source.d.ts +2 -5
- package/dest/contract/interfaces/contract_data_source.d.ts.map +1 -1
- package/dest/contract/interfaces/contract_instance_update.d.ts +8 -9
- package/dest/contract/interfaces/contract_instance_update.d.ts.map +1 -1
- package/dest/contract/interfaces/contract_instance_update.js +1 -1
- package/dest/hash/hash.d.ts +1 -1
- package/dest/hash/hash.d.ts.map +1 -1
- package/dest/hash/hash.js +3 -7
- package/dest/interfaces/archiver.js +1 -1
- package/dest/interfaces/aztec-node.d.ts +1 -1
- package/dest/interfaces/client.d.ts +0 -1
- package/dest/interfaces/client.d.ts.map +1 -1
- package/dest/interfaces/client.js +0 -1
- package/dest/interfaces/proving-job.d.ts +1 -22
- package/dest/interfaces/proving-job.d.ts.map +1 -1
- package/dest/interfaces/proving-job.js +0 -13
- package/dest/interfaces/server.d.ts +0 -1
- package/dest/interfaces/server.d.ts.map +1 -1
- package/dest/interfaces/server.js +0 -1
- package/dest/interfaces/server_circuit_prover.d.ts +0 -2
- package/dest/interfaces/server_circuit_prover.d.ts.map +1 -1
- package/dest/kernel/hints/rollup_validation_requests.d.ts +10 -6
- package/dest/kernel/hints/rollup_validation_requests.d.ts.map +1 -1
- package/dest/kernel/hints/rollup_validation_requests.js +11 -9
- package/dest/kernel/private_circuit_public_inputs.d.ts +6 -6
- package/dest/kernel/private_circuit_public_inputs.d.ts.map +1 -1
- package/dest/kernel/private_circuit_public_inputs.js +10 -10
- package/dest/proofs/proving_request_type.d.ts +7 -8
- package/dest/proofs/proving_request_type.d.ts.map +1 -1
- package/dest/proofs/proving_request_type.js +7 -8
- package/dest/rollup/base_or_merge_rollup_public_inputs.d.ts +9 -0
- package/dest/rollup/base_or_merge_rollup_public_inputs.d.ts.map +1 -1
- package/dest/rollup/base_or_merge_rollup_public_inputs.js +8 -3
- package/dest/rollup/empty_block_root_rollup_inputs.d.ts +3 -2
- package/dest/rollup/empty_block_root_rollup_inputs.d.ts.map +1 -1
- package/dest/rollup/empty_block_root_rollup_inputs.js +6 -3
- package/dest/rollup/index.d.ts +0 -1
- package/dest/rollup/index.d.ts.map +1 -1
- package/dest/rollup/index.js +0 -1
- package/dest/shared_mutable/scheduled_delay_change.d.ts +5 -5
- package/dest/shared_mutable/scheduled_delay_change.d.ts.map +1 -1
- package/dest/shared_mutable/scheduled_delay_change.js +5 -5
- package/dest/shared_mutable/scheduled_value_change.d.ts +3 -4
- package/dest/shared_mutable/scheduled_value_change.d.ts.map +1 -1
- package/dest/shared_mutable/scheduled_value_change.js +7 -7
- package/dest/shared_mutable/shared_mutable_values.js +7 -7
- package/dest/stats/stats.d.ts +1 -1
- package/dest/stats/stats.d.ts.map +1 -1
- package/dest/tests/factories.d.ts.map +1 -1
- package/dest/tests/factories.js +6 -6
- package/dest/tx/index.d.ts +1 -1
- package/dest/tx/index.d.ts.map +1 -1
- package/dest/tx/index.js +1 -1
- package/dest/tx/max_block_number.d.ts +54 -0
- package/dest/tx/max_block_number.d.ts.map +1 -0
- package/dest/tx/max_block_number.js +64 -0
- package/dest/tx/offchain_effect.d.ts.map +1 -1
- package/dest/tx/offchain_effect.js +0 -1
- package/dest/tx/validator/error_texts.d.ts +1 -1
- package/dest/tx/validator/error_texts.d.ts.map +1 -1
- package/dest/tx/validator/error_texts.js +1 -1
- package/dest/types/shared.d.ts +8 -0
- package/dest/types/shared.d.ts.map +1 -1
- package/dest/types/shared.js +8 -0
- package/dest/vks/verification_key.d.ts +0 -1
- package/dest/vks/verification_key.d.ts.map +1 -1
- package/dest/vks/verification_key.js +0 -5
- package/package.json +7 -7
- package/src/block/l2_block_stream/l2_block_stream.ts +1 -1
- package/src/block/proposal/committee_attestation.ts +3 -49
- package/src/contract/contract_instance_update.ts +6 -7
- package/src/contract/interfaces/contract_data_source.ts +2 -5
- package/src/contract/interfaces/contract_instance_update.ts +3 -4
- package/src/hash/hash.ts +3 -7
- package/src/interfaces/archiver.ts +1 -1
- package/src/interfaces/aztec-node.ts +1 -1
- package/src/interfaces/client.ts +0 -1
- package/src/interfaces/proving-job.ts +0 -21
- package/src/interfaces/server.ts +0 -1
- package/src/interfaces/server_circuit_prover.ts +0 -9
- package/src/kernel/hints/rollup_validation_requests.ts +10 -8
- package/src/kernel/private_circuit_public_inputs.ts +8 -8
- package/src/proofs/proving_request_type.ts +0 -1
- package/src/rollup/base_or_merge_rollup_public_inputs.ts +8 -0
- package/src/rollup/empty_block_root_rollup_inputs.ts +7 -2
- package/src/rollup/index.ts +0 -1
- package/src/shared_mutable/scheduled_delay_change.ts +6 -6
- package/src/shared_mutable/scheduled_value_change.ts +5 -7
- package/src/shared_mutable/shared_mutable_values.ts +9 -9
- package/src/stats/stats.ts +0 -1
- package/src/tests/factories.ts +6 -4
- package/src/tx/index.ts +1 -1
- package/src/tx/max_block_number.ts +81 -0
- package/src/tx/offchain_effect.ts +0 -1
- package/src/tx/validator/error_texts.ts +1 -1
- package/src/types/shared.ts +9 -0
- package/src/vks/verification_key.ts +0 -6
- package/dest/rollup/padding_block_root_rollup_inputs.d.ts +0 -20
- package/dest/rollup/padding_block_root_rollup_inputs.d.ts.map +0 -1
- package/dest/rollup/padding_block_root_rollup_inputs.js +0 -39
- package/dest/tx/include_by_timestamp.d.ts +0 -54
- package/dest/tx/include_by_timestamp.d.ts.map +0 -1
- package/dest/tx/include_by_timestamp.js +0 -72
- package/src/rollup/padding_block_root_rollup_inputs.ts +0 -47
- package/src/tx/include_by_timestamp.ts +0 -90
package/src/interfaces/client.ts
CHANGED
|
@@ -21,7 +21,6 @@ import { BlockMergeRollupInputs } from '../rollup/block_merge_rollup.js';
|
|
|
21
21
|
import { BlockRootOrBlockMergePublicInputs } from '../rollup/block_root_or_block_merge_public_inputs.js';
|
|
22
22
|
import { BlockRootRollupInputs, SingleTxBlockRootRollupInputs } from '../rollup/block_root_rollup.js';
|
|
23
23
|
import { EmptyBlockRootRollupInputs } from '../rollup/empty_block_root_rollup_inputs.js';
|
|
24
|
-
import { PaddingBlockRootRollupInputs } from '../rollup/index.js';
|
|
25
24
|
import { MergeRollupInputs } from '../rollup/merge_rollup.js';
|
|
26
25
|
import { PrivateBaseRollupInputs } from '../rollup/private_base_rollup_inputs.js';
|
|
27
26
|
import { PublicBaseRollupInputs } from '../rollup/public_base_rollup_inputs.js';
|
|
@@ -88,8 +87,6 @@ export function mapProvingRequestTypeToCircuitName(type: ProvingRequestType): Se
|
|
|
88
87
|
return 'merge-rollup';
|
|
89
88
|
case ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP:
|
|
90
89
|
return 'empty-block-root-rollup';
|
|
91
|
-
case ProvingRequestType.PADDING_BLOCK_ROOT_ROLLUP:
|
|
92
|
-
return 'padding-block-root-rollup';
|
|
93
90
|
case ProvingRequestType.BLOCK_ROOT_ROLLUP:
|
|
94
91
|
return 'block-root-rollup';
|
|
95
92
|
case ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP:
|
|
@@ -124,10 +121,6 @@ export const ProvingJobInputs = z.discriminatedUnion('type', [
|
|
|
124
121
|
inputs: SingleTxBlockRootRollupInputs.schema,
|
|
125
122
|
}),
|
|
126
123
|
z.object({ type: z.literal(ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP), inputs: EmptyBlockRootRollupInputs.schema }),
|
|
127
|
-
z.object({
|
|
128
|
-
type: z.literal(ProvingRequestType.PADDING_BLOCK_ROOT_ROLLUP),
|
|
129
|
-
inputs: PaddingBlockRootRollupInputs.schema,
|
|
130
|
-
}),
|
|
131
124
|
z.object({ type: z.literal(ProvingRequestType.BLOCK_MERGE_ROLLUP), inputs: BlockMergeRollupInputs.schema }),
|
|
132
125
|
z.object({ type: z.literal(ProvingRequestType.ROOT_ROLLUP), inputs: RootRollupInputs.schema }),
|
|
133
126
|
z.object({ type: z.literal(ProvingRequestType.TUBE_PROOF), inputs: TubeInputs.schema }),
|
|
@@ -145,8 +138,6 @@ export function getProvingJobInputClassFor(type: ProvingRequestType) {
|
|
|
145
138
|
return MergeRollupInputs;
|
|
146
139
|
case ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP:
|
|
147
140
|
return EmptyBlockRootRollupInputs;
|
|
148
|
-
case ProvingRequestType.PADDING_BLOCK_ROOT_ROLLUP:
|
|
149
|
-
return PaddingBlockRootRollupInputs;
|
|
150
141
|
case ProvingRequestType.BLOCK_ROOT_ROLLUP:
|
|
151
142
|
return BlockRootRollupInputs;
|
|
152
143
|
case ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP:
|
|
@@ -176,7 +167,6 @@ export type ProvingJobInputsMap = {
|
|
|
176
167
|
[ProvingRequestType.PUBLIC_BASE_ROLLUP]: PublicBaseRollupInputs;
|
|
177
168
|
[ProvingRequestType.MERGE_ROLLUP]: MergeRollupInputs;
|
|
178
169
|
[ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP]: EmptyBlockRootRollupInputs;
|
|
179
|
-
[ProvingRequestType.PADDING_BLOCK_ROOT_ROLLUP]: PaddingBlockRootRollupInputs;
|
|
180
170
|
[ProvingRequestType.BLOCK_ROOT_ROLLUP]: BlockRootRollupInputs;
|
|
181
171
|
[ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP]: SingleTxBlockRootRollupInputs;
|
|
182
172
|
[ProvingRequestType.BLOCK_MERGE_ROLLUP]: BlockMergeRollupInputs;
|
|
@@ -219,13 +209,6 @@ export const ProvingJobResult = z.discriminatedUnion('type', [
|
|
|
219
209
|
NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
|
|
220
210
|
),
|
|
221
211
|
}),
|
|
222
|
-
z.object({
|
|
223
|
-
type: z.literal(ProvingRequestType.PADDING_BLOCK_ROOT_ROLLUP),
|
|
224
|
-
result: schemaForPublicInputsAndRecursiveProof(
|
|
225
|
-
BlockRootOrBlockMergePublicInputs.schema,
|
|
226
|
-
NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
|
|
227
|
-
),
|
|
228
|
-
}),
|
|
229
212
|
z.object({
|
|
230
213
|
type: z.literal(ProvingRequestType.BLOCK_ROOT_ROLLUP),
|
|
231
214
|
result: schemaForPublicInputsAndRecursiveProof(
|
|
@@ -283,10 +266,6 @@ export type ProvingJobResultsMap = {
|
|
|
283
266
|
BlockRootOrBlockMergePublicInputs,
|
|
284
267
|
typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
|
|
285
268
|
>;
|
|
286
|
-
[ProvingRequestType.PADDING_BLOCK_ROOT_ROLLUP]: PublicInputsAndRecursiveProof<
|
|
287
|
-
BlockRootOrBlockMergePublicInputs,
|
|
288
|
-
typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
|
|
289
|
-
>;
|
|
290
269
|
[ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP]: PublicInputsAndRecursiveProof<
|
|
291
270
|
BlockRootOrBlockMergePublicInputs,
|
|
292
271
|
typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
|
package/src/interfaces/server.ts
CHANGED
|
@@ -15,7 +15,6 @@ import type { BlockMergeRollupInputs } from '../rollup/block_merge_rollup.js';
|
|
|
15
15
|
import type { BlockRootOrBlockMergePublicInputs } from '../rollup/block_root_or_block_merge_public_inputs.js';
|
|
16
16
|
import type { BlockRootRollupInputs, SingleTxBlockRootRollupInputs } from '../rollup/block_root_rollup.js';
|
|
17
17
|
import type { EmptyBlockRootRollupInputs } from '../rollup/empty_block_root_rollup_inputs.js';
|
|
18
|
-
import type { PaddingBlockRootRollupInputs } from '../rollup/index.js';
|
|
19
18
|
import type { MergeRollupInputs } from '../rollup/merge_rollup.js';
|
|
20
19
|
import type { PrivateBaseRollupInputs } from '../rollup/private_base_rollup_inputs.js';
|
|
21
20
|
import type { PublicBaseRollupInputs } from '../rollup/public_base_rollup_inputs.js';
|
|
@@ -122,14 +121,6 @@ export interface ServerCircuitProver {
|
|
|
122
121
|
PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
|
|
123
122
|
>;
|
|
124
123
|
|
|
125
|
-
getPaddingBlockRootRollupProof(
|
|
126
|
-
input: PaddingBlockRootRollupInputs,
|
|
127
|
-
signal?: AbortSignal,
|
|
128
|
-
epochNumber?: number,
|
|
129
|
-
): Promise<
|
|
130
|
-
PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
|
|
131
|
-
>;
|
|
132
|
-
|
|
133
124
|
/**
|
|
134
125
|
* Creates a proof for the given input.
|
|
135
126
|
* @param input - Input to the circuit.
|
|
@@ -4,15 +4,17 @@ import { BufferReader, FieldReader, serializeToBuffer, serializeToFields } from
|
|
|
4
4
|
import { bufferToHex, hexToBuffer } from '@aztec/foundation/string';
|
|
5
5
|
import type { FieldsOf } from '@aztec/foundation/types';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { MaxBlockNumber } from '../../tx/max_block_number.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Validation requests directed at the rollup, accumulated during the execution of the transaction.
|
|
11
11
|
*/
|
|
12
12
|
export class RollupValidationRequests {
|
|
13
13
|
constructor(
|
|
14
|
-
/**
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* The largest block number in which this transaction can be included.
|
|
16
|
+
*/
|
|
17
|
+
public maxBlockNumber: MaxBlockNumber,
|
|
16
18
|
) {}
|
|
17
19
|
|
|
18
20
|
getSize() {
|
|
@@ -20,7 +22,7 @@ export class RollupValidationRequests {
|
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
toBuffer() {
|
|
23
|
-
return serializeToBuffer(this.
|
|
25
|
+
return serializeToBuffer(this.maxBlockNumber);
|
|
24
26
|
}
|
|
25
27
|
|
|
26
28
|
toString() {
|
|
@@ -28,12 +30,12 @@ export class RollupValidationRequests {
|
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
static getFields(fields: FieldsOf<RollupValidationRequests>) {
|
|
31
|
-
return [fields.
|
|
33
|
+
return [fields.maxBlockNumber] as const;
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
static fromFields(fields: Fr[] | FieldReader) {
|
|
35
37
|
const reader = FieldReader.asReader(fields);
|
|
36
|
-
return new RollupValidationRequests(
|
|
38
|
+
return new RollupValidationRequests(MaxBlockNumber.fromFields(reader));
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
toFields(): Fr[] {
|
|
@@ -53,7 +55,7 @@ export class RollupValidationRequests {
|
|
|
53
55
|
*/
|
|
54
56
|
static fromBuffer(buffer: Buffer | BufferReader) {
|
|
55
57
|
const reader = BufferReader.asReader(buffer);
|
|
56
|
-
return new RollupValidationRequests(reader.readObject(
|
|
58
|
+
return new RollupValidationRequests(reader.readObject(MaxBlockNumber));
|
|
57
59
|
}
|
|
58
60
|
|
|
59
61
|
/**
|
|
@@ -66,6 +68,6 @@ export class RollupValidationRequests {
|
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
static empty() {
|
|
69
|
-
return new RollupValidationRequests(
|
|
71
|
+
return new RollupValidationRequests(MaxBlockNumber.empty());
|
|
70
72
|
}
|
|
71
73
|
}
|
|
@@ -30,7 +30,7 @@ import { PrivateLogData } from '../kernel/private_log_data.js';
|
|
|
30
30
|
import { CountedL2ToL1Message } from '../messaging/l2_to_l1_message.js';
|
|
31
31
|
import { BlockHeader } from '../tx/block_header.js';
|
|
32
32
|
import { CallContext } from '../tx/call_context.js';
|
|
33
|
-
import {
|
|
33
|
+
import { MaxBlockNumber } from '../tx/max_block_number.js';
|
|
34
34
|
import { TxContext } from '../tx/tx_context.js';
|
|
35
35
|
import { ReadRequest } from './hints/read_request.js';
|
|
36
36
|
import { NoteHash } from './note_hash.js';
|
|
@@ -64,9 +64,9 @@ export class PrivateCircuitPublicInputs {
|
|
|
64
64
|
*/
|
|
65
65
|
public isFeePayer: boolean,
|
|
66
66
|
/**
|
|
67
|
-
* The
|
|
67
|
+
* The maximum block number in which this transaction can be included and be valid.
|
|
68
68
|
*/
|
|
69
|
-
public
|
|
69
|
+
public maxBlockNumber: MaxBlockNumber,
|
|
70
70
|
/**
|
|
71
71
|
* Read requests created by the corresponding function call.
|
|
72
72
|
*/
|
|
@@ -158,7 +158,7 @@ export class PrivateCircuitPublicInputs {
|
|
|
158
158
|
reader.readObject(Fr),
|
|
159
159
|
reader.readObject(Fr),
|
|
160
160
|
reader.readBoolean(),
|
|
161
|
-
reader.readObject(
|
|
161
|
+
reader.readObject(MaxBlockNumber),
|
|
162
162
|
reader.readArray(MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, ReadRequest),
|
|
163
163
|
reader.readArray(MAX_NULLIFIER_READ_REQUESTS_PER_CALL, ReadRequest),
|
|
164
164
|
reader.readArray(MAX_KEY_VALIDATION_REQUESTS_PER_CALL, KeyValidationRequestAndGenerator),
|
|
@@ -185,7 +185,7 @@ export class PrivateCircuitPublicInputs {
|
|
|
185
185
|
reader.readField(),
|
|
186
186
|
reader.readField(),
|
|
187
187
|
reader.readBoolean(),
|
|
188
|
-
reader.readObject(
|
|
188
|
+
reader.readObject(MaxBlockNumber),
|
|
189
189
|
reader.readArray(MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, ReadRequest),
|
|
190
190
|
reader.readArray(MAX_NULLIFIER_READ_REQUESTS_PER_CALL, ReadRequest),
|
|
191
191
|
reader.readArray(MAX_KEY_VALIDATION_REQUESTS_PER_CALL, KeyValidationRequestAndGenerator),
|
|
@@ -215,7 +215,7 @@ export class PrivateCircuitPublicInputs {
|
|
|
215
215
|
Fr.ZERO,
|
|
216
216
|
Fr.ZERO,
|
|
217
217
|
false,
|
|
218
|
-
|
|
218
|
+
MaxBlockNumber.empty(),
|
|
219
219
|
makeTuple(MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, ReadRequest.empty),
|
|
220
220
|
makeTuple(MAX_NULLIFIER_READ_REQUESTS_PER_CALL, ReadRequest.empty),
|
|
221
221
|
makeTuple(MAX_KEY_VALIDATION_REQUESTS_PER_CALL, KeyValidationRequestAndGenerator.empty),
|
|
@@ -241,7 +241,7 @@ export class PrivateCircuitPublicInputs {
|
|
|
241
241
|
this.returnsHash.isZero() &&
|
|
242
242
|
this.minRevertibleSideEffectCounter.isZero() &&
|
|
243
243
|
!this.isFeePayer &&
|
|
244
|
-
this.
|
|
244
|
+
this.maxBlockNumber.isEmpty() &&
|
|
245
245
|
isEmptyArray(this.noteHashReadRequests) &&
|
|
246
246
|
isEmptyArray(this.nullifierReadRequests) &&
|
|
247
247
|
isEmptyArray(this.keyValidationRequestsAndGenerators) &&
|
|
@@ -272,7 +272,7 @@ export class PrivateCircuitPublicInputs {
|
|
|
272
272
|
fields.returnsHash,
|
|
273
273
|
fields.minRevertibleSideEffectCounter,
|
|
274
274
|
fields.isFeePayer,
|
|
275
|
-
fields.
|
|
275
|
+
fields.maxBlockNumber,
|
|
276
276
|
fields.noteHashReadRequests,
|
|
277
277
|
fields.nullifierReadRequests,
|
|
278
278
|
fields.keyValidationRequestsAndGenerators,
|
|
@@ -5,6 +5,7 @@ import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
|
5
5
|
import { bufferToHex, hexToBuffer } from '@aztec/foundation/string';
|
|
6
6
|
|
|
7
7
|
import { PartialStateReference } from '../tx/partial_state_reference.js';
|
|
8
|
+
import { RollupTypes } from '../types/shared.js';
|
|
8
9
|
import { BlockConstantData } from './block_constant_data.js';
|
|
9
10
|
|
|
10
11
|
/**
|
|
@@ -12,6 +13,10 @@ import { BlockConstantData } from './block_constant_data.js';
|
|
|
12
13
|
*/
|
|
13
14
|
export class BaseOrMergeRollupPublicInputs {
|
|
14
15
|
constructor(
|
|
16
|
+
/**
|
|
17
|
+
* Specifies from which type of rollup circuit these inputs are from.
|
|
18
|
+
*/
|
|
19
|
+
public rollupType: RollupTypes,
|
|
15
20
|
/**
|
|
16
21
|
* Number of txs in this rollup.
|
|
17
22
|
*/
|
|
@@ -54,6 +59,7 @@ export class BaseOrMergeRollupPublicInputs {
|
|
|
54
59
|
/** Returns an empty instance. */
|
|
55
60
|
static empty() {
|
|
56
61
|
return new BaseOrMergeRollupPublicInputs(
|
|
62
|
+
RollupTypes.Base,
|
|
57
63
|
0,
|
|
58
64
|
BlockConstantData.empty(),
|
|
59
65
|
PartialStateReference.empty(),
|
|
@@ -75,6 +81,7 @@ export class BaseOrMergeRollupPublicInputs {
|
|
|
75
81
|
static fromBuffer(buffer: Buffer | BufferReader): BaseOrMergeRollupPublicInputs {
|
|
76
82
|
const reader = BufferReader.asReader(buffer);
|
|
77
83
|
return new BaseOrMergeRollupPublicInputs(
|
|
84
|
+
reader.readNumber(),
|
|
78
85
|
reader.readNumber(),
|
|
79
86
|
reader.readObject(BlockConstantData),
|
|
80
87
|
reader.readObject(PartialStateReference),
|
|
@@ -93,6 +100,7 @@ export class BaseOrMergeRollupPublicInputs {
|
|
|
93
100
|
*/
|
|
94
101
|
toBuffer() {
|
|
95
102
|
return serializeToBuffer(
|
|
103
|
+
this.rollupType,
|
|
96
104
|
this.numTxs,
|
|
97
105
|
this.constants,
|
|
98
106
|
|
|
@@ -13,6 +13,7 @@ export class EmptyBlockRootRollupInputs {
|
|
|
13
13
|
constructor(
|
|
14
14
|
public readonly data: BlockRootRollupData,
|
|
15
15
|
public readonly constants: BlockConstantData,
|
|
16
|
+
public readonly isPadding: boolean,
|
|
16
17
|
) {}
|
|
17
18
|
|
|
18
19
|
/**
|
|
@@ -46,7 +47,7 @@ export class EmptyBlockRootRollupInputs {
|
|
|
46
47
|
* @returns An array of fields.
|
|
47
48
|
*/
|
|
48
49
|
static getFields(fields: FieldsOf<EmptyBlockRootRollupInputs>) {
|
|
49
|
-
return [fields.data, fields.constants] as const;
|
|
50
|
+
return [fields.data, fields.constants, fields.isPadding] as const;
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
/**
|
|
@@ -56,7 +57,11 @@ export class EmptyBlockRootRollupInputs {
|
|
|
56
57
|
*/
|
|
57
58
|
static fromBuffer(buffer: Buffer | BufferReader): EmptyBlockRootRollupInputs {
|
|
58
59
|
const reader = BufferReader.asReader(buffer);
|
|
59
|
-
return new EmptyBlockRootRollupInputs(
|
|
60
|
+
return new EmptyBlockRootRollupInputs(
|
|
61
|
+
reader.readObject(BlockRootRollupData),
|
|
62
|
+
reader.readObject(BlockConstantData),
|
|
63
|
+
reader.readBoolean(),
|
|
64
|
+
);
|
|
60
65
|
}
|
|
61
66
|
|
|
62
67
|
/**
|
package/src/rollup/index.ts
CHANGED
|
@@ -8,7 +8,6 @@ export * from './empty_block_root_rollup_inputs.js';
|
|
|
8
8
|
export * from './epoch_constant_data.js';
|
|
9
9
|
export * from './block_root_rollup.js';
|
|
10
10
|
export * from './merge_rollup.js';
|
|
11
|
-
export * from './padding_block_root_rollup_inputs.js';
|
|
12
11
|
export * from './previous_rollup_block_data.js';
|
|
13
12
|
export * from './previous_rollup_data.js';
|
|
14
13
|
export * from './private_base_rollup_inputs.js';
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { UInt32 } from '../types/shared.js';
|
|
2
2
|
|
|
3
3
|
export class ScheduledDelayChange {
|
|
4
4
|
constructor(
|
|
5
|
-
public pre:
|
|
6
|
-
public post:
|
|
7
|
-
public
|
|
5
|
+
public pre: UInt32 | undefined,
|
|
6
|
+
public post: UInt32 | undefined,
|
|
7
|
+
public blockOfChange: UInt32,
|
|
8
8
|
) {}
|
|
9
9
|
|
|
10
10
|
static empty() {
|
|
11
|
-
return new this(undefined, undefined,
|
|
11
|
+
return new this(undefined, undefined, 0);
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
isEmpty(): boolean {
|
|
15
|
-
return this.pre === undefined && this.post === undefined && this.
|
|
15
|
+
return this.pre === undefined && this.post === undefined && this.blockOfChange === 0;
|
|
16
16
|
}
|
|
17
17
|
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
2
|
|
|
3
|
-
import type { UInt64 } from '../types/shared.js';
|
|
4
|
-
|
|
5
3
|
export class ScheduledValueChange {
|
|
6
4
|
constructor(
|
|
7
5
|
public previous: Fr[],
|
|
8
6
|
public post: Fr[],
|
|
9
|
-
public
|
|
7
|
+
public blockOfChange: number,
|
|
10
8
|
) {
|
|
11
9
|
if (this.previous.length !== this.post.length) {
|
|
12
10
|
throw new Error('Previous and post must have the same length');
|
|
@@ -14,15 +12,15 @@ export class ScheduledValueChange {
|
|
|
14
12
|
}
|
|
15
13
|
|
|
16
14
|
static empty(valueSize: number) {
|
|
17
|
-
return new this(Array(valueSize).fill(new Fr(0)), Array(valueSize).fill(new Fr(0)),
|
|
15
|
+
return new this(Array(valueSize).fill(new Fr(0)), Array(valueSize).fill(new Fr(0)), 0);
|
|
18
16
|
}
|
|
19
17
|
|
|
20
18
|
isEmpty(): boolean {
|
|
21
|
-
return this.previous.every(v => v.isZero()) && this.post.every(v => v.isZero()) && this.
|
|
19
|
+
return this.previous.every(v => v.isZero()) && this.post.every(v => v.isZero()) && this.blockOfChange === 0;
|
|
22
20
|
}
|
|
23
21
|
|
|
24
|
-
getCurrentAt(
|
|
25
|
-
if (
|
|
22
|
+
getCurrentAt(blockNumber: number) {
|
|
23
|
+
if (blockNumber < this.blockOfChange) {
|
|
26
24
|
return this.previous;
|
|
27
25
|
} else {
|
|
28
26
|
return this.post;
|
|
@@ -22,20 +22,20 @@ export class SharedMutableValues {
|
|
|
22
22
|
// Extract fields for ScheduledValueChange
|
|
23
23
|
const svcPre = reader.readFieldArray(UPDATES_VALUE_SIZE);
|
|
24
24
|
const svcPost = reader.readFieldArray(UPDATES_VALUE_SIZE);
|
|
25
|
-
const
|
|
26
|
-
const svc = new ScheduledValueChange(svcPre, svcPost,
|
|
25
|
+
const svcBlockOfChange = firstField & 0xffffffffn;
|
|
26
|
+
const svc = new ScheduledValueChange(svcPre, svcPost, Number(svcBlockOfChange));
|
|
27
27
|
|
|
28
28
|
// Extract fields for ScheduledDelayChange from first field
|
|
29
|
-
const
|
|
29
|
+
const sdcBlockOfChange = (firstField >> 32n) & 0xffffffffn;
|
|
30
30
|
const sdcIsPostSome = (firstField >> 64n) & 1n;
|
|
31
31
|
const sdcPost = (firstField >> 72n) & 0xffffffffn;
|
|
32
32
|
const sdcIsPreSome = (firstField >> 104n) & 1n;
|
|
33
33
|
const sdcPre = (firstField >> 112n) & 0xffffffffn;
|
|
34
34
|
|
|
35
35
|
const sdc = new ScheduledDelayChange(
|
|
36
|
-
sdcIsPreSome ? sdcPre : undefined,
|
|
37
|
-
sdcIsPostSome ? sdcPost : undefined,
|
|
38
|
-
|
|
36
|
+
sdcIsPreSome ? Number(sdcPre) : undefined,
|
|
37
|
+
sdcIsPostSome ? Number(sdcPost) : undefined,
|
|
38
|
+
Number(sdcBlockOfChange),
|
|
39
39
|
);
|
|
40
40
|
|
|
41
41
|
return new this(svc, sdc);
|
|
@@ -43,9 +43,9 @@ export class SharedMutableValues {
|
|
|
43
43
|
|
|
44
44
|
toFields(): Fr[] {
|
|
45
45
|
// Pack format matches Noir implementation:
|
|
46
|
-
// [ sdc.pre_inner: u32 | sdc.pre_is_some: u8 | sdc.post_inner: u32 | sdc.post_is_some: u8 | sdc.
|
|
47
|
-
let firstField = this.svc.
|
|
48
|
-
firstField |= this.sdc.
|
|
46
|
+
// [ sdc.pre_inner: u32 | sdc.pre_is_some: u8 | sdc.post_inner: u32 | sdc.post_is_some: u8 | sdc.block_of_change: u32 | svc.block_of_change: u32 ]
|
|
47
|
+
let firstField = BigInt(this.svc.blockOfChange);
|
|
48
|
+
firstField |= BigInt(this.sdc.blockOfChange) << 32n;
|
|
49
49
|
firstField |= (this.sdc.post === undefined ? 0n : 1n) << 64n;
|
|
50
50
|
firstField |= BigInt(this.sdc.post || 0) << 72n;
|
|
51
51
|
firstField |= (this.sdc.pre === undefined ? 0n : 1n) << 104n;
|
package/src/stats/stats.ts
CHANGED
package/src/tests/factories.ts
CHANGED
|
@@ -165,7 +165,7 @@ import { CallContext } from '../tx/call_context.js';
|
|
|
165
165
|
import { ContentCommitment } from '../tx/content_commitment.js';
|
|
166
166
|
import { FunctionData } from '../tx/function_data.js';
|
|
167
167
|
import { GlobalVariables } from '../tx/global_variables.js';
|
|
168
|
-
import {
|
|
168
|
+
import { MaxBlockNumber } from '../tx/max_block_number.js';
|
|
169
169
|
import { PartialStateReference } from '../tx/partial_state_reference.js';
|
|
170
170
|
import { makeProcessedTxFromPrivateOnlyTx, makeProcessedTxFromTxWithPublicCalls } from '../tx/processed_tx.js';
|
|
171
171
|
import { PublicCallRequestWithCalldata } from '../tx/public_call_request_with_calldata.js';
|
|
@@ -174,7 +174,7 @@ import { TreeSnapshots } from '../tx/tree_snapshots.js';
|
|
|
174
174
|
import { TxConstantData } from '../tx/tx_constant_data.js';
|
|
175
175
|
import { TxContext } from '../tx/tx_context.js';
|
|
176
176
|
import { TxRequest } from '../tx/tx_request.js';
|
|
177
|
-
import { Vector } from '../types/index.js';
|
|
177
|
+
import { RollupTypes, Vector } from '../types/index.js';
|
|
178
178
|
import { VkData } from '../vks/index.js';
|
|
179
179
|
import { VerificationKey, VerificationKeyAsFields, VerificationKeyData } from '../vks/verification_key.js';
|
|
180
180
|
import { mockTx } from './mocks.js';
|
|
@@ -308,7 +308,7 @@ export function makeContractStorageRead(seed = 1): ContractStorageRead {
|
|
|
308
308
|
}
|
|
309
309
|
|
|
310
310
|
export function makeRollupValidationRequests(seed = 1) {
|
|
311
|
-
return new RollupValidationRequests(new
|
|
311
|
+
return new RollupValidationRequests(new MaxBlockNumber(true, seed + 0x31415));
|
|
312
312
|
}
|
|
313
313
|
|
|
314
314
|
function makeTxConstantData(seed = 1) {
|
|
@@ -567,7 +567,7 @@ export function makeTxRequest(seed = 1): TxRequest {
|
|
|
567
567
|
*/
|
|
568
568
|
export function makePrivateCircuitPublicInputs(seed = 0): PrivateCircuitPublicInputs {
|
|
569
569
|
return PrivateCircuitPublicInputs.from({
|
|
570
|
-
|
|
570
|
+
maxBlockNumber: new MaxBlockNumber(true, seed + 0x31415),
|
|
571
571
|
callContext: makeCallContext(seed, { isStaticCall: true }),
|
|
572
572
|
argsHash: fr(seed + 0x100),
|
|
573
573
|
returnsHash: fr(seed + 0x200),
|
|
@@ -684,6 +684,7 @@ export function makeBaseOrMergeRollupPublicInputs(
|
|
|
684
684
|
globalVariables: GlobalVariables | undefined = undefined,
|
|
685
685
|
): BaseOrMergeRollupPublicInputs {
|
|
686
686
|
return new BaseOrMergeRollupPublicInputs(
|
|
687
|
+
RollupTypes.Base,
|
|
687
688
|
1,
|
|
688
689
|
makeBlockConstantData(seed + 0x200, globalVariables),
|
|
689
690
|
makePartialStateReference(seed + 0x300),
|
|
@@ -832,6 +833,7 @@ export function makeEmptyBlockRootRollupInputs(
|
|
|
832
833
|
return new EmptyBlockRootRollupInputs(
|
|
833
834
|
makeBlockRootRollupData(seed + 0x1000),
|
|
834
835
|
makeBlockConstantData(0x2500, globalVariables),
|
|
836
|
+
true,
|
|
835
837
|
);
|
|
836
838
|
}
|
|
837
839
|
|
package/src/tx/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from './block_header.js';
|
|
2
2
|
export * from './call_context.js';
|
|
3
3
|
export * from './global_variables.js';
|
|
4
|
-
export * from './
|
|
4
|
+
export * from './max_block_number.js';
|
|
5
5
|
export * from './content_commitment.js';
|
|
6
6
|
export * from './state_reference.js';
|
|
7
7
|
export * from './partial_state_reference.js';
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { MAX_BLOCK_NUMBER_LENGTH } from '@aztec/constants';
|
|
2
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
3
|
+
import { BufferReader, FieldReader, serializeToBuffer, serializeToFields } from '@aztec/foundation/serialize';
|
|
4
|
+
import type { FieldsOf } from '@aztec/foundation/types';
|
|
5
|
+
|
|
6
|
+
import type { UInt32 } from '../types/index.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Maximum block number.
|
|
10
|
+
*/
|
|
11
|
+
export class MaxBlockNumber {
|
|
12
|
+
constructor(
|
|
13
|
+
/**
|
|
14
|
+
* Whether a max block number was requested.
|
|
15
|
+
*/
|
|
16
|
+
public isSome: boolean,
|
|
17
|
+
/**
|
|
18
|
+
* The requested max block number, if isSome is true.
|
|
19
|
+
*/
|
|
20
|
+
public value: UInt32,
|
|
21
|
+
) {}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Serialize as a buffer.
|
|
25
|
+
* @returns The buffer.
|
|
26
|
+
*/
|
|
27
|
+
toBuffer() {
|
|
28
|
+
return serializeToBuffer(...MaxBlockNumber.getFields(this));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
toFields(): Fr[] {
|
|
32
|
+
const fields = serializeToFields(...MaxBlockNumber.getFields(this));
|
|
33
|
+
if (fields.length !== MAX_BLOCK_NUMBER_LENGTH) {
|
|
34
|
+
throw new Error(
|
|
35
|
+
`Invalid number of fields for MaxBlockNumber. Expected ${MAX_BLOCK_NUMBER_LENGTH}, got ${fields.length}`,
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
return fields;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Deserializes MaxBlockNumber from a buffer or reader.
|
|
43
|
+
* @param buffer - Buffer to read from.
|
|
44
|
+
* @returns The MaxBlockNumber.
|
|
45
|
+
*/
|
|
46
|
+
static fromBuffer(buffer: Buffer | BufferReader): MaxBlockNumber {
|
|
47
|
+
const reader = BufferReader.asReader(buffer);
|
|
48
|
+
return new MaxBlockNumber(reader.readBoolean(), reader.readNumber());
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
static fromFields(fields: Fr[] | FieldReader): MaxBlockNumber {
|
|
52
|
+
const reader = FieldReader.asReader(fields);
|
|
53
|
+
return new MaxBlockNumber(reader.readBoolean(), reader.readU32());
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
static empty() {
|
|
57
|
+
return new MaxBlockNumber(false, 0);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
isEmpty(): boolean {
|
|
61
|
+
return !this.isSome && this.value === 0;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Create a new instance from a fields dictionary.
|
|
66
|
+
* @param fields - The dictionary.
|
|
67
|
+
* @returns A new instance.
|
|
68
|
+
*/
|
|
69
|
+
static from(fields: FieldsOf<MaxBlockNumber>): MaxBlockNumber {
|
|
70
|
+
return new MaxBlockNumber(...MaxBlockNumber.getFields(fields));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Serialize into a field array. Low-level utility.
|
|
75
|
+
* @param fields - Object with fields.
|
|
76
|
+
* @returns The array.
|
|
77
|
+
*/
|
|
78
|
+
static getFields(fields: FieldsOf<MaxBlockNumber>) {
|
|
79
|
+
return [fields.isSome, fields.value] as const;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -2,7 +2,6 @@ import { Fr } from '@aztec/foundation/fields';
|
|
|
2
2
|
|
|
3
3
|
import type { AztecAddress } from '../aztec-address/index.js';
|
|
4
4
|
|
|
5
|
-
// The following identifier was copied over from `noir-projects/aztec-nr/aztec/src/messages/offchain_messages.nr`.
|
|
6
5
|
// poseidon2hash("aztecnr_offchain_message")
|
|
7
6
|
export const OFFCHAIN_MESSAGE_IDENTIFIER: Fr = new Fr(
|
|
8
7
|
6023466688192654631553769360478808766602235351827869819420284624004071427516n,
|
|
@@ -11,7 +11,7 @@ export const TX_ERROR_DUPLICATE_NULLIFIER_IN_TX = 'Duplicate nullifier in tx';
|
|
|
11
11
|
export const TX_ERROR_EXISTING_NULLIFIER = 'Existing nullifier';
|
|
12
12
|
|
|
13
13
|
// Metadata
|
|
14
|
-
export const
|
|
14
|
+
export const TX_ERROR_INVALID_MAX_BLOCK_NUMBER = 'Invalid max block number';
|
|
15
15
|
export const TX_ERROR_INCORRECT_L1_CHAIN_ID = 'Incorrect L1 chain id';
|
|
16
16
|
export const TX_ERROR_INCORRECT_ROLLUP_VERSION = 'Incorrect rollup version';
|
|
17
17
|
export const TX_ERROR_INCORRECT_VK_TREE_ROOT = 'Incorrect protocol circuits tree root';
|
package/src/types/shared.ts
CHANGED
|
@@ -9,7 +9,6 @@ import { bufferSchemaFor } from '@aztec/foundation/schemas';
|
|
|
9
9
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
10
10
|
import { bufferToHex, hexToBuffer } from '@aztec/foundation/string';
|
|
11
11
|
|
|
12
|
-
import { hashVK } from '../hash/index.js';
|
|
13
12
|
import { CircuitType } from '../types/shared.js';
|
|
14
13
|
|
|
15
14
|
/**
|
|
@@ -94,11 +93,6 @@ export class VerificationKeyAsFields {
|
|
|
94
93
|
public hash: Fr,
|
|
95
94
|
) {}
|
|
96
95
|
|
|
97
|
-
static async fromKey(key: Fr[]) {
|
|
98
|
-
const hash = await hashVK(key);
|
|
99
|
-
return new VerificationKeyAsFields(key, hash);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
96
|
public get numPublicInputs() {
|
|
103
97
|
return Number(this.key[CIRCUIT_PUBLIC_INPUTS_INDEX]);
|
|
104
98
|
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { BufferReader } from '@aztec/foundation/serialize';
|
|
2
|
-
import type { FieldsOf } from '@aztec/foundation/types';
|
|
3
|
-
import { EpochConstantData } from './epoch_constant_data.js';
|
|
4
|
-
/**
|
|
5
|
-
* Inputs of the padding block root rollup circuit.
|
|
6
|
-
*/
|
|
7
|
-
export declare class PaddingBlockRootRollupInputs {
|
|
8
|
-
readonly constants: EpochConstantData;
|
|
9
|
-
constructor(constants: EpochConstantData);
|
|
10
|
-
static from(fields: FieldsOf<PaddingBlockRootRollupInputs>): PaddingBlockRootRollupInputs;
|
|
11
|
-
static getFields(fields: FieldsOf<PaddingBlockRootRollupInputs>): readonly [EpochConstantData];
|
|
12
|
-
static fromBuffer(buffer: Buffer | BufferReader): PaddingBlockRootRollupInputs;
|
|
13
|
-
toBuffer(): Buffer<ArrayBufferLike>;
|
|
14
|
-
static fromString(str: string): PaddingBlockRootRollupInputs;
|
|
15
|
-
toString(): `0x${string}`;
|
|
16
|
-
/** Returns a buffer representation for JSON serialization. */
|
|
17
|
-
toJSON(): Buffer<ArrayBufferLike>;
|
|
18
|
-
static get schema(): import("zod").ZodType<PaddingBlockRootRollupInputs, any, string>;
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=padding_block_root_rollup_inputs.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"padding_block_root_rollup_inputs.d.ts","sourceRoot":"","sources":["../../src/rollup/padding_block_root_rollup_inputs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAE9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;GAEG;AACH,qBAAa,4BAA4B;aACX,SAAS,EAAE,iBAAiB;gBAA5B,SAAS,EAAE,iBAAiB;IAExD,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,4BAA4B,CAAC,GAAG,4BAA4B;IAIzF,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,4BAA4B,CAAC;IAI/D,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,4BAA4B;IAK9E,QAAQ;IAIR,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM;IAI7B,QAAQ;IAIR,8DAA8D;IAC9D,MAAM;IAIN,MAAM,KAAK,MAAM,qEAEhB;CACF"}
|