@aztec/archiver 0.0.1-commit.d431d1c → 0.0.1-commit.d939eb5aa
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 +21 -6
- package/dest/archiver.d.ts +17 -12
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +108 -127
- package/dest/config.d.ts +3 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +3 -2
- package/dest/errors.d.ts +39 -10
- package/dest/errors.d.ts.map +1 -1
- package/dest/errors.js +52 -15
- package/dest/factory.d.ts +4 -2
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +29 -23
- 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 +191 -259
- package/dest/l1/data_retrieval.d.ts +11 -11
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/l1/data_retrieval.js +38 -37
- 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 +29 -23
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +55 -124
- package/dest/modules/data_store_updater.d.ts +43 -26
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +158 -129
- package/dest/modules/instrumentation.d.ts +19 -4
- package/dest/modules/instrumentation.d.ts.map +1 -1
- package/dest/modules/instrumentation.js +53 -18
- package/dest/modules/l1_synchronizer.d.ts +7 -9
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +186 -145
- package/dest/modules/validation.d.ts +1 -1
- package/dest/modules/validation.d.ts.map +1 -1
- package/dest/modules/validation.js +2 -2
- package/dest/store/block_store.d.ts +86 -34
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +414 -152
- package/dest/store/contract_class_store.d.ts +2 -3
- package/dest/store/contract_class_store.d.ts.map +1 -1
- package/dest/store/contract_class_store.js +16 -72
- package/dest/store/contract_instance_store.d.ts +1 -1
- package/dest/store/contract_instance_store.d.ts.map +1 -1
- package/dest/store/contract_instance_store.js +6 -2
- package/dest/store/kv_archiver_store.d.ts +80 -39
- package/dest/store/kv_archiver_store.d.ts.map +1 -1
- package/dest/store/kv_archiver_store.js +86 -35
- package/dest/store/l2_tips_cache.d.ts +20 -0
- package/dest/store/l2_tips_cache.d.ts.map +1 -0
- package/dest/store/l2_tips_cache.js +109 -0
- package/dest/store/log_store.d.ts +9 -6
- package/dest/store/log_store.d.ts.map +1 -1
- package/dest/store/log_store.js +151 -56
- package/dest/store/message_store.d.ts +5 -1
- package/dest/store/message_store.d.ts.map +1 -1
- package/dest/store/message_store.js +21 -9
- package/dest/test/fake_l1_state.d.ts +24 -4
- package/dest/test/fake_l1_state.d.ts.map +1 -1
- package/dest/test/fake_l1_state.js +133 -26
- 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_l1_to_l2_message_source.d.ts +1 -1
- package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
- package/dest/test/mock_l1_to_l2_message_source.js +2 -1
- package/dest/test/mock_l2_block_source.d.ts +44 -23
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +185 -115
- 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 +71 -0
- package/package.json +14 -13
- package/src/archiver.ts +144 -159
- package/src/config.ts +9 -2
- package/src/errors.ts +82 -26
- package/src/factory.ts +46 -22
- 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 +250 -379
- package/src/l1/data_retrieval.ts +35 -41
- package/src/l1/spire_proposer.ts +7 -15
- package/src/l1/validate_trace.ts +24 -6
- package/src/modules/data_source_base.ts +98 -169
- package/src/modules/data_store_updater.ts +178 -160
- package/src/modules/instrumentation.ts +64 -20
- package/src/modules/l1_synchronizer.ts +212 -182
- package/src/modules/validation.ts +2 -2
- package/src/store/block_store.ts +533 -207
- package/src/store/contract_class_store.ts +16 -110
- package/src/store/contract_instance_store.ts +8 -5
- package/src/store/kv_archiver_store.ts +141 -59
- package/src/store/l2_tips_cache.ts +134 -0
- package/src/store/log_store.ts +232 -74
- package/src/store/message_store.ts +27 -10
- package/src/structs/inbox_message.ts +1 -1
- package/src/test/fake_l1_state.ts +180 -32
- package/src/test/index.ts +3 -0
- package/src/test/mock_archiver.ts +3 -2
- package/src/test/mock_l1_to_l2_message_source.ts +1 -0
- package/src/test/mock_l2_block_source.ts +247 -130
- package/src/test/mock_structs.ts +45 -15
- package/src/test/noop_l1_archiver.ts +114 -0
|
@@ -5,34 +5,61 @@ 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;
|
|
22
|
+
proposedCheckpointBlockNumber = 0;
|
|
19
23
|
log = createLogger('archiver:mock_l2_block_source');
|
|
20
|
-
async createBlocks(numBlocks) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
/** Creates blocks grouped into single-block checkpoints. */ async createBlocks(numBlocks) {
|
|
25
|
+
await this.createCheckpoints(numBlocks, 1);
|
|
26
|
+
}
|
|
27
|
+
getCheckpointNumber() {
|
|
28
|
+
return Promise.resolve(this.checkpointList.length === 0 ? CheckpointNumber.ZERO : CheckpointNumber(this.checkpointList.length));
|
|
29
|
+
}
|
|
30
|
+
/** Creates checkpoints, each containing `blocksPerCheckpoint` blocks. */ async createCheckpoints(numCheckpoints, blocksPerCheckpoint = 1) {
|
|
31
|
+
for(let c = 0; c < numCheckpoints; c++){
|
|
32
|
+
const checkpointNum = CheckpointNumber(this.checkpointList.length + 1);
|
|
33
|
+
const startBlockNum = this.l2Blocks.length + 1;
|
|
34
|
+
const slotNumber = SlotNumber(Number(checkpointNum));
|
|
35
|
+
const checkpoint = await Checkpoint.random(checkpointNum, {
|
|
36
|
+
numBlocks: blocksPerCheckpoint,
|
|
37
|
+
startBlockNumber: startBlockNum,
|
|
38
|
+
slotNumber,
|
|
39
|
+
checkpointNumber: checkpointNum
|
|
25
40
|
});
|
|
26
|
-
this.
|
|
41
|
+
this.checkpointList.push(checkpoint);
|
|
42
|
+
this.l2Blocks.push(...checkpoint.blocks);
|
|
27
43
|
}
|
|
28
|
-
this.log.verbose(`Created ${
|
|
44
|
+
this.log.verbose(`Created ${numCheckpoints} checkpoints with ${blocksPerCheckpoint} blocks each in the mock L2 block source`);
|
|
29
45
|
}
|
|
30
|
-
|
|
46
|
+
addProposedBlocks(blocks) {
|
|
31
47
|
this.l2Blocks.push(...blocks);
|
|
32
|
-
this.log.verbose(`Added ${blocks.length} blocks to the mock L2 block source`);
|
|
48
|
+
this.log.verbose(`Added ${blocks.length} proposed blocks to the mock L2 block source`);
|
|
33
49
|
}
|
|
34
50
|
removeBlocks(numBlocks) {
|
|
35
51
|
this.l2Blocks = this.l2Blocks.slice(0, -numBlocks);
|
|
52
|
+
const maxBlockNum = this.l2Blocks.length;
|
|
53
|
+
// Remove any checkpoint whose last block is beyond the remaining blocks.
|
|
54
|
+
this.checkpointList = this.checkpointList.filter((c)=>{
|
|
55
|
+
const lastBlockNum = c.blocks[0].number + c.blocks.length - 1;
|
|
56
|
+
return lastBlockNum <= maxBlockNum;
|
|
57
|
+
});
|
|
58
|
+
// Keep tip numbers consistent with remaining blocks.
|
|
59
|
+
this.checkpointedBlockNumber = Math.min(this.checkpointedBlockNumber, maxBlockNum);
|
|
60
|
+
this.proposedCheckpointBlockNumber = Math.min(this.proposedCheckpointBlockNumber, maxBlockNum);
|
|
61
|
+
this.provenBlockNumber = Math.min(this.provenBlockNumber, maxBlockNum);
|
|
62
|
+
this.finalizedBlockNumber = Math.min(this.finalizedBlockNumber, maxBlockNum);
|
|
36
63
|
this.log.verbose(`Removed ${numBlocks} blocks from the mock L2 block source`);
|
|
37
64
|
}
|
|
38
65
|
setProvenBlockNumber(provenBlockNumber) {
|
|
@@ -44,8 +71,40 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
44
71
|
}
|
|
45
72
|
this.finalizedBlockNumber = finalizedBlockNumber;
|
|
46
73
|
}
|
|
74
|
+
setProposedCheckpointBlockNumber(blockNumber) {
|
|
75
|
+
this.proposedCheckpointBlockNumber = blockNumber;
|
|
76
|
+
}
|
|
47
77
|
setCheckpointedBlockNumber(checkpointedBlockNumber) {
|
|
78
|
+
const prevCheckpointed = this.checkpointedBlockNumber;
|
|
48
79
|
this.checkpointedBlockNumber = checkpointedBlockNumber;
|
|
80
|
+
// Proposed checkpoint is always at least as advanced as checkpointed
|
|
81
|
+
if (this.proposedCheckpointBlockNumber < checkpointedBlockNumber) {
|
|
82
|
+
this.proposedCheckpointBlockNumber = checkpointedBlockNumber;
|
|
83
|
+
}
|
|
84
|
+
// Auto-create single-block checkpoints for newly checkpointed blocks that don't have one yet.
|
|
85
|
+
// This handles blocks added via addProposedBlocks that are now being marked as checkpointed.
|
|
86
|
+
const newCheckpoints = [];
|
|
87
|
+
for(let blockNum = prevCheckpointed + 1; blockNum <= checkpointedBlockNumber; blockNum++){
|
|
88
|
+
const block = this.l2Blocks[blockNum - 1];
|
|
89
|
+
if (!block) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (this.checkpointList.some((c)=>c.blocks.some((b)=>b.number === block.number))) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const checkpointNum = CheckpointNumber(this.checkpointList.length + newCheckpoints.length + 1);
|
|
96
|
+
const checkpoint = new Checkpoint(block.archive, CheckpointHeader.random({
|
|
97
|
+
slotNumber: block.header.globalVariables.slotNumber
|
|
98
|
+
}), [
|
|
99
|
+
block
|
|
100
|
+
], checkpointNum);
|
|
101
|
+
newCheckpoints.push(checkpoint);
|
|
102
|
+
}
|
|
103
|
+
// Insert new checkpoints in order by number.
|
|
104
|
+
if (newCheckpoints.length > 0) {
|
|
105
|
+
this.checkpointList.push(...newCheckpoints);
|
|
106
|
+
this.checkpointList.sort((a, b)=>a.number - b.number);
|
|
107
|
+
}
|
|
49
108
|
}
|
|
50
109
|
/**
|
|
51
110
|
* Method to fetch the rollup contract address at the base-layer.
|
|
@@ -68,6 +127,15 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
68
127
|
getProvenBlockNumber() {
|
|
69
128
|
return Promise.resolve(BlockNumber(this.provenBlockNumber));
|
|
70
129
|
}
|
|
130
|
+
getCheckpointedL2BlockNumber() {
|
|
131
|
+
return Promise.resolve(BlockNumber(this.checkpointedBlockNumber));
|
|
132
|
+
}
|
|
133
|
+
getFinalizedL2BlockNumber() {
|
|
134
|
+
return Promise.resolve(BlockNumber(this.finalizedBlockNumber));
|
|
135
|
+
}
|
|
136
|
+
getProposedCheckpointL2BlockNumber() {
|
|
137
|
+
return Promise.resolve(BlockNumber(this.proposedCheckpointBlockNumber));
|
|
138
|
+
}
|
|
71
139
|
getCheckpointedBlock(number) {
|
|
72
140
|
if (number > this.checkpointedBlockNumber) {
|
|
73
141
|
return Promise.resolve(undefined);
|
|
@@ -76,10 +144,9 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
76
144
|
if (!block) {
|
|
77
145
|
return Promise.resolve(undefined);
|
|
78
146
|
}
|
|
79
|
-
|
|
80
|
-
return Promise.resolve(checkpointedBlock);
|
|
147
|
+
return Promise.resolve(this.toCheckpointedBlock(block));
|
|
81
148
|
}
|
|
82
|
-
async getCheckpointedBlocks(from, limit
|
|
149
|
+
async getCheckpointedBlocks(from, limit) {
|
|
83
150
|
const result = [];
|
|
84
151
|
for(let i = 0; i < limit; i++){
|
|
85
152
|
const blockNum = from + i;
|
|
@@ -105,7 +172,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
105
172
|
* Gets an L2 block (new format).
|
|
106
173
|
* @param number - The block number to return.
|
|
107
174
|
* @returns The requested L2 block.
|
|
108
|
-
*/
|
|
175
|
+
*/ getL2Block(number) {
|
|
109
176
|
const block = this.l2Blocks[number - 1];
|
|
110
177
|
return Promise.resolve(block);
|
|
111
178
|
}
|
|
@@ -114,78 +181,34 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
114
181
|
* @param from - Number of the first block to return (inclusive).
|
|
115
182
|
* @param limit - The maximum number of blocks to return.
|
|
116
183
|
* @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
|
-
}));
|
|
184
|
+
*/ getBlocks(from, limit) {
|
|
185
|
+
return Promise.resolve(this.l2Blocks.slice(from - 1, from - 1 + limit));
|
|
133
186
|
}
|
|
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
|
-
})));
|
|
187
|
+
getCheckpoints(from, limit) {
|
|
188
|
+
const checkpoints = this.checkpointList.slice(from - 1, from - 1 + limit);
|
|
189
|
+
return Promise.resolve(checkpoints.map((checkpoint)=>new PublishedCheckpoint(checkpoint, this.mockL1DataForCheckpoint(checkpoint), [])));
|
|
157
190
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
return
|
|
191
|
+
getCheckpointByArchive(archive) {
|
|
192
|
+
const checkpoint = this.checkpointList.find((c)=>c.archive.root.equals(archive));
|
|
193
|
+
return Promise.resolve(checkpoint);
|
|
161
194
|
}
|
|
162
|
-
async
|
|
195
|
+
async getCheckpointedBlockByHash(blockHash) {
|
|
163
196
|
for (const block of this.l2Blocks){
|
|
164
197
|
const hash = await block.hash();
|
|
165
198
|
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
|
-
});
|
|
199
|
+
return this.toCheckpointedBlock(block);
|
|
172
200
|
}
|
|
173
201
|
}
|
|
174
202
|
return undefined;
|
|
175
203
|
}
|
|
176
|
-
|
|
204
|
+
getCheckpointedBlockByArchive(archive) {
|
|
177
205
|
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
178
206
|
if (!block) {
|
|
179
207
|
return Promise.resolve(undefined);
|
|
180
208
|
}
|
|
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) {
|
|
209
|
+
return Promise.resolve(this.toCheckpointedBlock(block));
|
|
210
|
+
}
|
|
211
|
+
async getL2BlockByHash(blockHash) {
|
|
189
212
|
for (const block of this.l2Blocks){
|
|
190
213
|
const hash = await block.hash();
|
|
191
214
|
if (hash.equals(blockHash)) {
|
|
@@ -194,7 +217,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
194
217
|
}
|
|
195
218
|
return undefined;
|
|
196
219
|
}
|
|
197
|
-
|
|
220
|
+
getL2BlockByArchive(archive) {
|
|
198
221
|
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
199
222
|
return Promise.resolve(block);
|
|
200
223
|
}
|
|
@@ -211,48 +234,62 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
211
234
|
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
212
235
|
return Promise.resolve(block?.header);
|
|
213
236
|
}
|
|
237
|
+
async getBlockData(number) {
|
|
238
|
+
const block = this.l2Blocks[number - 1];
|
|
239
|
+
if (!block) {
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
header: block.header,
|
|
244
|
+
archive: block.archive,
|
|
245
|
+
blockHash: await block.hash(),
|
|
246
|
+
checkpointNumber: block.checkpointNumber,
|
|
247
|
+
indexWithinCheckpoint: block.indexWithinCheckpoint
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
async getBlockDataByArchive(archive) {
|
|
251
|
+
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
252
|
+
if (!block) {
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
header: block.header,
|
|
257
|
+
archive: block.archive,
|
|
258
|
+
blockHash: await block.hash(),
|
|
259
|
+
checkpointNumber: block.checkpointNumber,
|
|
260
|
+
indexWithinCheckpoint: block.indexWithinCheckpoint
|
|
261
|
+
};
|
|
262
|
+
}
|
|
214
263
|
getBlockHeader(number) {
|
|
215
264
|
return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.header);
|
|
216
265
|
}
|
|
217
266
|
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
|
-
}));
|
|
267
|
+
return Promise.resolve(this.getCheckpointsInEpoch(epochNumber));
|
|
268
|
+
}
|
|
269
|
+
getCheckpointsDataForEpoch(epochNumber) {
|
|
270
|
+
const checkpoints = this.getCheckpointsInEpoch(epochNumber);
|
|
271
|
+
return Promise.resolve(checkpoints.map((checkpoint)=>({
|
|
272
|
+
checkpointNumber: checkpoint.number,
|
|
273
|
+
header: checkpoint.header,
|
|
274
|
+
archive: checkpoint.archive,
|
|
275
|
+
checkpointOutHash: computeCheckpointOutHash(checkpoint.blocks.map((b)=>b.body.txEffects.map((tx)=>tx.l2ToL1Msgs))),
|
|
276
|
+
startBlock: checkpoint.blocks[0].number,
|
|
277
|
+
blockCount: checkpoint.blocks.length,
|
|
278
|
+
attestations: [],
|
|
279
|
+
l1: this.mockL1DataForCheckpoint(checkpoint)
|
|
280
|
+
})));
|
|
237
281
|
}
|
|
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);
|
|
282
|
+
getCheckpointedBlocksForEpoch(epochNumber) {
|
|
283
|
+
const checkpoints = this.getCheckpointsInEpoch(epochNumber);
|
|
284
|
+
return Promise.resolve(checkpoints.flatMap((checkpoint)=>checkpoint.blocks.map((block)=>this.toCheckpointedBlock(block))));
|
|
248
285
|
}
|
|
249
286
|
getBlocksForSlot(slotNumber) {
|
|
250
287
|
const blocks = this.l2Blocks.filter((b)=>b.header.globalVariables.slotNumber === slotNumber);
|
|
251
288
|
return Promise.resolve(blocks);
|
|
252
289
|
}
|
|
253
|
-
async
|
|
254
|
-
const
|
|
255
|
-
return
|
|
290
|
+
async getCheckpointedBlockHeadersForEpoch(epochNumber) {
|
|
291
|
+
const checkpointedBlocks = await this.getCheckpointedBlocksForEpoch(epochNumber);
|
|
292
|
+
return checkpointedBlocks.map((b)=>b.block.header);
|
|
256
293
|
}
|
|
257
294
|
/**
|
|
258
295
|
* Gets a tx effect.
|
|
@@ -270,7 +307,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
270
307
|
return {
|
|
271
308
|
data: txEffect,
|
|
272
309
|
l2BlockNumber: block.number,
|
|
273
|
-
l2BlockHash:
|
|
310
|
+
l2BlockHash: await block.hash(),
|
|
274
311
|
txIndexInBlock: block.body.txEffects.indexOf(txEffect)
|
|
275
312
|
};
|
|
276
313
|
}
|
|
@@ -282,23 +319,26 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
282
319
|
for (const block of this.l2Blocks){
|
|
283
320
|
for (const txEffect of block.body.txEffects){
|
|
284
321
|
if (txEffect.txHash.equals(txHash)) {
|
|
285
|
-
|
|
322
|
+
// In mock, assume all txs are checkpointed with successful execution
|
|
323
|
+
return new TxReceipt(txHash, TxStatus.CHECKPOINTED, TxExecutionResult.SUCCESS, undefined, txEffect.transactionFee.toBigInt(), await block.hash(), block.number, getEpochAtSlot(block.slot, EmptyL1RollupConstants));
|
|
286
324
|
}
|
|
287
325
|
}
|
|
288
326
|
}
|
|
289
327
|
return undefined;
|
|
290
328
|
}
|
|
291
329
|
async getL2Tips() {
|
|
292
|
-
const [latest, proven, finalized, checkpointed] = [
|
|
330
|
+
const [latest, proven, finalized, checkpointed, proposedCheckpoint] = [
|
|
293
331
|
await this.getBlockNumber(),
|
|
294
332
|
await this.getProvenBlockNumber(),
|
|
295
333
|
this.finalizedBlockNumber,
|
|
296
|
-
this.checkpointedBlockNumber
|
|
334
|
+
this.checkpointedBlockNumber,
|
|
335
|
+
await this.getProposedCheckpointL2BlockNumber()
|
|
297
336
|
];
|
|
298
337
|
const latestBlock = this.l2Blocks[latest - 1];
|
|
299
338
|
const provenBlock = this.l2Blocks[proven - 1];
|
|
300
339
|
const finalizedBlock = this.l2Blocks[finalized - 1];
|
|
301
340
|
const checkpointedBlock = this.l2Blocks[checkpointed - 1];
|
|
341
|
+
const proposedCheckpointBlock = this.l2Blocks[proposedCheckpoint - 1];
|
|
302
342
|
const latestBlockId = {
|
|
303
343
|
number: BlockNumber(latest),
|
|
304
344
|
hash: (await latestBlock?.hash())?.toString()
|
|
@@ -315,10 +355,14 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
315
355
|
number: BlockNumber(checkpointed),
|
|
316
356
|
hash: (await checkpointedBlock?.hash())?.toString()
|
|
317
357
|
};
|
|
358
|
+
const proposedCheckpointBlockId = {
|
|
359
|
+
number: BlockNumber(proposedCheckpoint),
|
|
360
|
+
hash: (await proposedCheckpointBlock?.hash())?.toString()
|
|
361
|
+
};
|
|
318
362
|
const makeTipId = (blockId)=>({
|
|
319
363
|
block: blockId,
|
|
320
364
|
checkpoint: {
|
|
321
|
-
number:
|
|
365
|
+
number: this.findCheckpointNumberForBlock(blockId.number) ?? CheckpointNumber(0),
|
|
322
366
|
hash: blockId.hash
|
|
323
367
|
}
|
|
324
368
|
});
|
|
@@ -326,13 +370,14 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
326
370
|
proposed: latestBlockId,
|
|
327
371
|
checkpointed: makeTipId(checkpointedBlockId),
|
|
328
372
|
proven: makeTipId(provenBlockId),
|
|
329
|
-
finalized: makeTipId(finalizedBlockId)
|
|
373
|
+
finalized: makeTipId(finalizedBlockId),
|
|
374
|
+
proposedCheckpoint: makeTipId(proposedCheckpointBlockId)
|
|
330
375
|
};
|
|
331
376
|
}
|
|
332
|
-
|
|
377
|
+
getSyncedL2EpochNumber() {
|
|
333
378
|
throw new Error('Method not implemented.');
|
|
334
379
|
}
|
|
335
|
-
|
|
380
|
+
getSyncedL2SlotNumber() {
|
|
336
381
|
throw new Error('Method not implemented.');
|
|
337
382
|
}
|
|
338
383
|
isEpochComplete(_epochNumber) {
|
|
@@ -392,4 +437,29 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
392
437
|
valid: true
|
|
393
438
|
});
|
|
394
439
|
}
|
|
440
|
+
getProposedCheckpoint() {
|
|
441
|
+
return Promise.resolve(undefined);
|
|
442
|
+
}
|
|
443
|
+
getProposedCheckpointOnly() {
|
|
444
|
+
return Promise.resolve(undefined);
|
|
445
|
+
}
|
|
446
|
+
/** Returns checkpoints whose slot falls within the given epoch. */ getCheckpointsInEpoch(epochNumber) {
|
|
447
|
+
const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
|
|
448
|
+
const [start, end] = getSlotRangeForEpoch(epochNumber, {
|
|
449
|
+
epochDuration
|
|
450
|
+
});
|
|
451
|
+
return this.checkpointList.filter((c)=>c.header.slotNumber >= start && c.header.slotNumber <= end);
|
|
452
|
+
}
|
|
453
|
+
/** Creates a mock L1PublishedData for a checkpoint. */ mockL1DataForCheckpoint(checkpoint) {
|
|
454
|
+
return new L1PublishedData(BigInt(checkpoint.number), BigInt(checkpoint.number), Buffer32.random().toString());
|
|
455
|
+
}
|
|
456
|
+
/** Creates a CheckpointedL2Block from a block using stored checkpoint info. */ toCheckpointedBlock(block) {
|
|
457
|
+
const checkpoint = this.checkpointList.find((c)=>c.blocks.some((b)=>b.number === block.number));
|
|
458
|
+
const checkpointNumber = checkpoint?.number ?? block.checkpointNumber;
|
|
459
|
+
return new CheckpointedL2Block(checkpointNumber, block, new L1PublishedData(BigInt(block.number), BigInt(block.number), `0x${block.number.toString(16).padStart(64, '0')}`), []);
|
|
460
|
+
}
|
|
461
|
+
/** Finds the checkpoint number for a block, or undefined if the block is not in any checkpoint. */ findCheckpointNumberForBlock(blockNumber) {
|
|
462
|
+
const checkpoint = this.checkpointList.find((c)=>c.blocks.some((b)=>b.number === blockNumber));
|
|
463
|
+
return checkpoint?.number;
|
|
464
|
+
}
|
|
395
465
|
}
|
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19zdHJ1Y3RzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9tb2NrX3N0cnVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUFlLGdCQUFnQixFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxRQUFRLEVBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUc5RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVqRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBd0IsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFLM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUF5QixjQUFjLEVBQVksTUFBTSxrQkFBa0IsQ0FBQztBQUVuRixPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQXFCLE1BQU0sNkJBQTZCLENBQUM7QUFFbkYsd0JBQWdCLGdCQUFnQixDQUM5QixtQkFBbUIsV0FBZ0IsRUFDbkMsU0FBUyxHQUFFLE9BQU8sQ0FBQyxZQUFZLENBQU0sR0FDcEMsWUFBWSxDQWdCZDtBQUVELHdCQUFnQixpQkFBaUIsQ0FDL0IsVUFBVSxFQUFFLE1BQU0sRUFDbEIsSUFBSSxHQUFFO0lBQ0osV0FBVyxDQUFDLEVBQUUsUUFBUSxDQUFDO0lBQ3ZCLHVCQUF1QixDQUFDLEVBQUUsZ0JBQWdCLENBQUM7SUFDM0MscUJBQXFCLENBQUMsRUFB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock_structs.d.ts","sourceRoot":"","sources":["../../src/test/mock_structs.ts"],"names":[],"mappings":"AAMA,OAAO,EAAe,gBAAgB,EAAyB,MAAM,iCAAiC,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAY,MAAM,0BAA0B,CAAC;AAG9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"mock_structs.d.ts","sourceRoot":"","sources":["../../src/test/mock_structs.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { times, timesParallel } from '@aztec/foundation/collection';
|
|
|
6
6
|
import { randomBigInt, randomInt } from '@aztec/foundation/crypto/random';
|
|
7
7
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
8
8
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
9
|
-
import { CommitteeAttestation,
|
|
9
|
+
import { CommitteeAttestation, L2Block } from '@aztec/stdlib/block';
|
|
10
10
|
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
11
11
|
import { PrivateLog, PublicLog, SiloedTag, Tag } from '@aztec/stdlib/logs';
|
|
12
12
|
import { InboxLeaf } from '@aztec/stdlib/messaging';
|
|
@@ -32,16 +32,18 @@ export function makeInboxMessage(previousRollingHash = Buffer16.ZERO, overrides
|
|
|
32
32
|
rollingHash
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
-
export function makeInboxMessages(
|
|
36
|
-
const { initialHash = Buffer16.ZERO, overrideFn = (msg)=>msg, initialCheckpointNumber = 1 } = opts;
|
|
35
|
+
export function makeInboxMessages(totalCount, opts = {}) {
|
|
36
|
+
const { initialHash = Buffer16.ZERO, overrideFn = (msg)=>msg, initialCheckpointNumber = CheckpointNumber(1), messagesPerCheckpoint = 1 } = opts;
|
|
37
37
|
const messages = [];
|
|
38
38
|
let rollingHash = initialHash;
|
|
39
|
-
for(let i = 0; i <
|
|
39
|
+
for(let i = 0; i < totalCount; i++){
|
|
40
|
+
const msgIndex = i % messagesPerCheckpoint;
|
|
41
|
+
const checkpointNumber = CheckpointNumber.fromBigInt(BigInt(initialCheckpointNumber) + BigInt(i) / BigInt(messagesPerCheckpoint));
|
|
40
42
|
const leaf = Fr.random();
|
|
41
|
-
const checkpointNumber = CheckpointNumber(i + initialCheckpointNumber);
|
|
42
43
|
const message = overrideFn(makeInboxMessage(rollingHash, {
|
|
43
44
|
leaf,
|
|
44
|
-
checkpointNumber
|
|
45
|
+
checkpointNumber,
|
|
46
|
+
index: InboxLeaf.smallestIndexForCheckpoint(checkpointNumber) + BigInt(msgIndex)
|
|
45
47
|
}), i);
|
|
46
48
|
rollingHash = message.rollingHash;
|
|
47
49
|
messages.push(message);
|
|
@@ -75,6 +77,18 @@ export function makeInboxMessages(count, opts = {}) {
|
|
|
75
77
|
/** Creates L1PublishedData with deterministic values based on l1BlockNumber. */ export function makeL1PublishedData(l1BlockNumber) {
|
|
76
78
|
return new L1PublishedData(BigInt(l1BlockNumber), BigInt(l1BlockNumber * 1000), makeBlockHash(l1BlockNumber));
|
|
77
79
|
}
|
|
80
|
+
/** Creates a Checkpoint from a list of blocks with a header that matches the blocks' structure. */ export function makeCheckpoint(blocks, checkpointNumber = CheckpointNumber(1)) {
|
|
81
|
+
const firstBlock = blocks[0];
|
|
82
|
+
const { slotNumber, timestamp, coinbase, feeRecipient, gasFees } = firstBlock.header.globalVariables;
|
|
83
|
+
return new Checkpoint(blocks.at(-1).archive, CheckpointHeader.random({
|
|
84
|
+
lastArchiveRoot: firstBlock.header.lastArchive.root,
|
|
85
|
+
slotNumber,
|
|
86
|
+
timestamp,
|
|
87
|
+
coinbase,
|
|
88
|
+
feeRecipient,
|
|
89
|
+
gasFees
|
|
90
|
+
}), blocks, checkpointNumber);
|
|
91
|
+
}
|
|
78
92
|
/** Wraps a Checkpoint with L1 published data and random attestations. */ export function makePublishedCheckpoint(checkpoint, l1BlockNumber, attestationCount = 3) {
|
|
79
93
|
return new PublishedCheckpoint(checkpoint, makeL1PublishedData(l1BlockNumber), times(attestationCount, CommitteeAttestation.random));
|
|
80
94
|
}
|
|
@@ -147,8 +161,8 @@ export function makeInboxMessages(count, opts = {}) {
|
|
|
147
161
|
}
|
|
148
162
|
/** Creates a checkpoint with specified logs on each tx effect. */ export async function makeCheckpointWithLogs(blockNumber, options = {}) {
|
|
149
163
|
const { previousArchive, numTxsPerBlock = 4, privateLogs, publicLogs } = options;
|
|
150
|
-
const block = await
|
|
151
|
-
checkpointNumber: CheckpointNumber(blockNumber),
|
|
164
|
+
const block = await L2Block.random(BlockNumber(blockNumber), {
|
|
165
|
+
checkpointNumber: CheckpointNumber.fromBlockNumber(BlockNumber(blockNumber)),
|
|
152
166
|
indexWithinCheckpoint: IndexWithinCheckpoint(0),
|
|
153
167
|
state: makeStateForBlock(blockNumber, numTxsPerBlock),
|
|
154
168
|
...previousArchive ? {
|
|
@@ -162,8 +176,8 @@ export function makeInboxMessages(count, opts = {}) {
|
|
|
162
176
|
txEffect.publicLogs = publicLogs ? makePublicLogs(blockNumber, txIndex, publicLogs.numLogsPerTx, publicLogs.contractAddress) : [];
|
|
163
177
|
return txEffect;
|
|
164
178
|
});
|
|
165
|
-
const checkpoint =
|
|
179
|
+
const checkpoint = makeCheckpoint([
|
|
166
180
|
block
|
|
167
|
-
], CheckpointNumber(blockNumber));
|
|
181
|
+
], CheckpointNumber.fromBlockNumber(BlockNumber(blockNumber)));
|
|
168
182
|
return makePublishedCheckpoint(checkpoint, blockNumber);
|
|
169
183
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
+
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
4
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
5
|
+
import { Archiver } from '../archiver.js';
|
|
6
|
+
import { ArchiverInstrumentation } from '../modules/instrumentation.js';
|
|
7
|
+
import type { KVArchiverDataStore } from '../store/kv_archiver_store.js';
|
|
8
|
+
/**
|
|
9
|
+
* Archiver with mocked L1 connectivity for testing.
|
|
10
|
+
* Uses mock L1 clients and a noop synchronizer, enabling tests that
|
|
11
|
+
* don't require real Ethereum connectivity.
|
|
12
|
+
*/
|
|
13
|
+
export declare class NoopL1Archiver extends Archiver {
|
|
14
|
+
constructor(dataStore: KVArchiverDataStore, l1Constants: L1RollupConstants & {
|
|
15
|
+
genesisArchiveRoot: Fr;
|
|
16
|
+
}, instrumentation: ArchiverInstrumentation);
|
|
17
|
+
/** Override start to skip L1 validation checks. */
|
|
18
|
+
start(_blockUntilSynced?: boolean): Promise<void>;
|
|
19
|
+
/** Always reports as fully synced since there is no real L1 to sync from. */
|
|
20
|
+
getSyncedL2SlotNumber(): Promise<SlotNumber | undefined>;
|
|
21
|
+
}
|
|
22
|
+
/** Creates an archiver with mocked L1 connectivity for testing. */
|
|
23
|
+
export declare function createNoopL1Archiver(dataStore: KVArchiverDataStore, l1Constants: L1RollupConstants & {
|
|
24
|
+
genesisArchiveRoot: Fr;
|
|
25
|
+
}, telemetry?: TelemetryClient): Promise<NoopL1Archiver>;
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcF9sMV9hcmNoaXZlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3Qvbm9vcF9sMV9hcmNoaXZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFN0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBSXBELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFtQyxNQUFNLHlCQUF5QixDQUFDO0FBS2hHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV4RSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBeUJ6RTs7OztHQUlHO0FBQ0gscUJBQWEsY0FBZSxTQUFRLFFBQVE7SUFDMUMsWUFDRSxTQUFTLEVBQUUsbUJBQW1CLEVBQzlCLFdBQVcsRUFBRSxpQkFBaUIsR0FBRztRQUFFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQTtLQUFFLEVBQzNELGVBQWUsRUFBRSx1QkFBdUIsRUFzQ3pDO0lBRUQsbURBQW1EO0lBQ25DLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBSWhFO0lBRUQsNkVBQTZFO0lBQzdELHFCQUFxQixJQUFJLE9BQU8sQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBRXZFO0NBQ0Y7QUFFRCxtRUFBbUU7QUFDbkUsd0JBQXNCLG9CQUFvQixDQUN4QyxTQUFTLEVBQUUsbUJBQW1CLEVBQzlCLFdBQVcsRUFBRSxpQkFBaUIsR0FBRztJQUFFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQTtDQUFFLEVBQzNELFNBQVMsR0FBRSxlQUFzQyxHQUNoRCxPQUFPLENBQUMsY0FBYyxDQUFDLENBR3pCIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop_l1_archiver.d.ts","sourceRoot":"","sources":["../../src/test/noop_l1_archiver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAIpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,KAAK,eAAe,EAAmC,MAAM,yBAAyB,CAAC;AAKhG,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAExE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAyBzE;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,YACE,SAAS,EAAE,mBAAmB,EAC9B,WAAW,EAAE,iBAAiB,GAAG;QAAE,kBAAkB,EAAE,EAAE,CAAA;KAAE,EAC3D,eAAe,EAAE,uBAAuB,EAsCzC;IAED,mDAAmD;IACnC,KAAK,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhE;IAED,6EAA6E;IAC7D,qBAAqB,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAEvE;CACF;AAED,mEAAmE;AACnE,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,mBAAmB,EAC9B,WAAW,EAAE,iBAAiB,GAAG;IAAE,kBAAkB,EAAE,EAAE,CAAA;CAAE,EAC3D,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,cAAc,CAAC,CAGzB"}
|