@aztec/archiver 0.0.1-commit.f504929 → 0.0.1-commit.f5a9928
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 +19 -13
- package/dest/archiver.d.ts +73 -18
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +321 -81
- package/dest/config.d.ts +7 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +43 -14
- package/dest/errors.d.ts +55 -9
- package/dest/errors.d.ts.map +1 -1
- package/dest/errors.js +81 -14
- package/dest/factory.d.ts +20 -9
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +85 -37
- package/dest/index.d.ts +11 -3
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +10 -2
- package/dest/l1/calldata_retriever.d.ts +9 -1
- package/dest/l1/calldata_retriever.d.ts.map +1 -1
- package/dest/l1/calldata_retriever.js +22 -11
- package/dest/l1/data_retrieval.d.ts +25 -11
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/l1/data_retrieval.js +25 -32
- package/dest/l1/trace_tx.d.ts +12 -66
- package/dest/l1/trace_tx.d.ts.map +1 -1
- package/dest/l1/validate_historical_logs.d.ts +23 -0
- package/dest/l1/validate_historical_logs.d.ts.map +1 -0
- package/dest/l1/validate_historical_logs.js +108 -0
- package/dest/modules/contract_data_source_adapter.d.ts +25 -0
- package/dest/modules/contract_data_source_adapter.d.ts.map +1 -0
- package/dest/modules/contract_data_source_adapter.js +32 -0
- package/dest/modules/data_source_base.d.ts +73 -50
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +250 -144
- package/dest/modules/data_store_updater.d.ts +42 -17
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +198 -123
- package/dest/modules/instrumentation.d.ts +15 -2
- package/dest/modules/instrumentation.d.ts.map +1 -1
- package/dest/modules/instrumentation.js +48 -9
- package/dest/modules/l1_synchronizer.d.ts +14 -8
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +477 -213
- package/dest/modules/outbox_trees_resolver.d.ts +64 -0
- package/dest/modules/outbox_trees_resolver.d.ts.map +1 -0
- package/dest/modules/outbox_trees_resolver.js +184 -0
- package/dest/modules/validation.d.ts +30 -7
- package/dest/modules/validation.d.ts.map +1 -1
- package/dest/modules/validation.js +35 -17
- package/dest/store/block_store.d.ts +186 -78
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +763 -290
- package/dest/store/contract_class_store.d.ts +17 -4
- package/dest/store/contract_class_store.d.ts.map +1 -1
- package/dest/store/contract_class_store.js +42 -68
- package/dest/store/contract_instance_store.d.ts +28 -1
- package/dest/store/contract_instance_store.d.ts.map +1 -1
- package/dest/store/contract_instance_store.js +58 -6
- package/dest/store/data_stores.d.ts +68 -0
- package/dest/store/data_stores.d.ts.map +1 -0
- package/dest/store/data_stores.js +54 -0
- package/dest/store/function_names_cache.d.ts +17 -0
- package/dest/store/function_names_cache.d.ts.map +1 -0
- package/dest/store/function_names_cache.js +30 -0
- package/dest/store/l2_tips_cache.d.ts +13 -7
- package/dest/store/l2_tips_cache.d.ts.map +1 -1
- package/dest/store/l2_tips_cache.js +13 -76
- package/dest/store/log_store.d.ts +42 -37
- package/dest/store/log_store.d.ts.map +1 -1
- package/dest/store/log_store.js +262 -408
- package/dest/store/log_store_codec.d.ts +78 -0
- package/dest/store/log_store_codec.d.ts.map +1 -0
- package/dest/store/log_store_codec.js +110 -0
- package/dest/store/message_store.d.ts +11 -1
- package/dest/store/message_store.d.ts.map +1 -1
- package/dest/store/message_store.js +51 -9
- package/dest/test/fake_l1_state.d.ts +20 -1
- package/dest/test/fake_l1_state.d.ts.map +1 -1
- package/dest/test/fake_l1_state.js +117 -21
- package/dest/test/mock_l2_block_source.d.ts +51 -52
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +232 -180
- package/dest/test/mock_structs.d.ts +4 -1
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +15 -3
- package/dest/test/noop_l1_archiver.d.ts +17 -6
- package/dest/test/noop_l1_archiver.d.ts.map +1 -1
- package/dest/test/noop_l1_archiver.js +31 -11
- package/package.json +15 -14
- package/src/archiver.ts +415 -90
- package/src/config.ts +51 -13
- package/src/errors.ts +122 -21
- package/src/factory.ts +99 -30
- package/src/index.ts +18 -2
- package/src/l1/calldata_retriever.ts +29 -11
- package/src/l1/data_retrieval.ts +44 -46
- package/src/l1/validate_historical_logs.ts +140 -0
- package/src/modules/contract_data_source_adapter.ts +46 -0
- package/src/modules/data_source_base.ts +327 -189
- package/src/modules/data_store_updater.ts +235 -155
- package/src/modules/instrumentation.ts +43 -10
- package/src/modules/l1_synchronizer.ts +646 -259
- package/src/modules/outbox_trees_resolver.ts +220 -0
- package/src/modules/validation.ts +80 -23
- package/src/store/block_store.ts +930 -348
- package/src/store/contract_class_store.ts +49 -103
- package/src/store/contract_instance_store.ts +74 -11
- package/src/store/data_stores.ts +104 -0
- package/src/store/function_names_cache.ts +37 -0
- package/src/store/l2_tips_cache.ts +16 -70
- package/src/store/log_store.ts +302 -559
- package/src/store/log_store_codec.ts +143 -0
- package/src/store/message_store.ts +60 -10
- package/src/structs/inbox_message.ts +1 -1
- package/src/test/fake_l1_state.ts +145 -32
- package/src/test/mock_l2_block_source.ts +292 -227
- package/src/test/mock_structs.ts +25 -8
- package/src/test/noop_l1_archiver.ts +61 -12
- package/dest/store/kv_archiver_store.d.ts +0 -354
- package/dest/store/kv_archiver_store.d.ts.map +0 -1
- package/dest/store/kv_archiver_store.js +0 -464
- package/src/store/kv_archiver_store.ts +0 -671
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { GENESIS_ARCHIVE_ROOT } from '@aztec/constants';
|
|
2
2
|
import { DefaultL1ContractsConfig } from '@aztec/ethereum/config';
|
|
3
|
-
import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { BlockNumber, CheckpointNumber, IndexWithinCheckpoint, SlotNumber } from '@aztec/foundation/branded-types';
|
|
4
4
|
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 {
|
|
8
|
+
import { Body, GENESIS_BLOCK_HEADER_HASH, GENESIS_CHECKPOINT_HEADER_HASH, L2Block } from '@aztec/stdlib/block';
|
|
9
9
|
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
10
10
|
import { EmptyL1RollupConstants, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
11
11
|
import { computeCheckpointOutHash } from '@aztec/stdlib/messaging';
|
|
12
12
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
13
|
-
import {
|
|
13
|
+
import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
14
|
+
import { BlockHeader } from '@aztec/stdlib/tx';
|
|
14
15
|
/**
|
|
15
16
|
* A mocked implementation of L2BlockSource to be used in tests.
|
|
16
17
|
*/ export class MockL2BlockSource {
|
|
@@ -19,10 +20,53 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
19
20
|
provenBlockNumber = 0;
|
|
20
21
|
finalizedBlockNumber = 0;
|
|
21
22
|
checkpointedBlockNumber = 0;
|
|
23
|
+
initialHeader = BlockHeader.empty();
|
|
24
|
+
initialHeaderHash = GENESIS_BLOCK_HEADER_HASH;
|
|
25
|
+
genesisArchiveRoot;
|
|
26
|
+
genesisBlock;
|
|
22
27
|
log = createLogger('archiver:mock_l2_block_source');
|
|
28
|
+
/** Returns the initial header used to synthesize block 0. */ getInitialHeader() {
|
|
29
|
+
return this.initialHeader;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Sets the initial header used to synthesize block 0. Tests that wire up a real
|
|
33
|
+
* world-state should call this with `worldState.getInitialHeader()` so the L2BlockStream
|
|
34
|
+
* agrees on the genesis hash on both sides. Precomputes and caches the header hash so
|
|
35
|
+
* `getGenesisBlockHash()` can return synchronously.
|
|
36
|
+
*/ async setInitialHeader(header) {
|
|
37
|
+
this.initialHeader = header;
|
|
38
|
+
this.initialHeaderHash = await header.hash();
|
|
39
|
+
this.genesisBlock = undefined;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Returns the precomputed hash of the genesis block header. Defaults to the static
|
|
43
|
+
* {@link GENESIS_BLOCK_HEADER_HASH} unless {@link setInitialHeader} has been called with a
|
|
44
|
+
* custom header.
|
|
45
|
+
*/ getGenesisBlockHash() {
|
|
46
|
+
return this.initialHeaderHash;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Sets the post-genesis archive root used to synthesize block 0. Mirrors the real archiver,
|
|
50
|
+
* whose synthetic block 0 carries `new AppendOnlyTreeSnapshot(genesisArchiveRoot, 1)` rather
|
|
51
|
+
* than `AppendOnlyTreeSnapshot.empty()`. Tests wiring up a real world-state should set this so
|
|
52
|
+
* archive-based block lookups against the mock match production semantics.
|
|
53
|
+
*/ setGenesisArchiveRoot(root) {
|
|
54
|
+
this.genesisArchiveRoot = root;
|
|
55
|
+
this.genesisBlock = undefined;
|
|
56
|
+
}
|
|
57
|
+
getGenesisBlock() {
|
|
58
|
+
if (this.genesisBlock) {
|
|
59
|
+
return this.genesisBlock;
|
|
60
|
+
}
|
|
61
|
+
const archive = this.genesisArchiveRoot ? new AppendOnlyTreeSnapshot(this.genesisArchiveRoot, 1) : AppendOnlyTreeSnapshot.empty();
|
|
62
|
+
return this.genesisBlock = new L2Block(archive, this.initialHeader, Body.empty(), CheckpointNumber.ZERO, IndexWithinCheckpoint(0));
|
|
63
|
+
}
|
|
23
64
|
/** Creates blocks grouped into single-block checkpoints. */ async createBlocks(numBlocks) {
|
|
24
65
|
await this.createCheckpoints(numBlocks, 1);
|
|
25
66
|
}
|
|
67
|
+
getCheckpointNumber() {
|
|
68
|
+
return Promise.resolve(this.checkpointList.length === 0 ? CheckpointNumber.ZERO : CheckpointNumber(this.checkpointList.length));
|
|
69
|
+
}
|
|
26
70
|
/** Creates checkpoints, each containing `blocksPerCheckpoint` blocks. */ async createCheckpoints(numCheckpoints, blocksPerCheckpoint = 1) {
|
|
27
71
|
for(let c = 0; c < numCheckpoints; c++){
|
|
28
72
|
const checkpointNum = CheckpointNumber(this.checkpointList.length + 1);
|
|
@@ -106,176 +150,95 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
106
150
|
*/ getRegistryAddress() {
|
|
107
151
|
return Promise.resolve(EthAddress.random());
|
|
108
152
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
*/ getBlockNumber() {
|
|
113
|
-
return Promise.resolve(BlockNumber(this.l2Blocks.length));
|
|
114
|
-
}
|
|
115
|
-
getProvenBlockNumber() {
|
|
116
|
-
return Promise.resolve(BlockNumber(this.provenBlockNumber));
|
|
117
|
-
}
|
|
118
|
-
getCheckpointedL2BlockNumber() {
|
|
119
|
-
return Promise.resolve(BlockNumber(this.checkpointedBlockNumber));
|
|
120
|
-
}
|
|
121
|
-
getFinalizedL2BlockNumber() {
|
|
122
|
-
return Promise.resolve(BlockNumber(this.finalizedBlockNumber));
|
|
123
|
-
}
|
|
124
|
-
getCheckpointedBlock(number) {
|
|
125
|
-
if (number > this.checkpointedBlockNumber) {
|
|
126
|
-
return Promise.resolve(undefined);
|
|
153
|
+
async getBlockNumber(query) {
|
|
154
|
+
if (!query) {
|
|
155
|
+
return BlockNumber(this.l2Blocks.length);
|
|
127
156
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
return Promise.resolve(undefined);
|
|
157
|
+
if ('number' in query) {
|
|
158
|
+
return query.number;
|
|
131
159
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
async getCheckpointedBlocks(from, limit) {
|
|
135
|
-
const result = [];
|
|
136
|
-
for(let i = 0; i < limit; i++){
|
|
137
|
-
const blockNum = from + i;
|
|
138
|
-
if (blockNum > this.checkpointedBlockNumber) {
|
|
139
|
-
break;
|
|
140
|
-
}
|
|
141
|
-
const block = await this.getCheckpointedBlock(BlockNumber(blockNum));
|
|
142
|
-
if (block) {
|
|
143
|
-
result.push(block);
|
|
144
|
-
}
|
|
160
|
+
if ('tag' in query) {
|
|
161
|
+
return BlockNumber(this.resolveBlockTag(query.tag));
|
|
145
162
|
}
|
|
146
|
-
|
|
163
|
+
const block = await this.getBlock(query);
|
|
164
|
+
return block ? block.header.globalVariables.blockNumber : undefined;
|
|
147
165
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
return Promise.resolve(block);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Gets an L2 block (new format).
|
|
158
|
-
* @param number - The block number to return.
|
|
159
|
-
* @returns The requested L2 block.
|
|
160
|
-
*/ getL2Block(number) {
|
|
161
|
-
const block = this.l2Blocks[number - 1];
|
|
162
|
-
return Promise.resolve(block);
|
|
166
|
+
getCheckpoint(query) {
|
|
167
|
+
const checkpoint = this.resolveCheckpointQuery(query);
|
|
168
|
+
if (!checkpoint) {
|
|
169
|
+
return Promise.resolve(undefined);
|
|
170
|
+
}
|
|
171
|
+
return Promise.resolve(new PublishedCheckpoint(checkpoint, this.mockL1DataForCheckpoint(checkpoint), []));
|
|
163
172
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
* @param from - Number of the first block to return (inclusive).
|
|
167
|
-
* @param limit - The maximum number of blocks to return.
|
|
168
|
-
* @returns The requested mocked L2 blocks.
|
|
169
|
-
*/ getBlocks(from, limit) {
|
|
170
|
-
return Promise.resolve(this.l2Blocks.slice(from - 1, from - 1 + limit));
|
|
171
|
-
}
|
|
172
|
-
getCheckpoints(from, limit) {
|
|
173
|
-
const checkpoints = this.checkpointList.slice(from - 1, from - 1 + limit);
|
|
173
|
+
getCheckpoints(query) {
|
|
174
|
+
const checkpoints = this.resolveCheckpointsQuery(query);
|
|
174
175
|
return Promise.resolve(checkpoints.map((checkpoint)=>new PublishedCheckpoint(checkpoint, this.mockL1DataForCheckpoint(checkpoint), [])));
|
|
175
176
|
}
|
|
176
177
|
getCheckpointByArchive(archive) {
|
|
177
178
|
const checkpoint = this.checkpointList.find((c)=>c.archive.root.equals(archive));
|
|
178
179
|
return Promise.resolve(checkpoint);
|
|
179
180
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
if (hash.equals(blockHash)) {
|
|
184
|
-
return this.toCheckpointedBlock(block);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
return undefined;
|
|
188
|
-
}
|
|
189
|
-
getCheckpointedBlockByArchive(archive) {
|
|
190
|
-
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
191
|
-
if (!block) {
|
|
181
|
+
getCheckpointData(query) {
|
|
182
|
+
const checkpoint = this.resolveCheckpointQuery(query);
|
|
183
|
+
if (!checkpoint) {
|
|
192
184
|
return Promise.resolve(undefined);
|
|
193
185
|
}
|
|
194
|
-
return Promise.resolve(this.
|
|
195
|
-
}
|
|
196
|
-
async getL2BlockByHash(blockHash) {
|
|
197
|
-
for (const block of this.l2Blocks){
|
|
198
|
-
const hash = await block.hash();
|
|
199
|
-
if (hash.equals(blockHash)) {
|
|
200
|
-
return block;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
return undefined;
|
|
204
|
-
}
|
|
205
|
-
getL2BlockByArchive(archive) {
|
|
206
|
-
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
207
|
-
return Promise.resolve(block);
|
|
208
|
-
}
|
|
209
|
-
async getBlockHeaderByHash(blockHash) {
|
|
210
|
-
for (const block of this.l2Blocks){
|
|
211
|
-
const hash = await block.hash();
|
|
212
|
-
if (hash.equals(blockHash)) {
|
|
213
|
-
return block.header;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
return undefined;
|
|
186
|
+
return Promise.resolve(this.checkpointToData(checkpoint));
|
|
217
187
|
}
|
|
218
|
-
|
|
219
|
-
const
|
|
220
|
-
return Promise.resolve(
|
|
188
|
+
getCheckpointsData(query) {
|
|
189
|
+
const checkpoints = this.resolveCheckpointsQuery(query);
|
|
190
|
+
return Promise.resolve(checkpoints.map((c)=>this.checkpointToData(c)));
|
|
221
191
|
}
|
|
222
|
-
|
|
223
|
-
const block = this.l2Blocks[number - 1];
|
|
224
|
-
if (!block) {
|
|
225
|
-
return undefined;
|
|
226
|
-
}
|
|
192
|
+
checkpointToData(checkpoint) {
|
|
227
193
|
return {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
194
|
+
checkpointNumber: checkpoint.number,
|
|
195
|
+
header: checkpoint.header,
|
|
196
|
+
archive: checkpoint.archive,
|
|
197
|
+
checkpointOutHash: computeCheckpointOutHash(checkpoint.blocks.map((b)=>b.body.txEffects.map((tx)=>tx.l2ToL1Msgs))),
|
|
198
|
+
startBlock: checkpoint.blocks[0].number,
|
|
199
|
+
blockCount: checkpoint.blocks.length,
|
|
200
|
+
feeAssetPriceModifier: checkpoint.feeAssetPriceModifier,
|
|
201
|
+
attestations: [],
|
|
202
|
+
l1: this.mockL1DataForCheckpoint(checkpoint)
|
|
233
203
|
};
|
|
234
204
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
205
|
+
resolveCheckpointQuery(query) {
|
|
206
|
+
if ('number' in query) {
|
|
207
|
+
return this.checkpointList[query.number - 1];
|
|
208
|
+
}
|
|
209
|
+
if ('slot' in query) {
|
|
210
|
+
return this.checkpointList.find((c)=>c.header.slotNumber === query.slot);
|
|
211
|
+
}
|
|
212
|
+
switch(query.tag){
|
|
213
|
+
case 'checkpointed':
|
|
214
|
+
return this.checkpointList[this.checkpointList.length - 1];
|
|
215
|
+
case 'proven':
|
|
216
|
+
{
|
|
217
|
+
const provenCheckpoint = this.checkpointList.filter((c)=>c.blocks.some((b)=>b.number <= this.provenBlockNumber));
|
|
218
|
+
return provenCheckpoint.at(-1);
|
|
219
|
+
}
|
|
220
|
+
case 'finalized':
|
|
221
|
+
{
|
|
222
|
+
const finalizedCheckpoint = this.checkpointList.filter((c)=>c.blocks.some((b)=>b.number <= this.finalizedBlockNumber));
|
|
223
|
+
return finalizedCheckpoint.at(-1);
|
|
224
|
+
}
|
|
239
225
|
}
|
|
240
|
-
return {
|
|
241
|
-
header: block.header,
|
|
242
|
-
archive: block.archive,
|
|
243
|
-
blockHash: await block.hash(),
|
|
244
|
-
checkpointNumber: block.checkpointNumber,
|
|
245
|
-
indexWithinCheckpoint: block.indexWithinCheckpoint
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
getBlockHeader(number) {
|
|
249
|
-
return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.header);
|
|
250
|
-
}
|
|
251
|
-
getCheckpointsForEpoch(epochNumber) {
|
|
252
|
-
return Promise.resolve(this.getCheckpointsInEpoch(epochNumber));
|
|
253
|
-
}
|
|
254
|
-
getCheckpointsDataForEpoch(epochNumber) {
|
|
255
|
-
const checkpoints = this.getCheckpointsInEpoch(epochNumber);
|
|
256
|
-
return Promise.resolve(checkpoints.map((checkpoint)=>({
|
|
257
|
-
checkpointNumber: checkpoint.number,
|
|
258
|
-
header: checkpoint.header,
|
|
259
|
-
archive: checkpoint.archive,
|
|
260
|
-
checkpointOutHash: computeCheckpointOutHash(checkpoint.blocks.map((b)=>b.body.txEffects.map((tx)=>tx.l2ToL1Msgs))),
|
|
261
|
-
startBlock: checkpoint.blocks[0].number,
|
|
262
|
-
blockCount: checkpoint.blocks.length,
|
|
263
|
-
attestations: [],
|
|
264
|
-
l1: this.mockL1DataForCheckpoint(checkpoint)
|
|
265
|
-
})));
|
|
266
226
|
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
227
|
+
resolveCheckpointsQuery(query) {
|
|
228
|
+
if ('from' in query) {
|
|
229
|
+
return this.checkpointList.slice(query.from - 1, query.from - 1 + query.limit);
|
|
230
|
+
}
|
|
231
|
+
if ('fromSlot' in query) {
|
|
232
|
+
const matching = this.checkpointList.filter((c)=>query.reverse ? c.header.slotNumber <= query.fromSlot : c.header.slotNumber >= query.fromSlot);
|
|
233
|
+
const nearestFirst = query.reverse ? matching.reverse() : matching;
|
|
234
|
+
return nearestFirst.slice(0, query.limit);
|
|
235
|
+
}
|
|
236
|
+
return this.getCheckpointsInEpoch(query.epoch);
|
|
270
237
|
}
|
|
271
238
|
getBlocksForSlot(slotNumber) {
|
|
272
239
|
const blocks = this.l2Blocks.filter((b)=>b.header.globalVariables.slotNumber === slotNumber);
|
|
273
240
|
return Promise.resolve(blocks);
|
|
274
241
|
}
|
|
275
|
-
async getCheckpointedBlockHeadersForEpoch(epochNumber) {
|
|
276
|
-
const checkpointedBlocks = await this.getCheckpointedBlocksForEpoch(epochNumber);
|
|
277
|
-
return checkpointedBlocks.map((b)=>b.block.header);
|
|
278
|
-
}
|
|
279
242
|
/**
|
|
280
243
|
* Gets a tx effect.
|
|
281
244
|
* @param txHash - The hash of the tx corresponding to the tx effect.
|
|
@@ -293,28 +256,18 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
293
256
|
data: txEffect,
|
|
294
257
|
l2BlockNumber: block.number,
|
|
295
258
|
l2BlockHash: await block.hash(),
|
|
296
|
-
txIndexInBlock: block.body.txEffects.
|
|
259
|
+
txIndexInBlock: block.body.txEffects.findIndex((t)=>t.txHash.equals(txHash)),
|
|
260
|
+
slotNumber: block.header.globalVariables.slotNumber
|
|
297
261
|
};
|
|
298
262
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
* @returns The requested tx receipt (or undefined if not found).
|
|
303
|
-
*/ async getSettledTxReceipt(txHash) {
|
|
304
|
-
for (const block of this.l2Blocks){
|
|
305
|
-
for (const txEffect of block.body.txEffects){
|
|
306
|
-
if (txEffect.txHash.equals(txHash)) {
|
|
307
|
-
// In mock, assume all txs are checkpointed with successful execution
|
|
308
|
-
return new TxReceipt(txHash, TxStatus.CHECKPOINTED, TxExecutionResult.SUCCESS, undefined, txEffect.transactionFee.toBigInt(), await block.hash(), block.number);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
return undefined;
|
|
263
|
+
getL2ToL1MembershipWitness() {
|
|
264
|
+
// Mock does not back the L2-to-L1 message witness flow.
|
|
265
|
+
return Promise.resolve(undefined);
|
|
313
266
|
}
|
|
314
267
|
async getL2Tips() {
|
|
315
268
|
const [latest, proven, finalized, checkpointed] = [
|
|
316
269
|
await this.getBlockNumber(),
|
|
317
|
-
|
|
270
|
+
this.provenBlockNumber,
|
|
318
271
|
this.finalizedBlockNumber,
|
|
319
272
|
this.checkpointedBlockNumber
|
|
320
273
|
];
|
|
@@ -322,29 +275,45 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
322
275
|
const provenBlock = this.l2Blocks[proven - 1];
|
|
323
276
|
const finalizedBlock = this.l2Blocks[finalized - 1];
|
|
324
277
|
const checkpointedBlock = this.l2Blocks[checkpointed - 1];
|
|
278
|
+
// For genesis tips (block number 0) report the dynamic initial header hash so consumers
|
|
279
|
+
// running L2BlockStream against this mock agree at block 0 with their local tip store.
|
|
280
|
+
const genesisHash = (await this.initialHeader.hash()).toString();
|
|
281
|
+
const tipHash = async (block, number)=>{
|
|
282
|
+
if (block) {
|
|
283
|
+
return (await block.hash()).toString();
|
|
284
|
+
}
|
|
285
|
+
return number === 0 ? genesisHash : '';
|
|
286
|
+
};
|
|
325
287
|
const latestBlockId = {
|
|
326
288
|
number: BlockNumber(latest),
|
|
327
|
-
hash:
|
|
289
|
+
hash: await tipHash(latestBlock, latest)
|
|
328
290
|
};
|
|
329
291
|
const provenBlockId = {
|
|
330
292
|
number: BlockNumber(proven),
|
|
331
|
-
hash:
|
|
293
|
+
hash: await tipHash(provenBlock, proven)
|
|
332
294
|
};
|
|
333
295
|
const finalizedBlockId = {
|
|
334
296
|
number: BlockNumber(finalized),
|
|
335
|
-
hash:
|
|
297
|
+
hash: await tipHash(finalizedBlock, finalized)
|
|
336
298
|
};
|
|
337
299
|
const checkpointedBlockId = {
|
|
338
300
|
number: BlockNumber(checkpointed),
|
|
339
|
-
hash:
|
|
301
|
+
hash: await tipHash(checkpointedBlock, checkpointed)
|
|
340
302
|
};
|
|
341
|
-
const makeTipId = (blockId)=>
|
|
303
|
+
const makeTipId = (blockId)=>{
|
|
304
|
+
const checkpointNumber = this.findCheckpointNumberForBlock(blockId.number) ?? CheckpointNumber(0);
|
|
305
|
+
// Match production semantics: checkpoint 0 is fully synthetic (no real checkpoint header
|
|
306
|
+
// exists at 0), so its hash stays at the protocol constant `GENESIS_CHECKPOINT_HEADER_HASH`
|
|
307
|
+
// even though the block-0 hash is dynamic. See L2TipsCache for the production path.
|
|
308
|
+
const hash = checkpointNumber === 0 ? GENESIS_CHECKPOINT_HEADER_HASH.toString() : blockId.hash;
|
|
309
|
+
return {
|
|
342
310
|
block: blockId,
|
|
343
311
|
checkpoint: {
|
|
344
|
-
number:
|
|
345
|
-
hash
|
|
312
|
+
number: checkpointNumber,
|
|
313
|
+
hash
|
|
346
314
|
}
|
|
347
|
-
}
|
|
315
|
+
};
|
|
316
|
+
};
|
|
348
317
|
return {
|
|
349
318
|
proposed: latestBlockId,
|
|
350
319
|
checkpointed: makeTipId(checkpointedBlockId),
|
|
@@ -352,10 +321,10 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
352
321
|
finalized: makeTipId(finalizedBlockId)
|
|
353
322
|
};
|
|
354
323
|
}
|
|
355
|
-
|
|
324
|
+
getSyncedL2EpochNumber() {
|
|
356
325
|
throw new Error('Method not implemented.');
|
|
357
326
|
}
|
|
358
|
-
|
|
327
|
+
getSyncedL2SlotNumber() {
|
|
359
328
|
throw new Error('Method not implemented.');
|
|
360
329
|
}
|
|
361
330
|
isEpochComplete(_epochNumber) {
|
|
@@ -364,9 +333,12 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
364
333
|
getL1Constants() {
|
|
365
334
|
return Promise.resolve(EmptyL1RollupConstants);
|
|
366
335
|
}
|
|
336
|
+
isPruneDueAtSlot(_slot) {
|
|
337
|
+
return Promise.resolve(false);
|
|
338
|
+
}
|
|
367
339
|
getGenesisValues() {
|
|
368
340
|
return Promise.resolve({
|
|
369
|
-
genesisArchiveRoot: new Fr(GENESIS_ARCHIVE_ROOT)
|
|
341
|
+
genesisArchiveRoot: this.genesisArchiveRoot ?? new Fr(GENESIS_ARCHIVE_ROOT)
|
|
370
342
|
});
|
|
371
343
|
}
|
|
372
344
|
getL1Timestamp() {
|
|
@@ -407,6 +379,88 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
407
379
|
syncImmediate() {
|
|
408
380
|
return Promise.resolve();
|
|
409
381
|
}
|
|
382
|
+
async getBlock(query) {
|
|
383
|
+
if ('number' in query) {
|
|
384
|
+
if (query.number === 0) {
|
|
385
|
+
return this.getGenesisBlock();
|
|
386
|
+
}
|
|
387
|
+
return this.l2Blocks[query.number - 1];
|
|
388
|
+
}
|
|
389
|
+
if ('hash' in query) {
|
|
390
|
+
const genesis = this.getGenesisBlock();
|
|
391
|
+
if ((await genesis.hash()).equals(query.hash)) {
|
|
392
|
+
return genesis;
|
|
393
|
+
}
|
|
394
|
+
for (const b of this.l2Blocks){
|
|
395
|
+
const hash = await b.hash();
|
|
396
|
+
if (hash.equals(query.hash)) {
|
|
397
|
+
return b;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return undefined;
|
|
401
|
+
}
|
|
402
|
+
if ('archive' in query) {
|
|
403
|
+
const genesis = this.getGenesisBlock();
|
|
404
|
+
if (genesis.archive.root.equals(query.archive)) {
|
|
405
|
+
return genesis;
|
|
406
|
+
}
|
|
407
|
+
return this.l2Blocks.find((b)=>b.archive.root.equals(query.archive));
|
|
408
|
+
}
|
|
409
|
+
const number = this.resolveBlockTag(query.tag);
|
|
410
|
+
if (number === 0) {
|
|
411
|
+
return this.getGenesisBlock();
|
|
412
|
+
}
|
|
413
|
+
return this.l2Blocks[number - 1];
|
|
414
|
+
}
|
|
415
|
+
resolveBlockTag(tag) {
|
|
416
|
+
switch(tag){
|
|
417
|
+
case 'latest':
|
|
418
|
+
case 'proposed':
|
|
419
|
+
return this.l2Blocks.length;
|
|
420
|
+
case 'checkpointed':
|
|
421
|
+
return this.checkpointedBlockNumber;
|
|
422
|
+
case 'proven':
|
|
423
|
+
return this.provenBlockNumber;
|
|
424
|
+
case 'finalized':
|
|
425
|
+
return this.finalizedBlockNumber;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
getBlocks(query) {
|
|
429
|
+
let blocks;
|
|
430
|
+
if ('from' in query) {
|
|
431
|
+
blocks = this.l2Blocks.slice(query.from - 1, query.from - 1 + query.limit);
|
|
432
|
+
} else {
|
|
433
|
+
const epochCheckpoints = this.getCheckpointsInEpoch(query.epoch);
|
|
434
|
+
blocks = epochCheckpoints.flatMap((c)=>c.blocks);
|
|
435
|
+
}
|
|
436
|
+
if (query.onlyCheckpointed) {
|
|
437
|
+
blocks = blocks.filter((b)=>b.header.globalVariables.blockNumber <= this.checkpointedBlockNumber);
|
|
438
|
+
}
|
|
439
|
+
return Promise.resolve(blocks);
|
|
440
|
+
}
|
|
441
|
+
async getBlockData(query) {
|
|
442
|
+
const block = await this.getBlock(query);
|
|
443
|
+
if (!block) {
|
|
444
|
+
return undefined;
|
|
445
|
+
}
|
|
446
|
+
return {
|
|
447
|
+
header: block.header,
|
|
448
|
+
archive: block.archive,
|
|
449
|
+
blockHash: await block.hash(),
|
|
450
|
+
checkpointNumber: block.checkpointNumber,
|
|
451
|
+
indexWithinCheckpoint: block.indexWithinCheckpoint
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
async getBlocksData(query) {
|
|
455
|
+
const blocks = await this.getBlocks(query);
|
|
456
|
+
return Promise.all(blocks.map(async (block)=>({
|
|
457
|
+
header: block.header,
|
|
458
|
+
archive: block.archive,
|
|
459
|
+
blockHash: await block.hash(),
|
|
460
|
+
checkpointNumber: block.checkpointNumber,
|
|
461
|
+
indexWithinCheckpoint: block.indexWithinCheckpoint
|
|
462
|
+
})));
|
|
463
|
+
}
|
|
410
464
|
isPendingChainInvalid() {
|
|
411
465
|
return Promise.resolve(false);
|
|
412
466
|
}
|
|
@@ -415,6 +469,9 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
415
469
|
valid: true
|
|
416
470
|
});
|
|
417
471
|
}
|
|
472
|
+
getProposedCheckpointData(_query) {
|
|
473
|
+
return Promise.resolve(undefined);
|
|
474
|
+
}
|
|
418
475
|
/** Returns checkpoints whose slot falls within the given epoch. */ getCheckpointsInEpoch(epochNumber) {
|
|
419
476
|
const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
|
|
420
477
|
const [start, end] = getSlotRangeForEpoch(epochNumber, {
|
|
@@ -425,11 +482,6 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
425
482
|
/** Creates a mock L1PublishedData for a checkpoint. */ mockL1DataForCheckpoint(checkpoint) {
|
|
426
483
|
return new L1PublishedData(BigInt(checkpoint.number), BigInt(checkpoint.number), Buffer32.random().toString());
|
|
427
484
|
}
|
|
428
|
-
/** Creates a CheckpointedL2Block from a block using stored checkpoint info. */ toCheckpointedBlock(block) {
|
|
429
|
-
const checkpoint = this.checkpointList.find((c)=>c.blocks.some((b)=>b.number === block.number));
|
|
430
|
-
const checkpointNumber = checkpoint?.number ?? block.checkpointNumber;
|
|
431
|
-
return new CheckpointedL2Block(checkpointNumber, block, new L1PublishedData(BigInt(block.number), BigInt(block.number), `0x${block.number.toString(16).padStart(64, '0')}`), []);
|
|
432
|
-
}
|
|
433
485
|
/** Finds the checkpoint number for a block, or undefined if the block is not in any checkpoint. */ findCheckpointNumberForBlock(blockNumber) {
|
|
434
486
|
const checkpoint = this.checkpointList.find((c)=>c.blocks.some((b)=>b.number === blockNumber));
|
|
435
487
|
return checkpoint?.number;
|
|
@@ -3,6 +3,7 @@ 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';
|
|
@@ -28,6 +29,8 @@ export declare function makeBlockHash(blockNumber: number): `0x${string}`;
|
|
|
28
29
|
export declare function makeStateForBlock(blockNumber: number, txsPerBlock: number): StateReference;
|
|
29
30
|
/** Creates L1PublishedData with deterministic values based on l1BlockNumber. */
|
|
30
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;
|
|
31
34
|
/** Wraps a Checkpoint with L1 published data and random attestations. */
|
|
32
35
|
export declare function makePublishedCheckpoint(checkpoint: Checkpoint, l1BlockNumber: number, attestationCount?: number): PublishedCheckpoint;
|
|
33
36
|
export interface MakeChainedCheckpointsOptions {
|
|
@@ -82,4 +85,4 @@ export interface MockCheckpointWithLogsOptions {
|
|
|
82
85
|
}
|
|
83
86
|
/** Creates a checkpoint with specified logs on each tx effect. */
|
|
84
87
|
export declare function makeCheckpointWithLogs(blockNumber: number, options?: MockCheckpointWithLogsOptions): Promise<PublishedCheckpoint>;
|
|
85
|
-
//# 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":"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;AAC3D,OAAO,EAAwB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAK3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,cAAc,EAAY,MAAM,kBAAkB,CAAC;AAEnF,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAEnF,wBAAgB,gBAAgB,CAC9B,mBAAmB,WAAgB,EACnC,SAAS,GAAE,OAAO,CAAC,YAAY,CAAM,GACpC,YAAY,CAgBd;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE;IACJ,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,uBAAuB,CAAC,EAAE,gBAAgB,CAAC;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,YAAY,CAAC;CAC5D,GACL,YAAY,EAAE,CA4BhB;AAED,kGAAkG;AAClG,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE;IAAE,uBAAuB,CAAC,EAAE,gBAAgB,CAAA;CAAO,GACxD,YAAY,EAAE,CAYhB;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAEhE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,CAU1F;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,eAAe,CAE1E;AAED,mGAAmG;AACnG,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,gBAAgB,mBAAsB,GAAG,UAAU,CAgBpG;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,MAAM,EACrB,gBAAgB,SAAI,GACnB,mBAAmB,CAMrB;AAED,MAAM,WAAW,6BAA6B;IAC5C,qDAAqD;IACrD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,qBAAqB,CAAC,EAAE,gBAAgB,CAAC;IACzC,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,4DAA4D;IAC5D,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC1G;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAiChC;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,eAAe,EAAE,EAC1B,SAAS,EAAE,UAAU,EAAE,EACvB,aAAa,SAAI,GAChB,mBAAmB,CAIrB;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAMnG;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,UAAU,CAKzD;AAED,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,UAAU,EAAE,CAKxG;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAM5F;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAC3B,GAAG,EAAE,GAAG,EACR,eAAe,GAAE,YAAoD,GACpE,SAAS,CAKX;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,eAAe,GAAE,YAAoD,GACpE,SAAS,EAAE,CAKb;AAED,MAAM,WAAW,6BAA6B;IAC5C,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,UAAU,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;CACvE;AAED,kEAAkE;AAClE,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CAsB9B"}
|
|
@@ -77,6 +77,18 @@ export function makeInboxMessages(totalCount, opts = {}) {
|
|
|
77
77
|
/** Creates L1PublishedData with deterministic values based on l1BlockNumber. */ export function makeL1PublishedData(l1BlockNumber) {
|
|
78
78
|
return new L1PublishedData(BigInt(l1BlockNumber), BigInt(l1BlockNumber * 1000), makeBlockHash(l1BlockNumber));
|
|
79
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
|
+
}
|
|
80
92
|
/** Wraps a Checkpoint with L1 published data and random attestations. */ export function makePublishedCheckpoint(checkpoint, l1BlockNumber, attestationCount = 3) {
|
|
81
93
|
return new PublishedCheckpoint(checkpoint, makeL1PublishedData(l1BlockNumber), times(attestationCount, CommitteeAttestation.random));
|
|
82
94
|
}
|
|
@@ -135,13 +147,13 @@ export function makeInboxMessages(totalCount, opts = {}) {
|
|
|
135
147
|
/** Creates a deterministic Tag for public log testing. */ export function makePublicLogTag(blockNumber, txIndex, logIndex) {
|
|
136
148
|
return new Tag(blockNumber === 1 && txIndex === 0 && logIndex === 0 ? Fr.ZERO : new Fr((blockNumber * 100 + txIndex * 10 + logIndex) * 123));
|
|
137
149
|
}
|
|
138
|
-
/** Creates a PublicLog with fields derived from the tag. */ export function makePublicLog(tag, contractAddress = AztecAddress.
|
|
150
|
+
/** Creates a PublicLog with fields derived from the tag. */ export function makePublicLog(tag, contractAddress = AztecAddress.fromNumberUnsafe(543254)) {
|
|
139
151
|
return PublicLog.from({
|
|
140
152
|
contractAddress,
|
|
141
153
|
fields: new Array(10).fill(null).map((_, i)=>!i ? tag.value : new Fr(tag.value.toBigInt() + BigInt(i)))
|
|
142
154
|
});
|
|
143
155
|
}
|
|
144
|
-
/** Creates multiple public logs for a transaction. */ export function makePublicLogs(blockNumber, txIndex, numLogsPerTx, contractAddress = AztecAddress.
|
|
156
|
+
/** Creates multiple public logs for a transaction. */ export function makePublicLogs(blockNumber, txIndex, numLogsPerTx, contractAddress = AztecAddress.fromNumberUnsafe(543254)) {
|
|
145
157
|
return times(numLogsPerTx, (logIndex)=>{
|
|
146
158
|
const tag = makePublicLogTag(blockNumber, txIndex, logIndex);
|
|
147
159
|
return makePublicLog(tag, contractAddress);
|
|
@@ -164,7 +176,7 @@ export function makeInboxMessages(totalCount, opts = {}) {
|
|
|
164
176
|
txEffect.publicLogs = publicLogs ? makePublicLogs(blockNumber, txIndex, publicLogs.numLogsPerTx, publicLogs.contractAddress) : [];
|
|
165
177
|
return txEffect;
|
|
166
178
|
});
|
|
167
|
-
const checkpoint =
|
|
179
|
+
const checkpoint = makeCheckpoint([
|
|
168
180
|
block
|
|
169
181
|
], CheckpointNumber.fromBlockNumber(BlockNumber(blockNumber)));
|
|
170
182
|
return makePublishedCheckpoint(checkpoint, blockNumber);
|