@aztec/archiver 0.0.1-commit.3469e52 → 0.0.1-commit.381b1a9
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/README.md +9 -0
- package/dest/archiver.d.ts +12 -8
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +81 -120
- package/dest/errors.d.ts +6 -1
- package/dest/errors.d.ts.map +1 -1
- package/dest/errors.js +8 -0
- package/dest/factory.d.ts +3 -1
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +14 -11
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/l1/bin/retrieve-calldata.js +35 -32
- package/dest/l1/calldata_retriever.d.ts +73 -50
- package/dest/l1/calldata_retriever.d.ts.map +1 -1
- package/dest/l1/calldata_retriever.js +190 -259
- package/dest/l1/data_retrieval.d.ts +4 -7
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/l1/data_retrieval.js +12 -16
- package/dest/l1/spire_proposer.d.ts +5 -5
- package/dest/l1/spire_proposer.d.ts.map +1 -1
- package/dest/l1/spire_proposer.js +9 -17
- package/dest/l1/validate_trace.d.ts +6 -3
- package/dest/l1/validate_trace.d.ts.map +1 -1
- package/dest/l1/validate_trace.js +13 -9
- package/dest/modules/data_source_base.d.ts +25 -21
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +45 -120
- package/dest/modules/data_store_updater.d.ts +40 -21
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +114 -64
- package/dest/modules/instrumentation.d.ts +6 -4
- package/dest/modules/instrumentation.d.ts.map +1 -1
- package/dest/modules/instrumentation.js +26 -12
- package/dest/modules/l1_synchronizer.d.ts +5 -8
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +46 -20
- package/dest/store/block_store.d.ts +49 -32
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +165 -54
- package/dest/store/contract_class_store.d.ts +1 -1
- package/dest/store/contract_class_store.d.ts.map +1 -1
- package/dest/store/contract_class_store.js +11 -7
- package/dest/store/kv_archiver_store.d.ts +53 -25
- package/dest/store/kv_archiver_store.d.ts.map +1 -1
- package/dest/store/kv_archiver_store.js +50 -17
- package/dest/store/l2_tips_cache.d.ts +19 -0
- package/dest/store/l2_tips_cache.d.ts.map +1 -0
- package/dest/store/l2_tips_cache.js +89 -0
- package/dest/store/log_store.d.ts +4 -4
- package/dest/store/log_store.d.ts.map +1 -1
- package/dest/store/log_store.js +105 -47
- package/dest/store/message_store.js +1 -1
- package/dest/test/fake_l1_state.d.ts +16 -4
- package/dest/test/fake_l1_state.d.ts.map +1 -1
- package/dest/test/fake_l1_state.js +84 -20
- package/dest/test/index.js +3 -1
- package/dest/test/mock_archiver.d.ts +1 -1
- package/dest/test/mock_archiver.d.ts.map +1 -1
- package/dest/test/mock_archiver.js +3 -2
- package/dest/test/mock_l2_block_source.d.ts +39 -23
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +157 -112
- package/dest/test/mock_structs.d.ts +6 -2
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +24 -10
- package/dest/test/noop_l1_archiver.d.ts +26 -0
- package/dest/test/noop_l1_archiver.d.ts.map +1 -0
- package/dest/test/noop_l1_archiver.js +72 -0
- package/package.json +14 -13
- package/src/archiver.ts +106 -149
- package/src/errors.ts +12 -0
- package/src/factory.ts +29 -12
- package/src/index.ts +1 -0
- package/src/l1/README.md +25 -68
- package/src/l1/bin/retrieve-calldata.ts +45 -33
- package/src/l1/calldata_retriever.ts +249 -379
- package/src/l1/data_retrieval.ts +10 -20
- package/src/l1/spire_proposer.ts +7 -15
- package/src/l1/validate_trace.ts +24 -6
- package/src/modules/data_source_base.ts +76 -166
- package/src/modules/data_store_updater.ts +130 -66
- package/src/modules/instrumentation.ts +26 -14
- package/src/modules/l1_synchronizer.ts +55 -26
- package/src/store/block_store.ts +216 -92
- package/src/store/contract_class_store.ts +11 -7
- package/src/store/kv_archiver_store.ts +88 -30
- package/src/store/l2_tips_cache.ts +89 -0
- package/src/store/log_store.ts +171 -55
- package/src/store/message_store.ts +1 -1
- package/src/test/fake_l1_state.ts +112 -23
- package/src/test/index.ts +3 -0
- package/src/test/mock_archiver.ts +3 -2
- package/src/test/mock_l2_block_source.ts +211 -129
- package/src/test/mock_structs.ts +45 -15
- package/src/test/noop_l1_archiver.ts +115 -0
|
@@ -3,8 +3,8 @@ import { Fr } from '@aztec/foundation/curves/bn254';
|
|
|
3
3
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
4
|
import type { FunctionSelector } from '@aztec/stdlib/abi';
|
|
5
5
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
6
|
-
import {
|
|
7
|
-
import { Checkpoint, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
6
|
+
import { type BlockData, BlockHash, CheckpointedL2Block, L2Block, type L2BlockSource, type L2Tips, type ValidateCheckpointResult } from '@aztec/stdlib/block';
|
|
7
|
+
import { Checkpoint, type CheckpointData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
8
8
|
import type { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
9
9
|
import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
10
10
|
import { type BlockHeader, TxHash, TxReceipt } from '@aztec/stdlib/tx';
|
|
@@ -13,13 +13,18 @@ import type { UInt64 } from '@aztec/stdlib/types';
|
|
|
13
13
|
* A mocked implementation of L2BlockSource to be used in tests.
|
|
14
14
|
*/
|
|
15
15
|
export declare class MockL2BlockSource implements L2BlockSource, ContractDataSource {
|
|
16
|
-
protected l2Blocks:
|
|
16
|
+
protected l2Blocks: L2Block[];
|
|
17
|
+
protected checkpointList: Checkpoint[];
|
|
17
18
|
private provenBlockNumber;
|
|
18
19
|
private finalizedBlockNumber;
|
|
19
20
|
private checkpointedBlockNumber;
|
|
20
21
|
private log;
|
|
22
|
+
/** Creates blocks grouped into single-block checkpoints. */
|
|
21
23
|
createBlocks(numBlocks: number): Promise<void>;
|
|
22
|
-
|
|
24
|
+
getCheckpointNumber(): Promise<CheckpointNumber>;
|
|
25
|
+
/** Creates checkpoints, each containing `blocksPerCheckpoint` blocks. */
|
|
26
|
+
createCheckpoints(numCheckpoints: number, blocksPerCheckpoint?: number): Promise<void>;
|
|
27
|
+
addProposedBlocks(blocks: L2Block[]): void;
|
|
23
28
|
removeBlocks(numBlocks: number): void;
|
|
24
29
|
setProvenBlockNumber(provenBlockNumber: number): void;
|
|
25
30
|
setFinalizedBlockNumber(finalizedBlockNumber: number): void;
|
|
@@ -40,42 +45,45 @@ export declare class MockL2BlockSource implements L2BlockSource, ContractDataSou
|
|
|
40
45
|
*/
|
|
41
46
|
getBlockNumber(): Promise<BlockNumber>;
|
|
42
47
|
getProvenBlockNumber(): Promise<BlockNumber>;
|
|
48
|
+
getCheckpointedL2BlockNumber(): Promise<BlockNumber>;
|
|
49
|
+
getFinalizedL2BlockNumber(): Promise<BlockNumber>;
|
|
43
50
|
getCheckpointedBlock(number: BlockNumber): Promise<CheckpointedL2Block | undefined>;
|
|
44
|
-
getCheckpointedBlocks(from: BlockNumber, limit: number
|
|
51
|
+
getCheckpointedBlocks(from: BlockNumber, limit: number): Promise<CheckpointedL2Block[]>;
|
|
45
52
|
/**
|
|
46
53
|
* Gets an l2 block.
|
|
47
54
|
* @param number - The block number to return (inclusive).
|
|
48
55
|
* @returns The requested L2 block.
|
|
49
56
|
*/
|
|
50
|
-
getBlock(number: number): Promise<
|
|
57
|
+
getBlock(number: number): Promise<L2Block | undefined>;
|
|
51
58
|
/**
|
|
52
59
|
* Gets an L2 block (new format).
|
|
53
60
|
* @param number - The block number to return.
|
|
54
61
|
* @returns The requested L2 block.
|
|
55
62
|
*/
|
|
56
|
-
|
|
63
|
+
getL2Block(number: BlockNumber): Promise<L2Block | undefined>;
|
|
57
64
|
/**
|
|
58
65
|
* Gets up to `limit` amount of L2 blocks starting from `from`.
|
|
59
66
|
* @param from - Number of the first block to return (inclusive).
|
|
60
67
|
* @param limit - The maximum number of blocks to return.
|
|
61
68
|
* @returns The requested mocked L2 blocks.
|
|
62
69
|
*/
|
|
63
|
-
getBlocks(from: number, limit: number
|
|
64
|
-
|
|
70
|
+
getBlocks(from: number, limit: number): Promise<L2Block[]>;
|
|
71
|
+
getCheckpoints(from: CheckpointNumber, limit: number): Promise<PublishedCheckpoint[]>;
|
|
65
72
|
getCheckpointByArchive(archive: Fr): Promise<Checkpoint | undefined>;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
getL2BlockNewByArchive(archive: Fr): Promise<L2BlockNew | undefined>;
|
|
72
|
-
getBlockHeaderByHash(blockHash: Fr): Promise<BlockHeader | undefined>;
|
|
73
|
+
getCheckpointedBlockByHash(blockHash: BlockHash): Promise<CheckpointedL2Block | undefined>;
|
|
74
|
+
getCheckpointedBlockByArchive(archive: Fr): Promise<CheckpointedL2Block | undefined>;
|
|
75
|
+
getL2BlockByHash(blockHash: BlockHash): Promise<L2Block | undefined>;
|
|
76
|
+
getL2BlockByArchive(archive: Fr): Promise<L2Block | undefined>;
|
|
77
|
+
getBlockHeaderByHash(blockHash: BlockHash): Promise<BlockHeader | undefined>;
|
|
73
78
|
getBlockHeaderByArchive(archive: Fr): Promise<BlockHeader | undefined>;
|
|
79
|
+
getBlockData(number: BlockNumber): Promise<BlockData | undefined>;
|
|
80
|
+
getBlockDataByArchive(archive: Fr): Promise<BlockData | undefined>;
|
|
74
81
|
getBlockHeader(number: number | 'latest'): Promise<BlockHeader | undefined>;
|
|
75
82
|
getCheckpointsForEpoch(epochNumber: EpochNumber): Promise<Checkpoint[]>;
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
83
|
+
getCheckpointsDataForEpoch(epochNumber: EpochNumber): Promise<CheckpointData[]>;
|
|
84
|
+
getCheckpointedBlocksForEpoch(epochNumber: EpochNumber): Promise<CheckpointedL2Block[]>;
|
|
85
|
+
getBlocksForSlot(slotNumber: SlotNumber): Promise<L2Block[]>;
|
|
86
|
+
getCheckpointedBlockHeadersForEpoch(epochNumber: EpochNumber): Promise<BlockHeader[]>;
|
|
79
87
|
/**
|
|
80
88
|
* Gets a tx effect.
|
|
81
89
|
* @param txHash - The hash of the tx corresponding to the tx effect.
|
|
@@ -84,7 +92,7 @@ export declare class MockL2BlockSource implements L2BlockSource, ContractDataSou
|
|
|
84
92
|
getTxEffect(txHash: TxHash): Promise<{
|
|
85
93
|
data: import("@aztec/stdlib/tx").TxEffect;
|
|
86
94
|
l2BlockNumber: BlockNumber;
|
|
87
|
-
l2BlockHash:
|
|
95
|
+
l2BlockHash: BlockHash;
|
|
88
96
|
txIndexInBlock: number;
|
|
89
97
|
} | undefined>;
|
|
90
98
|
/**
|
|
@@ -94,8 +102,8 @@ export declare class MockL2BlockSource implements L2BlockSource, ContractDataSou
|
|
|
94
102
|
*/
|
|
95
103
|
getSettledTxReceipt(txHash: TxHash): Promise<TxReceipt | undefined>;
|
|
96
104
|
getL2Tips(): Promise<L2Tips>;
|
|
97
|
-
|
|
98
|
-
|
|
105
|
+
getSyncedL2EpochNumber(): Promise<EpochNumber>;
|
|
106
|
+
getSyncedL2SlotNumber(): Promise<SlotNumber>;
|
|
99
107
|
isEpochComplete(_epochNumber: EpochNumber): Promise<boolean>;
|
|
100
108
|
getL1Constants(): Promise<L1RollupConstants>;
|
|
101
109
|
getGenesisValues(): Promise<{
|
|
@@ -121,5 +129,13 @@ export declare class MockL2BlockSource implements L2BlockSource, ContractDataSou
|
|
|
121
129
|
syncImmediate(): Promise<void>;
|
|
122
130
|
isPendingChainInvalid(): Promise<boolean>;
|
|
123
131
|
getPendingChainValidationStatus(): Promise<ValidateCheckpointResult>;
|
|
132
|
+
/** Returns checkpoints whose slot falls within the given epoch. */
|
|
133
|
+
private getCheckpointsInEpoch;
|
|
134
|
+
/** Creates a mock L1PublishedData for a checkpoint. */
|
|
135
|
+
private mockL1DataForCheckpoint;
|
|
136
|
+
/** Creates a CheckpointedL2Block from a block using stored checkpoint info. */
|
|
137
|
+
private toCheckpointedBlock;
|
|
138
|
+
/** Finds the checkpoint number for a block, or undefined if the block is not in any checkpoint. */
|
|
139
|
+
private findCheckpointNumberForBlock;
|
|
124
140
|
}
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19sMl9ibG9ja19zb3VyY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L21vY2tfbDJfYmxvY2tfc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXpHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFM0QsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsS0FBSyxTQUFTLEVBQ2QsU0FBUyxFQUNULG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsS0FBSyxhQUFhLEVBQ2xCLEtBQUssTUFBTSxFQUNYLEtBQUssd0JBQXdCLEVBQzlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLGNBQWMsRUFBbUIsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNqSCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ILE9BQU8sRUFFTCxLQUFLLGlCQUFpQixFQUd2QixNQUFNLDZCQUE2QixDQUFDO0FBR3JDLE9BQU8sRUFBRSxLQUFLLFdBQVcsRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBWSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BHLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxEOztHQUVHO0FBQ0gscUJBQWEsaUJBQWtCLFlBQVcsYUFBYSxFQUFFLGtCQUFrQjtJQUN6RSxT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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock_l2_block_source.d.ts","sourceRoot":"","sources":["../../src/test/mock_l2_block_source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAEzG,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACL,mBAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"mock_l2_block_source.d.ts","sourceRoot":"","sources":["../../src/test/mock_l2_block_source.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,34 +5,59 @@ import { Buffer32 } from '@aztec/foundation/buffer';
|
|
|
5
5
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
6
6
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
7
7
|
import { createLogger } from '@aztec/foundation/log';
|
|
8
|
-
import { CheckpointedL2Block
|
|
8
|
+
import { CheckpointedL2Block } from '@aztec/stdlib/block';
|
|
9
9
|
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
10
|
-
import { EmptyL1RollupConstants, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
11
|
-
import {
|
|
10
|
+
import { EmptyL1RollupConstants, getEpochAtSlot, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
11
|
+
import { computeCheckpointOutHash } from '@aztec/stdlib/messaging';
|
|
12
|
+
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
13
|
+
import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
12
14
|
/**
|
|
13
15
|
* A mocked implementation of L2BlockSource to be used in tests.
|
|
14
16
|
*/ export class MockL2BlockSource {
|
|
15
17
|
l2Blocks = [];
|
|
18
|
+
checkpointList = [];
|
|
16
19
|
provenBlockNumber = 0;
|
|
17
20
|
finalizedBlockNumber = 0;
|
|
18
21
|
checkpointedBlockNumber = 0;
|
|
19
22
|
log = createLogger('archiver:mock_l2_block_source');
|
|
20
|
-
async createBlocks(numBlocks) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
/** Creates blocks grouped into single-block checkpoints. */ async createBlocks(numBlocks) {
|
|
24
|
+
await this.createCheckpoints(numBlocks, 1);
|
|
25
|
+
}
|
|
26
|
+
getCheckpointNumber() {
|
|
27
|
+
return Promise.resolve(this.checkpointList.length === 0 ? CheckpointNumber.ZERO : CheckpointNumber(this.checkpointList.length));
|
|
28
|
+
}
|
|
29
|
+
/** Creates checkpoints, each containing `blocksPerCheckpoint` blocks. */ async createCheckpoints(numCheckpoints, blocksPerCheckpoint = 1) {
|
|
30
|
+
for(let c = 0; c < numCheckpoints; c++){
|
|
31
|
+
const checkpointNum = CheckpointNumber(this.checkpointList.length + 1);
|
|
32
|
+
const startBlockNum = this.l2Blocks.length + 1;
|
|
33
|
+
const slotNumber = SlotNumber(Number(checkpointNum));
|
|
34
|
+
const checkpoint = await Checkpoint.random(checkpointNum, {
|
|
35
|
+
numBlocks: blocksPerCheckpoint,
|
|
36
|
+
startBlockNumber: startBlockNum,
|
|
37
|
+
slotNumber,
|
|
38
|
+
checkpointNumber: checkpointNum
|
|
25
39
|
});
|
|
26
|
-
this.
|
|
40
|
+
this.checkpointList.push(checkpoint);
|
|
41
|
+
this.l2Blocks.push(...checkpoint.blocks);
|
|
27
42
|
}
|
|
28
|
-
this.log.verbose(`Created ${
|
|
43
|
+
this.log.verbose(`Created ${numCheckpoints} checkpoints with ${blocksPerCheckpoint} blocks each in the mock L2 block source`);
|
|
29
44
|
}
|
|
30
|
-
|
|
45
|
+
addProposedBlocks(blocks) {
|
|
31
46
|
this.l2Blocks.push(...blocks);
|
|
32
|
-
this.log.verbose(`Added ${blocks.length} blocks to the mock L2 block source`);
|
|
47
|
+
this.log.verbose(`Added ${blocks.length} proposed blocks to the mock L2 block source`);
|
|
33
48
|
}
|
|
34
49
|
removeBlocks(numBlocks) {
|
|
35
50
|
this.l2Blocks = this.l2Blocks.slice(0, -numBlocks);
|
|
51
|
+
const maxBlockNum = this.l2Blocks.length;
|
|
52
|
+
// Remove any checkpoint whose last block is beyond the remaining blocks.
|
|
53
|
+
this.checkpointList = this.checkpointList.filter((c)=>{
|
|
54
|
+
const lastBlockNum = c.blocks[0].number + c.blocks.length - 1;
|
|
55
|
+
return lastBlockNum <= maxBlockNum;
|
|
56
|
+
});
|
|
57
|
+
// Keep tip numbers consistent with remaining blocks.
|
|
58
|
+
this.checkpointedBlockNumber = Math.min(this.checkpointedBlockNumber, maxBlockNum);
|
|
59
|
+
this.provenBlockNumber = Math.min(this.provenBlockNumber, maxBlockNum);
|
|
60
|
+
this.finalizedBlockNumber = Math.min(this.finalizedBlockNumber, maxBlockNum);
|
|
36
61
|
this.log.verbose(`Removed ${numBlocks} blocks from the mock L2 block source`);
|
|
37
62
|
}
|
|
38
63
|
setProvenBlockNumber(provenBlockNumber) {
|
|
@@ -45,7 +70,32 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
45
70
|
this.finalizedBlockNumber = finalizedBlockNumber;
|
|
46
71
|
}
|
|
47
72
|
setCheckpointedBlockNumber(checkpointedBlockNumber) {
|
|
73
|
+
const prevCheckpointed = this.checkpointedBlockNumber;
|
|
48
74
|
this.checkpointedBlockNumber = checkpointedBlockNumber;
|
|
75
|
+
// Auto-create single-block checkpoints for newly checkpointed blocks that don't have one yet.
|
|
76
|
+
// This handles blocks added via addProposedBlocks that are now being marked as checkpointed.
|
|
77
|
+
const newCheckpoints = [];
|
|
78
|
+
for(let blockNum = prevCheckpointed + 1; blockNum <= checkpointedBlockNumber; blockNum++){
|
|
79
|
+
const block = this.l2Blocks[blockNum - 1];
|
|
80
|
+
if (!block) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (this.checkpointList.some((c)=>c.blocks.some((b)=>b.number === block.number))) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const checkpointNum = CheckpointNumber(this.checkpointList.length + newCheckpoints.length + 1);
|
|
87
|
+
const checkpoint = new Checkpoint(block.archive, CheckpointHeader.random({
|
|
88
|
+
slotNumber: block.header.globalVariables.slotNumber
|
|
89
|
+
}), [
|
|
90
|
+
block
|
|
91
|
+
], checkpointNum);
|
|
92
|
+
newCheckpoints.push(checkpoint);
|
|
93
|
+
}
|
|
94
|
+
// Insert new checkpoints in order by number.
|
|
95
|
+
if (newCheckpoints.length > 0) {
|
|
96
|
+
this.checkpointList.push(...newCheckpoints);
|
|
97
|
+
this.checkpointList.sort((a, b)=>a.number - b.number);
|
|
98
|
+
}
|
|
49
99
|
}
|
|
50
100
|
/**
|
|
51
101
|
* Method to fetch the rollup contract address at the base-layer.
|
|
@@ -68,6 +118,12 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
68
118
|
getProvenBlockNumber() {
|
|
69
119
|
return Promise.resolve(BlockNumber(this.provenBlockNumber));
|
|
70
120
|
}
|
|
121
|
+
getCheckpointedL2BlockNumber() {
|
|
122
|
+
return Promise.resolve(BlockNumber(this.checkpointedBlockNumber));
|
|
123
|
+
}
|
|
124
|
+
getFinalizedL2BlockNumber() {
|
|
125
|
+
return Promise.resolve(BlockNumber(this.finalizedBlockNumber));
|
|
126
|
+
}
|
|
71
127
|
getCheckpointedBlock(number) {
|
|
72
128
|
if (number > this.checkpointedBlockNumber) {
|
|
73
129
|
return Promise.resolve(undefined);
|
|
@@ -76,10 +132,9 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
76
132
|
if (!block) {
|
|
77
133
|
return Promise.resolve(undefined);
|
|
78
134
|
}
|
|
79
|
-
|
|
80
|
-
return Promise.resolve(checkpointedBlock);
|
|
135
|
+
return Promise.resolve(this.toCheckpointedBlock(block));
|
|
81
136
|
}
|
|
82
|
-
async getCheckpointedBlocks(from, limit
|
|
137
|
+
async getCheckpointedBlocks(from, limit) {
|
|
83
138
|
const result = [];
|
|
84
139
|
for(let i = 0; i < limit; i++){
|
|
85
140
|
const blockNum = from + i;
|
|
@@ -105,7 +160,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
105
160
|
* Gets an L2 block (new format).
|
|
106
161
|
* @param number - The block number to return.
|
|
107
162
|
* @returns The requested L2 block.
|
|
108
|
-
*/
|
|
163
|
+
*/ getL2Block(number) {
|
|
109
164
|
const block = this.l2Blocks[number - 1];
|
|
110
165
|
return Promise.resolve(block);
|
|
111
166
|
}
|
|
@@ -114,78 +169,34 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
114
169
|
* @param from - Number of the first block to return (inclusive).
|
|
115
170
|
* @param limit - The maximum number of blocks to return.
|
|
116
171
|
* @returns The requested mocked L2 blocks.
|
|
117
|
-
*/ getBlocks(from, limit
|
|
118
|
-
return Promise.resolve(this.l2Blocks.slice(from - 1, from - 1 + limit)
|
|
119
|
-
}
|
|
120
|
-
getPublishedCheckpoints(from, limit) {
|
|
121
|
-
// TODO(mbps): Implement this properly. This only works when we have one block per checkpoint.
|
|
122
|
-
const blocks = this.l2Blocks.slice(from - 1, from - 1 + limit);
|
|
123
|
-
return Promise.all(blocks.map(async (block)=>{
|
|
124
|
-
// Create a checkpoint from the block - manually construct since L2BlockNew doesn't have toCheckpoint()
|
|
125
|
-
const checkpoint = await Checkpoint.random(block.checkpointNumber, {
|
|
126
|
-
numBlocks: 1
|
|
127
|
-
});
|
|
128
|
-
checkpoint.blocks = [
|
|
129
|
-
block
|
|
130
|
-
];
|
|
131
|
-
return new PublishedCheckpoint(checkpoint, new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()), []);
|
|
132
|
-
}));
|
|
172
|
+
*/ getBlocks(from, limit) {
|
|
173
|
+
return Promise.resolve(this.l2Blocks.slice(from - 1, from - 1 + limit));
|
|
133
174
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
if (!block) {
|
|
138
|
-
return undefined;
|
|
139
|
-
}
|
|
140
|
-
// Create a checkpoint from the block - manually construct since L2BlockNew doesn't have toCheckpoint()
|
|
141
|
-
const checkpoint = await Checkpoint.random(block.checkpointNumber, {
|
|
142
|
-
numBlocks: 1
|
|
143
|
-
});
|
|
144
|
-
checkpoint.blocks = [
|
|
145
|
-
block
|
|
146
|
-
];
|
|
147
|
-
return checkpoint;
|
|
148
|
-
}
|
|
149
|
-
getPublishedBlocks(from, limit, proven) {
|
|
150
|
-
const blocks = this.l2Blocks.slice(from - 1, from - 1 + limit).filter((b)=>!proven || this.provenBlockNumber === undefined || b.number <= this.provenBlockNumber);
|
|
151
|
-
return Promise.resolve(blocks.map((block)=>CheckpointedL2Block.fromFields({
|
|
152
|
-
checkpointNumber: CheckpointNumber(block.number),
|
|
153
|
-
block,
|
|
154
|
-
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
155
|
-
attestations: []
|
|
156
|
-
})));
|
|
175
|
+
getCheckpoints(from, limit) {
|
|
176
|
+
const checkpoints = this.checkpointList.slice(from - 1, from - 1 + limit);
|
|
177
|
+
return Promise.resolve(checkpoints.map((checkpoint)=>new PublishedCheckpoint(checkpoint, this.mockL1DataForCheckpoint(checkpoint), [])));
|
|
157
178
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
return
|
|
179
|
+
getCheckpointByArchive(archive) {
|
|
180
|
+
const checkpoint = this.checkpointList.find((c)=>c.archive.root.equals(archive));
|
|
181
|
+
return Promise.resolve(checkpoint);
|
|
161
182
|
}
|
|
162
|
-
async
|
|
183
|
+
async getCheckpointedBlockByHash(blockHash) {
|
|
163
184
|
for (const block of this.l2Blocks){
|
|
164
185
|
const hash = await block.hash();
|
|
165
186
|
if (hash.equals(blockHash)) {
|
|
166
|
-
return
|
|
167
|
-
checkpointNumber: CheckpointNumber(block.number),
|
|
168
|
-
block,
|
|
169
|
-
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
170
|
-
attestations: []
|
|
171
|
-
});
|
|
187
|
+
return this.toCheckpointedBlock(block);
|
|
172
188
|
}
|
|
173
189
|
}
|
|
174
190
|
return undefined;
|
|
175
191
|
}
|
|
176
|
-
|
|
192
|
+
getCheckpointedBlockByArchive(archive) {
|
|
177
193
|
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
178
194
|
if (!block) {
|
|
179
195
|
return Promise.resolve(undefined);
|
|
180
196
|
}
|
|
181
|
-
return Promise.resolve(
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
185
|
-
attestations: []
|
|
186
|
-
}));
|
|
187
|
-
}
|
|
188
|
-
async getL2BlockNewByHash(blockHash) {
|
|
197
|
+
return Promise.resolve(this.toCheckpointedBlock(block));
|
|
198
|
+
}
|
|
199
|
+
async getL2BlockByHash(blockHash) {
|
|
189
200
|
for (const block of this.l2Blocks){
|
|
190
201
|
const hash = await block.hash();
|
|
191
202
|
if (hash.equals(blockHash)) {
|
|
@@ -194,7 +205,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
194
205
|
}
|
|
195
206
|
return undefined;
|
|
196
207
|
}
|
|
197
|
-
|
|
208
|
+
getL2BlockByArchive(archive) {
|
|
198
209
|
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
199
210
|
return Promise.resolve(block);
|
|
200
211
|
}
|
|
@@ -211,48 +222,62 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
211
222
|
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
212
223
|
return Promise.resolve(block?.header);
|
|
213
224
|
}
|
|
225
|
+
async getBlockData(number) {
|
|
226
|
+
const block = this.l2Blocks[number - 1];
|
|
227
|
+
if (!block) {
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
header: block.header,
|
|
232
|
+
archive: block.archive,
|
|
233
|
+
blockHash: await block.hash(),
|
|
234
|
+
checkpointNumber: block.checkpointNumber,
|
|
235
|
+
indexWithinCheckpoint: block.indexWithinCheckpoint
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
async getBlockDataByArchive(archive) {
|
|
239
|
+
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
240
|
+
if (!block) {
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
header: block.header,
|
|
245
|
+
archive: block.archive,
|
|
246
|
+
blockHash: await block.hash(),
|
|
247
|
+
checkpointNumber: block.checkpointNumber,
|
|
248
|
+
indexWithinCheckpoint: block.indexWithinCheckpoint
|
|
249
|
+
};
|
|
250
|
+
}
|
|
214
251
|
getBlockHeader(number) {
|
|
215
252
|
return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.header);
|
|
216
253
|
}
|
|
217
254
|
getCheckpointsForEpoch(epochNumber) {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
});
|
|
232
|
-
checkpoint.blocks = [
|
|
233
|
-
block
|
|
234
|
-
];
|
|
235
|
-
return checkpoint;
|
|
236
|
-
}));
|
|
255
|
+
return Promise.resolve(this.getCheckpointsInEpoch(epochNumber));
|
|
256
|
+
}
|
|
257
|
+
getCheckpointsDataForEpoch(epochNumber) {
|
|
258
|
+
const checkpoints = this.getCheckpointsInEpoch(epochNumber);
|
|
259
|
+
return Promise.resolve(checkpoints.map((checkpoint)=>({
|
|
260
|
+
checkpointNumber: checkpoint.number,
|
|
261
|
+
header: checkpoint.header,
|
|
262
|
+
archive: checkpoint.archive,
|
|
263
|
+
checkpointOutHash: computeCheckpointOutHash(checkpoint.blocks.map((b)=>b.body.txEffects.map((tx)=>tx.l2ToL1Msgs))),
|
|
264
|
+
startBlock: checkpoint.blocks[0].number,
|
|
265
|
+
blockCount: checkpoint.blocks.length,
|
|
266
|
+
attestations: [],
|
|
267
|
+
l1: this.mockL1DataForCheckpoint(checkpoint)
|
|
268
|
+
})));
|
|
237
269
|
}
|
|
238
|
-
|
|
239
|
-
const
|
|
240
|
-
|
|
241
|
-
epochDuration
|
|
242
|
-
});
|
|
243
|
-
const blocks = this.l2Blocks.filter((b)=>{
|
|
244
|
-
const slot = b.header.globalVariables.slotNumber;
|
|
245
|
-
return slot >= start && slot <= end;
|
|
246
|
-
});
|
|
247
|
-
return Promise.resolve(blocks);
|
|
270
|
+
getCheckpointedBlocksForEpoch(epochNumber) {
|
|
271
|
+
const checkpoints = this.getCheckpointsInEpoch(epochNumber);
|
|
272
|
+
return Promise.resolve(checkpoints.flatMap((checkpoint)=>checkpoint.blocks.map((block)=>this.toCheckpointedBlock(block))));
|
|
248
273
|
}
|
|
249
274
|
getBlocksForSlot(slotNumber) {
|
|
250
275
|
const blocks = this.l2Blocks.filter((b)=>b.header.globalVariables.slotNumber === slotNumber);
|
|
251
276
|
return Promise.resolve(blocks);
|
|
252
277
|
}
|
|
253
|
-
async
|
|
254
|
-
const
|
|
255
|
-
return
|
|
278
|
+
async getCheckpointedBlockHeadersForEpoch(epochNumber) {
|
|
279
|
+
const checkpointedBlocks = await this.getCheckpointedBlocksForEpoch(epochNumber);
|
|
280
|
+
return checkpointedBlocks.map((b)=>b.block.header);
|
|
256
281
|
}
|
|
257
282
|
/**
|
|
258
283
|
* Gets a tx effect.
|
|
@@ -270,7 +295,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
270
295
|
return {
|
|
271
296
|
data: txEffect,
|
|
272
297
|
l2BlockNumber: block.number,
|
|
273
|
-
l2BlockHash:
|
|
298
|
+
l2BlockHash: await block.hash(),
|
|
274
299
|
txIndexInBlock: block.body.txEffects.indexOf(txEffect)
|
|
275
300
|
};
|
|
276
301
|
}
|
|
@@ -282,7 +307,8 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
282
307
|
for (const block of this.l2Blocks){
|
|
283
308
|
for (const txEffect of block.body.txEffects){
|
|
284
309
|
if (txEffect.txHash.equals(txHash)) {
|
|
285
|
-
|
|
310
|
+
// In mock, assume all txs are checkpointed with successful execution
|
|
311
|
+
return new TxReceipt(txHash, TxStatus.CHECKPOINTED, TxExecutionResult.SUCCESS, undefined, txEffect.transactionFee.toBigInt(), await block.hash(), block.number, getEpochAtSlot(block.slot, EmptyL1RollupConstants));
|
|
286
312
|
}
|
|
287
313
|
}
|
|
288
314
|
}
|
|
@@ -318,7 +344,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
318
344
|
const makeTipId = (blockId)=>({
|
|
319
345
|
block: blockId,
|
|
320
346
|
checkpoint: {
|
|
321
|
-
number:
|
|
347
|
+
number: this.findCheckpointNumberForBlock(blockId.number) ?? CheckpointNumber(0),
|
|
322
348
|
hash: blockId.hash
|
|
323
349
|
}
|
|
324
350
|
});
|
|
@@ -329,10 +355,10 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
329
355
|
finalized: makeTipId(finalizedBlockId)
|
|
330
356
|
};
|
|
331
357
|
}
|
|
332
|
-
|
|
358
|
+
getSyncedL2EpochNumber() {
|
|
333
359
|
throw new Error('Method not implemented.');
|
|
334
360
|
}
|
|
335
|
-
|
|
361
|
+
getSyncedL2SlotNumber() {
|
|
336
362
|
throw new Error('Method not implemented.');
|
|
337
363
|
}
|
|
338
364
|
isEpochComplete(_epochNumber) {
|
|
@@ -392,4 +418,23 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
392
418
|
valid: true
|
|
393
419
|
});
|
|
394
420
|
}
|
|
421
|
+
/** Returns checkpoints whose slot falls within the given epoch. */ getCheckpointsInEpoch(epochNumber) {
|
|
422
|
+
const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
|
|
423
|
+
const [start, end] = getSlotRangeForEpoch(epochNumber, {
|
|
424
|
+
epochDuration
|
|
425
|
+
});
|
|
426
|
+
return this.checkpointList.filter((c)=>c.header.slotNumber >= start && c.header.slotNumber <= end);
|
|
427
|
+
}
|
|
428
|
+
/** Creates a mock L1PublishedData for a checkpoint. */ mockL1DataForCheckpoint(checkpoint) {
|
|
429
|
+
return new L1PublishedData(BigInt(checkpoint.number), BigInt(checkpoint.number), Buffer32.random().toString());
|
|
430
|
+
}
|
|
431
|
+
/** Creates a CheckpointedL2Block from a block using stored checkpoint info. */ toCheckpointedBlock(block) {
|
|
432
|
+
const checkpoint = this.checkpointList.find((c)=>c.blocks.some((b)=>b.number === block.number));
|
|
433
|
+
const checkpointNumber = checkpoint?.number ?? block.checkpointNumber;
|
|
434
|
+
return new CheckpointedL2Block(checkpointNumber, block, new L1PublishedData(BigInt(block.number), BigInt(block.number), `0x${block.number.toString(16).padStart(64, '0')}`), []);
|
|
435
|
+
}
|
|
436
|
+
/** Finds the checkpoint number for a block, or undefined if the block is not in any checkpoint. */ findCheckpointNumberForBlock(blockNumber) {
|
|
437
|
+
const checkpoint = this.checkpointList.find((c)=>c.blocks.some((b)=>b.number === blockNumber));
|
|
438
|
+
return checkpoint?.number;
|
|
439
|
+
}
|
|
395
440
|
}
|
|
@@ -3,15 +3,17 @@ import { Buffer16 } from '@aztec/foundation/buffer';
|
|
|
3
3
|
import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
4
4
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
5
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
6
|
+
import { L2Block } from '@aztec/stdlib/block';
|
|
6
7
|
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
7
8
|
import { PrivateLog, PublicLog, SiloedTag, Tag } from '@aztec/stdlib/logs';
|
|
8
9
|
import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
9
10
|
import { StateReference } from '@aztec/stdlib/tx';
|
|
10
11
|
import { type InboxMessage } from '../structs/inbox_message.js';
|
|
11
12
|
export declare function makeInboxMessage(previousRollingHash?: Buffer16, overrides?: Partial<InboxMessage>): InboxMessage;
|
|
12
|
-
export declare function makeInboxMessages(
|
|
13
|
+
export declare function makeInboxMessages(totalCount: number, opts?: {
|
|
13
14
|
initialHash?: Buffer16;
|
|
14
15
|
initialCheckpointNumber?: CheckpointNumber;
|
|
16
|
+
messagesPerCheckpoint?: number;
|
|
15
17
|
overrideFn?: (msg: InboxMessage, index: number) => InboxMessage;
|
|
16
18
|
}): InboxMessage[];
|
|
17
19
|
/** Creates inbox messages distributed across multiple blocks with proper checkpoint numbering. */
|
|
@@ -27,6 +29,8 @@ export declare function makeBlockHash(blockNumber: number): `0x${string}`;
|
|
|
27
29
|
export declare function makeStateForBlock(blockNumber: number, txsPerBlock: number): StateReference;
|
|
28
30
|
/** Creates L1PublishedData with deterministic values based on l1BlockNumber. */
|
|
29
31
|
export declare function makeL1PublishedData(l1BlockNumber: number): L1PublishedData;
|
|
32
|
+
/** Creates a Checkpoint from a list of blocks with a header that matches the blocks' structure. */
|
|
33
|
+
export declare function makeCheckpoint(blocks: L2Block[], checkpointNumber?: CheckpointNumber): Checkpoint;
|
|
30
34
|
/** Wraps a Checkpoint with L1 published data and random attestations. */
|
|
31
35
|
export declare function makePublishedCheckpoint(checkpoint: Checkpoint, l1BlockNumber: number, attestationCount?: number): PublishedCheckpoint;
|
|
32
36
|
export interface MakeChainedCheckpointsOptions {
|
|
@@ -81,4 +85,4 @@ export interface MockCheckpointWithLogsOptions {
|
|
|
81
85
|
}
|
|
82
86
|
/** Creates a checkpoint with specified logs on each tx effect. */
|
|
83
87
|
export declare function makeCheckpointWithLogs(blockNumber: number, options?: MockCheckpointWithLogsOptions): Promise<PublishedCheckpoint>;
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19zdHJ1Y3RzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9tb2NrX3N0cnVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUFlLGdCQUFnQixFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxRQUFRLEVBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUc5RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVqRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBd0IsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFLM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUF5QixjQUFjLEVBQVksTUFBTSxrQkFBa0IsQ0FBQztBQUVuRixPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQXFCLE1BQU0sNkJBQTZCLENBQUM7QUFFbkYsd0JBQWdCLGdCQUFnQixDQUM5QixtQkFBbUIsV0FBZ0IsRUFDbkMsU0FBUyxHQUFFLE9BQU8sQ0FBQyxZQUFZLENBQU0sR0FDcEMsWUFBWSxDQWdCZDtBQUVELHdCQUFnQixpQkFBaUIsQ0FDL0IsVUFBVSxFQUFFLE1BQU0sRUFDbEIsSUFBSSxHQUFFO0lBQ0osV0FBVyxDQUFDLEVBQUUsUUFBUSxDQUFDO0lBQ3ZCLHVCQUF1QixDQUFDLEVBQUUsZ0JBQWdCLENBQUM7SUFDM0MscUJBQXFCLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDL0IsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEtBQUssWUFBWSxDQUFDO0NBQzVELEdBQ0wsWUFBWSxFQUFFLENBNEJoQjtBQUVELGtHQUFrRztBQUNsRyx3QkFBZ0IsK0JBQStCLENBQzdDLFVBQVUsRUFBRSxNQUFNLEVBQ2xCLElBQUksR0FBRTtJQUFFLHVCQUF1QixDQUFDLEVBQUUsZ0JBQWdCLENBQUE7Q0FBTyxHQUN4RCxZQUFZLEVBQUUsQ0FZaEI7QUFFRCw4REFBOEQ7QUFDOUQsd0JBQWdCLGFBQWEsQ0FBQyxXQUFXLEVBQUUsTUFBTSxHQUFHLEtBQUssTUFBTSxFQUFFLENBRWhFO0FBRUQ7OztHQUdHO0FBQ0gsd0JBQWdCLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sR0FBRyxjQUFjLENBVTFGO0FBRUQsZ0ZBQWdGO0FBQ2hGLHdCQUFnQixtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsTUFBTSxHQUFHLGVBQWUsQ0FFMUU7QUFFRCxtR0FBbUc7QUFDbkcsd0JBQWdCLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsZ0JBQWdCLG1CQUFzQixHQUFHLFVBQVUsQ0FnQnBHO0FBRUQseUVBQXlFO0FBQ3pFLHdCQUFnQix1QkFBdUIsQ0FDckMsVUFBVSxFQUFFLFVBQVUsRUFDdEIsYUFBYSxFQUFFLE1BQU0sRUFDckIsZ0JBQWdCLFNBQUksR0FDbkIsbUJBQW1CLENBTXJCO0FBRUQsTUFBTSxXQUFXLDZCQUE2QjtJQUM1QyxxREFBcUQ7SUFDckQsbUJBQW1CLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDN0IsbURBQW1EO0lBQ25ELFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNyQiwrREFBK0Q7SUFDL0QscUJBQXFCLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQztJQUN6Qyx3Q0FBd0M7SUFDeEMsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDMUIsNENBQTRDO0lBQzVDLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQzVCLHlEQUF5RDtJQUN6RCxlQUFlLENBQUMsRUFBRSxzQkFBc0IsQ0FBQztJQUN6Qyw0REFBNEQ7SUFDNUQscUJBQXFCLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsS0FBSyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDMUc7QUFFRDs7OztHQUlHO0FBQ0gsd0JBQXNCLHNCQUFzQixDQUMxQyxLQUFLLEVBQUUsTUFBTSxFQUNiLE9BQU8sR0FBRSw2QkFBa0MsR0FDMUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FpQ2hDO0FBRUQ7OztHQUdHO0FBQ0gsd0JBQWdCLDZCQUE2QixDQUMzQyxVQUFVLEVBQUUsVUFBVSxFQUN0QixPQUFPLEVBQUUsZUFBZSxFQUFFLEVBQzFCLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFDdkIsYUFBYSxTQUFJLEdBQ2hCLG1CQUFtQixDQUlyQjtBQUVELGlFQUFpRTtBQUNqRSx3QkFBZ0IsaUJBQWlCLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEdBQUcsU0FBUyxDQU1uRztBQUVELDZEQUE2RDtBQUM3RCx3QkFBZ0IsY0FBYyxDQUFDLEdBQUcsRUFBRSxTQUFTLEdBQUcsVUFBVSxDQUt6RDtBQUVELHVEQUF1RDtBQUN2RCx3QkFBZ0IsZUFBZSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxHQUFHLFVBQVUsRUFBRSxDQUt4RztBQUVELDBEQUEwRDtBQUMxRCx3QkFBZ0IsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEdBQUcsR0FBRyxDQU01RjtBQUVELDREQUE0RDtBQUM1RCx3QkFBZ0IsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsZUFBZSxHQUFFLFlBQThDLEdBQUcsU0FBUyxDQUtsSDtBQUVELHNEQUFzRDtBQUN0RCx3QkFBZ0IsY0FBYyxDQUM1QixXQUFXLEVBQUUsTUFBTSxFQUNuQixPQUFPLEVBQUUsTUFBTSxFQUNmLFlBQVksRUFBRSxNQUFNLEVBQ3BCLGVBQWUsR0FBRSxZQUE4QyxHQUM5RCxTQUFTLEVBQUUsQ0FLYjtBQUVELE1BQU0sV0FBVyw2QkFBNkI7SUFDNUMsZUFBZSxDQUFDLEVBQUUsc0JBQXNCLENBQUM7SUFDekMsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3hCLFdBQVcsQ0FBQyxFQUFFO1FBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBQUM7SUFDdkMsVUFBVSxDQUFDLEVBQUU7UUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDO1FBQUMsZUFBZSxDQUFDLEVBQUUsWUFBWSxDQUFBO0tBQUUsQ0FBQztDQUN2RTtBQUVELGtFQUFrRTtBQUNsRSx3QkFBc0Isc0JBQXNCLENBQzFDLFdBQVcsRUFBRSxNQUFNLEVBQ25CLE9BQU8sR0FBRSw2QkFBa0MsR0FDMUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBc0I5QiJ9
|