@aztec/archiver 0.0.1-commit.24de95ac → 0.0.1-commit.3469e52

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.
Files changed (206) hide show
  1. package/README.md +147 -22
  2. package/dest/archiver.d.ts +135 -0
  3. package/dest/archiver.d.ts.map +1 -0
  4. package/dest/archiver.js +769 -0
  5. package/dest/config.d.ts +30 -0
  6. package/dest/config.d.ts.map +1 -0
  7. package/dest/{archiver/config.js → config.js} +26 -5
  8. package/dest/errors.d.ts +36 -0
  9. package/dest/errors.d.ts.map +1 -0
  10. package/dest/errors.js +54 -0
  11. package/dest/factory.d.ts +5 -6
  12. package/dest/factory.d.ts.map +1 -1
  13. package/dest/factory.js +85 -7
  14. package/dest/index.d.ts +10 -4
  15. package/dest/index.d.ts.map +1 -1
  16. package/dest/index.js +8 -3
  17. package/dest/interfaces.d.ts +9 -0
  18. package/dest/interfaces.d.ts.map +1 -0
  19. package/dest/interfaces.js +3 -0
  20. package/dest/l1/bin/retrieve-calldata.d.ts +3 -0
  21. package/dest/l1/bin/retrieve-calldata.d.ts.map +1 -0
  22. package/dest/l1/bin/retrieve-calldata.js +149 -0
  23. package/dest/l1/calldata_retriever.d.ts +112 -0
  24. package/dest/l1/calldata_retriever.d.ts.map +1 -0
  25. package/dest/l1/calldata_retriever.js +471 -0
  26. package/dest/l1/data_retrieval.d.ts +88 -0
  27. package/dest/l1/data_retrieval.d.ts.map +1 -0
  28. package/dest/l1/data_retrieval.js +312 -0
  29. package/dest/l1/debug_tx.d.ts +19 -0
  30. package/dest/l1/debug_tx.d.ts.map +1 -0
  31. package/dest/l1/debug_tx.js +73 -0
  32. package/dest/l1/spire_proposer.d.ts +70 -0
  33. package/dest/l1/spire_proposer.d.ts.map +1 -0
  34. package/dest/l1/spire_proposer.js +157 -0
  35. package/dest/l1/trace_tx.d.ts +97 -0
  36. package/dest/l1/trace_tx.d.ts.map +1 -0
  37. package/dest/l1/trace_tx.js +91 -0
  38. package/dest/l1/types.d.ts +12 -0
  39. package/dest/l1/types.d.ts.map +1 -0
  40. package/dest/l1/types.js +3 -0
  41. package/dest/l1/validate_trace.d.ts +29 -0
  42. package/dest/l1/validate_trace.d.ts.map +1 -0
  43. package/dest/l1/validate_trace.js +150 -0
  44. package/dest/modules/data_source_base.d.ts +85 -0
  45. package/dest/modules/data_source_base.d.ts.map +1 -0
  46. package/dest/modules/data_source_base.js +291 -0
  47. package/dest/modules/data_store_updater.d.ts +69 -0
  48. package/dest/modules/data_store_updater.d.ts.map +1 -0
  49. package/dest/modules/data_store_updater.js +304 -0
  50. package/dest/modules/instrumentation.d.ts +37 -0
  51. package/dest/modules/instrumentation.d.ts.map +1 -0
  52. package/dest/{archiver → modules}/instrumentation.js +22 -59
  53. package/dest/modules/l1_synchronizer.d.ts +75 -0
  54. package/dest/modules/l1_synchronizer.d.ts.map +1 -0
  55. package/dest/modules/l1_synchronizer.js +1113 -0
  56. package/dest/modules/validation.d.ts +17 -0
  57. package/dest/modules/validation.d.ts.map +1 -0
  58. package/dest/{archiver → modules}/validation.js +35 -21
  59. package/dest/store/block_store.d.ts +178 -0
  60. package/dest/store/block_store.d.ts.map +1 -0
  61. package/dest/store/block_store.js +680 -0
  62. package/dest/store/contract_class_store.d.ts +18 -0
  63. package/dest/store/contract_class_store.d.ts.map +1 -0
  64. package/dest/{archiver/kv_archiver_store → store}/contract_class_store.js +2 -2
  65. package/dest/store/contract_instance_store.d.ts +24 -0
  66. package/dest/store/contract_instance_store.d.ts.map +1 -0
  67. package/dest/{archiver/kv_archiver_store → store}/contract_instance_store.js +1 -1
  68. package/dest/store/kv_archiver_store.d.ts +336 -0
  69. package/dest/store/kv_archiver_store.d.ts.map +1 -0
  70. package/dest/store/kv_archiver_store.js +443 -0
  71. package/dest/store/log_store.d.ts +54 -0
  72. package/dest/store/log_store.d.ts.map +1 -0
  73. package/dest/store/log_store.js +436 -0
  74. package/dest/store/message_store.d.ts +40 -0
  75. package/dest/store/message_store.d.ts.map +1 -0
  76. package/dest/{archiver/kv_archiver_store → store}/message_store.js +15 -14
  77. package/dest/structs/data_retrieval.d.ts +27 -0
  78. package/dest/structs/data_retrieval.d.ts.map +1 -0
  79. package/dest/structs/inbox_message.d.ts +15 -0
  80. package/dest/structs/inbox_message.d.ts.map +1 -0
  81. package/dest/{archiver/structs → structs}/inbox_message.js +6 -5
  82. package/dest/structs/published.d.ts +2 -0
  83. package/dest/structs/published.d.ts.map +1 -0
  84. package/dest/test/fake_l1_state.d.ts +190 -0
  85. package/dest/test/fake_l1_state.d.ts.map +1 -0
  86. package/dest/test/fake_l1_state.js +383 -0
  87. package/dest/test/index.d.ts +2 -1
  88. package/dest/test/index.d.ts.map +1 -1
  89. package/dest/test/index.js +1 -0
  90. package/dest/test/mock_archiver.d.ts +16 -8
  91. package/dest/test/mock_archiver.d.ts.map +1 -1
  92. package/dest/test/mock_archiver.js +18 -14
  93. package/dest/test/mock_l1_to_l2_message_source.d.ts +7 -6
  94. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
  95. package/dest/test/mock_l1_to_l2_message_source.js +21 -11
  96. package/dest/test/mock_l2_block_source.d.ts +38 -19
  97. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  98. package/dest/test/mock_l2_block_source.js +168 -47
  99. package/dest/test/mock_structs.d.ts +78 -3
  100. package/dest/test/mock_structs.d.ts.map +1 -1
  101. package/dest/test/mock_structs.js +141 -9
  102. package/package.json +19 -20
  103. package/src/archiver.ts +525 -0
  104. package/src/{archiver/config.ts → config.ts} +33 -12
  105. package/src/errors.ts +90 -0
  106. package/src/factory.ts +121 -8
  107. package/src/index.ts +10 -3
  108. package/src/interfaces.ts +9 -0
  109. package/src/l1/README.md +98 -0
  110. package/src/l1/bin/retrieve-calldata.ts +182 -0
  111. package/src/l1/calldata_retriever.ts +641 -0
  112. package/src/l1/data_retrieval.ts +495 -0
  113. package/src/l1/debug_tx.ts +99 -0
  114. package/src/l1/spire_proposer.ts +160 -0
  115. package/src/l1/trace_tx.ts +128 -0
  116. package/src/l1/types.ts +13 -0
  117. package/src/l1/validate_trace.ts +211 -0
  118. package/src/modules/data_source_base.ts +418 -0
  119. package/src/modules/data_store_updater.ts +419 -0
  120. package/src/{archiver → modules}/instrumentation.ts +26 -61
  121. package/src/modules/l1_synchronizer.ts +931 -0
  122. package/src/modules/validation.ts +129 -0
  123. package/src/store/block_store.ts +919 -0
  124. package/src/{archiver/kv_archiver_store → store}/contract_class_store.ts +2 -2
  125. package/src/{archiver/kv_archiver_store → store}/contract_instance_store.ts +2 -2
  126. package/src/store/kv_archiver_store.ts +631 -0
  127. package/src/store/log_store.ts +575 -0
  128. package/src/{archiver/kv_archiver_store → store}/message_store.ts +21 -18
  129. package/src/{archiver/structs → structs}/inbox_message.ts +8 -8
  130. package/src/structs/published.ts +1 -0
  131. package/src/test/fake_l1_state.ts +599 -0
  132. package/src/test/fixtures/debug_traceTransaction-multicall3.json +88 -0
  133. package/src/test/fixtures/debug_traceTransaction-multiplePropose.json +153 -0
  134. package/src/test/fixtures/debug_traceTransaction-proxied.json +122 -0
  135. package/src/test/fixtures/trace_transaction-multicall3.json +65 -0
  136. package/src/test/fixtures/trace_transaction-multiplePropose.json +319 -0
  137. package/src/test/fixtures/trace_transaction-proxied.json +128 -0
  138. package/src/test/fixtures/trace_transaction-randomRevert.json +216 -0
  139. package/src/test/index.ts +1 -0
  140. package/src/test/mock_archiver.ts +22 -16
  141. package/src/test/mock_l1_to_l2_message_source.ts +18 -11
  142. package/src/test/mock_l2_block_source.ts +200 -63
  143. package/src/test/mock_structs.ts +256 -10
  144. package/dest/archiver/archiver.d.ts +0 -277
  145. package/dest/archiver/archiver.d.ts.map +0 -1
  146. package/dest/archiver/archiver.js +0 -1322
  147. package/dest/archiver/archiver_store.d.ts +0 -255
  148. package/dest/archiver/archiver_store.d.ts.map +0 -1
  149. package/dest/archiver/archiver_store.js +0 -4
  150. package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
  151. package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
  152. package/dest/archiver/archiver_store_test_suite.js +0 -1288
  153. package/dest/archiver/config.d.ts +0 -21
  154. package/dest/archiver/config.d.ts.map +0 -1
  155. package/dest/archiver/data_retrieval.d.ts +0 -79
  156. package/dest/archiver/data_retrieval.d.ts.map +0 -1
  157. package/dest/archiver/data_retrieval.js +0 -362
  158. package/dest/archiver/errors.d.ts +0 -12
  159. package/dest/archiver/errors.d.ts.map +0 -1
  160. package/dest/archiver/errors.js +0 -17
  161. package/dest/archiver/index.d.ts +0 -7
  162. package/dest/archiver/index.d.ts.map +0 -1
  163. package/dest/archiver/index.js +0 -4
  164. package/dest/archiver/instrumentation.d.ts +0 -35
  165. package/dest/archiver/instrumentation.d.ts.map +0 -1
  166. package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -124
  167. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
  168. package/dest/archiver/kv_archiver_store/block_store.js +0 -370
  169. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -18
  170. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
  171. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -24
  172. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
  173. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -168
  174. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
  175. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +0 -296
  176. package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -49
  177. package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
  178. package/dest/archiver/kv_archiver_store/log_store.js +0 -336
  179. package/dest/archiver/kv_archiver_store/message_store.d.ts +0 -39
  180. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
  181. package/dest/archiver/structs/data_retrieval.d.ts +0 -27
  182. package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
  183. package/dest/archiver/structs/inbox_message.d.ts +0 -15
  184. package/dest/archiver/structs/inbox_message.d.ts.map +0 -1
  185. package/dest/archiver/structs/published.d.ts +0 -2
  186. package/dest/archiver/structs/published.d.ts.map +0 -1
  187. package/dest/archiver/validation.d.ts +0 -11
  188. package/dest/archiver/validation.d.ts.map +0 -1
  189. package/dest/rpc/index.d.ts +0 -9
  190. package/dest/rpc/index.d.ts.map +0 -1
  191. package/dest/rpc/index.js +0 -15
  192. package/src/archiver/archiver.ts +0 -1722
  193. package/src/archiver/archiver_store.ts +0 -305
  194. package/src/archiver/archiver_store_test_suite.ts +0 -1263
  195. package/src/archiver/data_retrieval.ts +0 -545
  196. package/src/archiver/errors.ts +0 -26
  197. package/src/archiver/index.ts +0 -6
  198. package/src/archiver/kv_archiver_store/block_store.ts +0 -481
  199. package/src/archiver/kv_archiver_store/kv_archiver_store.ts +0 -422
  200. package/src/archiver/kv_archiver_store/log_store.ts +0 -406
  201. package/src/archiver/structs/published.ts +0 -1
  202. package/src/archiver/validation.ts +0 -99
  203. package/src/rpc/index.ts +0 -16
  204. /package/dest/{archiver/structs → structs}/data_retrieval.js +0 -0
  205. /package/dest/{archiver/structs → structs}/published.js +0 -0
  206. /package/src/{archiver/structs → structs}/data_retrieval.ts +0 -0
@@ -1,19 +1,21 @@
1
1
  import { GENESIS_ARCHIVE_ROOT } from '@aztec/constants';
2
- import { DefaultL1ContractsConfig } from '@aztec/ethereum';
2
+ import { DefaultL1ContractsConfig } from '@aztec/ethereum/config';
3
+ import { BlockNumber, CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
3
4
  import { Buffer32 } from '@aztec/foundation/buffer';
5
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
6
  import { EthAddress } from '@aztec/foundation/eth-address';
5
- import { Fr } from '@aztec/foundation/fields';
6
7
  import { createLogger } from '@aztec/foundation/log';
7
8
  import type { FunctionSelector } from '@aztec/stdlib/abi';
8
9
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
9
10
  import {
10
- L2Block,
11
+ CheckpointedL2Block,
11
12
  L2BlockHash,
13
+ L2BlockNew,
12
14
  type L2BlockSource,
13
15
  type L2Tips,
14
- PublishedL2Block,
15
- type ValidateBlockResult,
16
+ type ValidateCheckpointResult,
16
17
  } from '@aztec/stdlib/block';
18
+ import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
17
19
  import type { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
18
20
  import { EmptyL1RollupConstants, type L1RollupConstants, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
19
21
  import { type BlockHeader, TxHash, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
@@ -23,24 +25,25 @@ import type { UInt64 } from '@aztec/stdlib/types';
23
25
  * A mocked implementation of L2BlockSource to be used in tests.
24
26
  */
25
27
  export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
26
- protected l2Blocks: L2Block[] = [];
28
+ protected l2Blocks: L2BlockNew[] = [];
27
29
 
28
30
  private provenBlockNumber: number = 0;
29
31
  private finalizedBlockNumber: number = 0;
32
+ private checkpointedBlockNumber: number = 0;
30
33
 
31
34
  private log = createLogger('archiver:mock_l2_block_source');
32
35
 
33
36
  public async createBlocks(numBlocks: number) {
34
37
  for (let i = 0; i < numBlocks; i++) {
35
38
  const blockNum = this.l2Blocks.length + 1;
36
- const block = await L2Block.random(blockNum);
39
+ const block = await L2BlockNew.random(BlockNumber(blockNum), { slotNumber: SlotNumber(blockNum) });
37
40
  this.l2Blocks.push(block);
38
41
  }
39
42
 
40
43
  this.log.verbose(`Created ${numBlocks} blocks in the mock L2 block source`);
41
44
  }
42
45
 
43
- public addBlocks(blocks: L2Block[]) {
46
+ public addBlocks(blocks: L2BlockNew[]) {
44
47
  this.l2Blocks.push(...blocks);
45
48
  this.log.verbose(`Added ${blocks.length} blocks to the mock L2 block source`);
46
49
  }
@@ -61,6 +64,10 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
61
64
  this.finalizedBlockNumber = finalizedBlockNumber;
62
65
  }
63
66
 
67
+ public setCheckpointedBlockNumber(checkpointedBlockNumber: number) {
68
+ this.checkpointedBlockNumber = checkpointedBlockNumber;
69
+ }
70
+
64
71
  /**
65
72
  * Method to fetch the rollup contract address at the base-layer.
66
73
  * @returns The rollup address.
@@ -82,11 +89,47 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
82
89
  * @returns In this mock instance, returns the number of L2 blocks that we've mocked.
83
90
  */
84
91
  public getBlockNumber() {
85
- return Promise.resolve(this.l2Blocks.length);
92
+ return Promise.resolve(BlockNumber(this.l2Blocks.length));
93
+ }
94
+
95
+ public getProvenBlockNumber() {
96
+ return Promise.resolve(BlockNumber(this.provenBlockNumber));
86
97
  }
87
98
 
88
- public getProvenBlockNumber(): Promise<number> {
89
- return Promise.resolve(this.provenBlockNumber);
99
+ public getCheckpointedBlock(number: BlockNumber): Promise<CheckpointedL2Block | undefined> {
100
+ if (number > this.checkpointedBlockNumber) {
101
+ return Promise.resolve(undefined);
102
+ }
103
+ const block = this.l2Blocks[number - 1];
104
+ if (!block) {
105
+ return Promise.resolve(undefined);
106
+ }
107
+ const checkpointedBlock = new CheckpointedL2Block(
108
+ CheckpointNumber(number),
109
+ block,
110
+ new L1PublishedData(BigInt(number), BigInt(number), `0x${number.toString(16).padStart(64, '0')}`),
111
+ [],
112
+ );
113
+ return Promise.resolve(checkpointedBlock);
114
+ }
115
+
116
+ public async getCheckpointedBlocks(
117
+ from: BlockNumber,
118
+ limit: number,
119
+ _proven?: boolean,
120
+ ): Promise<CheckpointedL2Block[]> {
121
+ const result: CheckpointedL2Block[] = [];
122
+ for (let i = 0; i < limit; i++) {
123
+ const blockNum = from + i;
124
+ if (blockNum > this.checkpointedBlockNumber) {
125
+ break;
126
+ }
127
+ const block = await this.getCheckpointedBlock(BlockNumber(blockNum));
128
+ if (block) {
129
+ result.push(block);
130
+ }
131
+ }
132
+ return result;
90
133
  }
91
134
 
92
135
  /**
@@ -94,8 +137,19 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
94
137
  * @param number - The block number to return (inclusive).
95
138
  * @returns The requested L2 block.
96
139
  */
97
- public getBlock(number: number) {
98
- return Promise.resolve(this.l2Blocks[number - 1]);
140
+ public getBlock(number: number): Promise<L2BlockNew | undefined> {
141
+ const block = this.l2Blocks[number - 1];
142
+ return Promise.resolve(block);
143
+ }
144
+
145
+ /**
146
+ * Gets an L2 block (new format).
147
+ * @param number - The block number to return.
148
+ * @returns The requested L2 block.
149
+ */
150
+ public getL2BlockNew(number: BlockNumber): Promise<L2BlockNew | undefined> {
151
+ const block = this.l2Blocks[number - 1];
152
+ return Promise.resolve(block);
99
153
  }
100
154
 
101
155
  /**
@@ -104,7 +158,7 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
104
158
  * @param limit - The maximum number of blocks to return.
105
159
  * @returns The requested mocked L2 blocks.
106
160
  */
107
- public getBlocks(from: number, limit: number, proven?: boolean) {
161
+ public getBlocks(from: number, limit: number, proven?: boolean): Promise<L2BlockNew[]> {
108
162
  return Promise.resolve(
109
163
  this.l2Blocks
110
164
  .slice(from - 1, from - 1 + limit)
@@ -112,32 +166,64 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
112
166
  );
113
167
  }
114
168
 
115
- public async getPublishedBlocks(from: number, limit: number, proven?: boolean) {
116
- const blocks = await this.getBlocks(from, limit, proven);
117
- return blocks.map(block =>
118
- PublishedL2Block.fromFields({
119
- block,
120
- l1: {
121
- blockNumber: BigInt(block.number),
122
- blockHash: Buffer32.random().toString(),
123
- timestamp: BigInt(block.number),
124
- },
125
- attestations: [],
169
+ public getPublishedCheckpoints(from: CheckpointNumber, limit: number) {
170
+ // TODO(mbps): Implement this properly. This only works when we have one block per checkpoint.
171
+ const blocks = this.l2Blocks.slice(from - 1, from - 1 + limit);
172
+ return Promise.all(
173
+ blocks.map(async block => {
174
+ // Create a checkpoint from the block - manually construct since L2BlockNew doesn't have toCheckpoint()
175
+ const checkpoint = await Checkpoint.random(block.checkpointNumber, { numBlocks: 1 });
176
+ checkpoint.blocks = [block];
177
+ return new PublishedCheckpoint(
178
+ checkpoint,
179
+ new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
180
+ [],
181
+ );
126
182
  }),
127
183
  );
128
184
  }
129
185
 
130
- public async getPublishedBlockByHash(blockHash: Fr): Promise<PublishedL2Block | undefined> {
186
+ public async getCheckpointByArchive(archive: Fr): Promise<Checkpoint | undefined> {
187
+ // TODO(mbps): Implement this properly. This only works when we have one block per checkpoint.
188
+ const block = this.l2Blocks.find(b => b.archive.root.equals(archive));
189
+ if (!block) {
190
+ return undefined;
191
+ }
192
+ // Create a checkpoint from the block - manually construct since L2BlockNew doesn't have toCheckpoint()
193
+ const checkpoint = await Checkpoint.random(block.checkpointNumber, { numBlocks: 1 });
194
+ checkpoint.blocks = [block];
195
+ return checkpoint;
196
+ }
197
+
198
+ public getPublishedBlocks(from: number, limit: number, proven?: boolean): Promise<CheckpointedL2Block[]> {
199
+ const blocks = this.l2Blocks
200
+ .slice(from - 1, from - 1 + limit)
201
+ .filter(b => !proven || this.provenBlockNumber === undefined || b.number <= this.provenBlockNumber);
202
+ return Promise.resolve(
203
+ blocks.map(block =>
204
+ CheckpointedL2Block.fromFields({
205
+ checkpointNumber: CheckpointNumber(block.number),
206
+ block,
207
+ l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
208
+ attestations: [],
209
+ }),
210
+ ),
211
+ );
212
+ }
213
+
214
+ getL2BlocksNew(from: BlockNumber, limit: number, proven?: boolean): Promise<L2BlockNew[]> {
215
+ // getBlocks already returns L2BlockNew[], so just return directly
216
+ return this.getBlocks(from, limit, proven);
217
+ }
218
+
219
+ public async getPublishedBlockByHash(blockHash: Fr): Promise<CheckpointedL2Block | undefined> {
131
220
  for (const block of this.l2Blocks) {
132
221
  const hash = await block.hash();
133
222
  if (hash.equals(blockHash)) {
134
- return PublishedL2Block.fromFields({
223
+ return CheckpointedL2Block.fromFields({
224
+ checkpointNumber: CheckpointNumber(block.number),
135
225
  block,
136
- l1: {
137
- blockNumber: BigInt(block.number),
138
- blockHash: Buffer32.random().toString(),
139
- timestamp: BigInt(block.number),
140
- },
226
+ l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
141
227
  attestations: [],
142
228
  });
143
229
  }
@@ -145,29 +231,41 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
145
231
  return undefined;
146
232
  }
147
233
 
148
- public getPublishedBlockByArchive(archive: Fr): Promise<PublishedL2Block | undefined> {
234
+ public getPublishedBlockByArchive(archive: Fr): Promise<CheckpointedL2Block | undefined> {
149
235
  const block = this.l2Blocks.find(b => b.archive.root.equals(archive));
150
236
  if (!block) {
151
237
  return Promise.resolve(undefined);
152
238
  }
153
239
  return Promise.resolve(
154
- PublishedL2Block.fromFields({
240
+ CheckpointedL2Block.fromFields({
241
+ checkpointNumber: CheckpointNumber(block.number),
155
242
  block,
156
- l1: {
157
- blockNumber: BigInt(block.number),
158
- blockHash: Buffer32.random().toString(),
159
- timestamp: BigInt(block.number),
160
- },
243
+ l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
161
244
  attestations: [],
162
245
  }),
163
246
  );
164
247
  }
165
248
 
249
+ public async getL2BlockNewByHash(blockHash: Fr): Promise<L2BlockNew | undefined> {
250
+ for (const block of this.l2Blocks) {
251
+ const hash = await block.hash();
252
+ if (hash.equals(blockHash)) {
253
+ return block;
254
+ }
255
+ }
256
+ return undefined;
257
+ }
258
+
259
+ public getL2BlockNewByArchive(archive: Fr): Promise<L2BlockNew | undefined> {
260
+ const block = this.l2Blocks.find(b => b.archive.root.equals(archive));
261
+ return Promise.resolve(block);
262
+ }
263
+
166
264
  public async getBlockHeaderByHash(blockHash: Fr): Promise<BlockHeader | undefined> {
167
265
  for (const block of this.l2Blocks) {
168
266
  const hash = await block.hash();
169
267
  if (hash.equals(blockHash)) {
170
- return block.getBlockHeader();
268
+ return block.header;
171
269
  }
172
270
  }
173
271
  return undefined;
@@ -175,26 +273,49 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
175
273
 
176
274
  public getBlockHeaderByArchive(archive: Fr): Promise<BlockHeader | undefined> {
177
275
  const block = this.l2Blocks.find(b => b.archive.root.equals(archive));
178
- return Promise.resolve(block?.getBlockHeader());
276
+ return Promise.resolve(block?.header);
179
277
  }
180
278
 
181
279
  getBlockHeader(number: number | 'latest'): Promise<BlockHeader | undefined> {
182
- return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.getBlockHeader());
280
+ return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.header);
183
281
  }
184
282
 
185
- getBlocksForEpoch(epochNumber: bigint): Promise<L2Block[]> {
283
+ getCheckpointsForEpoch(epochNumber: EpochNumber): Promise<Checkpoint[]> {
284
+ // TODO(mbps): Implement this properly. This only works when we have one block per checkpoint.
186
285
  const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
187
286
  const [start, end] = getSlotRangeForEpoch(epochNumber, { epochDuration });
188
287
  const blocks = this.l2Blocks.filter(b => {
189
- const slot = b.header.globalVariables.slotNumber.toBigInt();
288
+ const slot = b.header.globalVariables.slotNumber;
190
289
  return slot >= start && slot <= end;
191
290
  });
291
+ // Create checkpoints from blocks - manually construct since L2BlockNew doesn't have toCheckpoint()
292
+ return Promise.all(
293
+ blocks.map(async block => {
294
+ const checkpoint = await Checkpoint.random(block.checkpointNumber, { numBlocks: 1 });
295
+ checkpoint.blocks = [block];
296
+ return checkpoint;
297
+ }),
298
+ );
299
+ }
300
+
301
+ getBlocksForEpoch(epochNumber: EpochNumber): Promise<L2BlockNew[]> {
302
+ const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
303
+ const [start, end] = getSlotRangeForEpoch(epochNumber, { epochDuration });
304
+ const blocks = this.l2Blocks.filter(b => {
305
+ const slot = b.header.globalVariables.slotNumber;
306
+ return slot >= start && slot <= end;
307
+ });
308
+ return Promise.resolve(blocks);
309
+ }
310
+
311
+ getBlocksForSlot(slotNumber: SlotNumber): Promise<L2BlockNew[]> {
312
+ const blocks = this.l2Blocks.filter(b => b.header.globalVariables.slotNumber === slotNumber);
192
313
  return Promise.resolve(blocks);
193
314
  }
194
315
 
195
- async getBlockHeadersForEpoch(epochNumber: bigint): Promise<BlockHeader[]> {
316
+ async getBlockHeadersForEpoch(epochNumber: EpochNumber): Promise<BlockHeader[]> {
196
317
  const blocks = await this.getBlocksForEpoch(epochNumber);
197
- return blocks.map(b => b.getBlockHeader());
318
+ return blocks.map(b => b.header);
198
319
  }
199
320
 
200
321
  /**
@@ -242,41 +363,57 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
242
363
  }
243
364
 
244
365
  async getL2Tips(): Promise<L2Tips> {
245
- const [latest, proven, finalized] = [
366
+ const [latest, proven, finalized, checkpointed] = [
246
367
  await this.getBlockNumber(),
247
368
  await this.getProvenBlockNumber(),
248
369
  this.finalizedBlockNumber,
370
+ this.checkpointedBlockNumber,
249
371
  ] as const;
250
372
 
251
373
  const latestBlock = this.l2Blocks[latest - 1];
252
374
  const provenBlock = this.l2Blocks[proven - 1];
253
375
  const finalizedBlock = this.l2Blocks[finalized - 1];
376
+ const checkpointedBlock = this.l2Blocks[checkpointed - 1];
377
+
378
+ const latestBlockId = {
379
+ number: BlockNumber(latest),
380
+ hash: (await latestBlock?.hash())?.toString(),
381
+ };
382
+ const provenBlockId = {
383
+ number: BlockNumber(proven),
384
+ hash: (await provenBlock?.hash())?.toString(),
385
+ };
386
+ const finalizedBlockId = {
387
+ number: BlockNumber(finalized),
388
+ hash: (await finalizedBlock?.hash())?.toString(),
389
+ };
390
+ const checkpointedBlockId = {
391
+ number: BlockNumber(checkpointed),
392
+ hash: (await checkpointedBlock?.hash())?.toString(),
393
+ };
394
+
395
+ const makeTipId = (blockId: typeof latestBlockId) => ({
396
+ block: blockId,
397
+ checkpoint: { number: CheckpointNumber(blockId.number), hash: blockId.hash },
398
+ });
254
399
 
255
400
  return {
256
- latest: {
257
- number: latest,
258
- hash: (await latestBlock?.hash())?.toString(),
259
- },
260
- proven: {
261
- number: proven,
262
- hash: (await provenBlock?.hash())?.toString(),
263
- },
264
- finalized: {
265
- number: finalized,
266
- hash: (await finalizedBlock?.hash())?.toString(),
267
- },
401
+ proposed: latestBlockId,
402
+ checkpointed: makeTipId(checkpointedBlockId),
403
+ proven: makeTipId(provenBlockId),
404
+ finalized: makeTipId(finalizedBlockId),
268
405
  };
269
406
  }
270
407
 
271
- getL2EpochNumber(): Promise<bigint> {
408
+ getL2EpochNumber(): Promise<EpochNumber> {
272
409
  throw new Error('Method not implemented.');
273
410
  }
274
411
 
275
- getL2SlotNumber(): Promise<bigint> {
412
+ getL2SlotNumber(): Promise<SlotNumber> {
276
413
  throw new Error('Method not implemented.');
277
414
  }
278
415
 
279
- isEpochComplete(_epochNumber: bigint): Promise<boolean> {
416
+ isEpochComplete(_epochNumber: EpochNumber): Promise<boolean> {
280
417
  throw new Error('Method not implemented.');
281
418
  }
282
419
 
@@ -342,7 +479,7 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
342
479
  return Promise.resolve(false);
343
480
  }
344
481
 
345
- getPendingChainValidationStatus(): Promise<ValidateBlockResult> {
482
+ getPendingChainValidationStatus(): Promise<ValidateCheckpointResult> {
346
483
  return Promise.resolve({ valid: true });
347
484
  }
348
485
  }