@aztec/archiver 0.0.0-test.1 → 0.0.1-commit.1142ef1

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 (151) hide show
  1. package/README.md +27 -6
  2. package/dest/archiver/archiver.d.ts +204 -94
  3. package/dest/archiver/archiver.d.ts.map +1 -1
  4. package/dest/archiver/archiver.js +1616 -414
  5. package/dest/archiver/archiver_store.d.ts +178 -83
  6. package/dest/archiver/archiver_store.d.ts.map +1 -1
  7. package/dest/archiver/archiver_store_test_suite.d.ts +1 -1
  8. package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -1
  9. package/dest/archiver/archiver_store_test_suite.js +2373 -397
  10. package/dest/archiver/config.d.ts +7 -22
  11. package/dest/archiver/config.d.ts.map +1 -1
  12. package/dest/archiver/config.js +30 -14
  13. package/dest/archiver/errors.d.ts +33 -1
  14. package/dest/archiver/errors.d.ts.map +1 -1
  15. package/dest/archiver/errors.js +49 -0
  16. package/dest/archiver/index.d.ts +3 -4
  17. package/dest/archiver/index.d.ts.map +1 -1
  18. package/dest/archiver/index.js +1 -2
  19. package/dest/archiver/instrumentation.d.ts +14 -6
  20. package/dest/archiver/instrumentation.d.ts.map +1 -1
  21. package/dest/archiver/instrumentation.js +45 -41
  22. package/dest/archiver/kv_archiver_store/block_store.d.ts +98 -21
  23. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -1
  24. package/dest/archiver/kv_archiver_store/block_store.js +495 -86
  25. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +4 -4
  26. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +1 -1
  27. package/dest/archiver/kv_archiver_store/contract_class_store.js +13 -19
  28. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +12 -9
  29. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +1 -1
  30. package/dest/archiver/kv_archiver_store/contract_instance_store.js +30 -16
  31. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +81 -75
  32. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
  33. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +145 -83
  34. package/dest/archiver/kv_archiver_store/log_store.d.ts +12 -16
  35. package/dest/archiver/kv_archiver_store/log_store.d.ts.map +1 -1
  36. package/dest/archiver/kv_archiver_store/log_store.js +151 -114
  37. package/dest/archiver/kv_archiver_store/message_store.d.ts +25 -18
  38. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +1 -1
  39. package/dest/archiver/kv_archiver_store/message_store.js +152 -49
  40. package/dest/archiver/l1/bin/retrieve-calldata.d.ts +3 -0
  41. package/dest/archiver/l1/bin/retrieve-calldata.d.ts.map +1 -0
  42. package/dest/archiver/l1/bin/retrieve-calldata.js +149 -0
  43. package/dest/archiver/l1/calldata_retriever.d.ts +112 -0
  44. package/dest/archiver/l1/calldata_retriever.d.ts.map +1 -0
  45. package/dest/archiver/l1/calldata_retriever.js +471 -0
  46. package/dest/archiver/l1/data_retrieval.d.ts +90 -0
  47. package/dest/archiver/l1/data_retrieval.d.ts.map +1 -0
  48. package/dest/archiver/l1/data_retrieval.js +331 -0
  49. package/dest/archiver/l1/debug_tx.d.ts +19 -0
  50. package/dest/archiver/l1/debug_tx.d.ts.map +1 -0
  51. package/dest/archiver/l1/debug_tx.js +73 -0
  52. package/dest/archiver/l1/spire_proposer.d.ts +70 -0
  53. package/dest/archiver/l1/spire_proposer.d.ts.map +1 -0
  54. package/dest/archiver/l1/spire_proposer.js +157 -0
  55. package/dest/archiver/l1/trace_tx.d.ts +97 -0
  56. package/dest/archiver/l1/trace_tx.d.ts.map +1 -0
  57. package/dest/archiver/l1/trace_tx.js +91 -0
  58. package/dest/archiver/l1/types.d.ts +12 -0
  59. package/dest/archiver/l1/types.d.ts.map +1 -0
  60. package/dest/archiver/l1/types.js +3 -0
  61. package/dest/archiver/l1/validate_trace.d.ts +29 -0
  62. package/dest/archiver/l1/validate_trace.d.ts.map +1 -0
  63. package/dest/archiver/l1/validate_trace.js +150 -0
  64. package/dest/archiver/structs/data_retrieval.d.ts +1 -1
  65. package/dest/archiver/structs/inbox_message.d.ts +15 -0
  66. package/dest/archiver/structs/inbox_message.d.ts.map +1 -0
  67. package/dest/archiver/structs/inbox_message.js +39 -0
  68. package/dest/archiver/structs/published.d.ts +2 -11
  69. package/dest/archiver/structs/published.d.ts.map +1 -1
  70. package/dest/archiver/structs/published.js +1 -1
  71. package/dest/archiver/validation.d.ts +17 -0
  72. package/dest/archiver/validation.d.ts.map +1 -0
  73. package/dest/archiver/validation.js +98 -0
  74. package/dest/factory.d.ts +9 -14
  75. package/dest/factory.d.ts.map +1 -1
  76. package/dest/factory.js +22 -52
  77. package/dest/index.d.ts +2 -2
  78. package/dest/index.d.ts.map +1 -1
  79. package/dest/index.js +1 -1
  80. package/dest/rpc/index.d.ts +2 -3
  81. package/dest/rpc/index.d.ts.map +1 -1
  82. package/dest/rpc/index.js +1 -4
  83. package/dest/test/index.d.ts +1 -1
  84. package/dest/test/mock_archiver.d.ts +16 -8
  85. package/dest/test/mock_archiver.d.ts.map +1 -1
  86. package/dest/test/mock_archiver.js +19 -14
  87. package/dest/test/mock_l1_to_l2_message_source.d.ts +9 -6
  88. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
  89. package/dest/test/mock_l1_to_l2_message_source.js +30 -7
  90. package/dest/test/mock_l2_block_source.d.ts +56 -13
  91. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  92. package/dest/test/mock_l2_block_source.js +196 -25
  93. package/dest/test/mock_structs.d.ts +10 -0
  94. package/dest/test/mock_structs.d.ts.map +1 -0
  95. package/dest/test/mock_structs.js +38 -0
  96. package/package.json +29 -30
  97. package/src/archiver/archiver.ts +1596 -512
  98. package/src/archiver/archiver_store.ts +205 -88
  99. package/src/archiver/archiver_store_test_suite.ts +2386 -354
  100. package/src/archiver/config.ts +38 -46
  101. package/src/archiver/errors.ts +85 -0
  102. package/src/archiver/index.ts +2 -3
  103. package/src/archiver/instrumentation.ts +65 -45
  104. package/src/archiver/kv_archiver_store/block_store.ts +668 -101
  105. package/src/archiver/kv_archiver_store/contract_class_store.ts +14 -24
  106. package/src/archiver/kv_archiver_store/contract_instance_store.ts +36 -28
  107. package/src/archiver/kv_archiver_store/kv_archiver_store.ts +197 -113
  108. package/src/archiver/kv_archiver_store/log_store.ts +204 -132
  109. package/src/archiver/kv_archiver_store/message_store.ts +213 -54
  110. package/src/archiver/l1/README.md +98 -0
  111. package/src/archiver/l1/bin/retrieve-calldata.ts +182 -0
  112. package/src/archiver/l1/calldata_retriever.ts +641 -0
  113. package/src/archiver/l1/data_retrieval.ts +512 -0
  114. package/src/archiver/l1/debug_tx.ts +99 -0
  115. package/src/archiver/l1/spire_proposer.ts +160 -0
  116. package/src/archiver/l1/trace_tx.ts +128 -0
  117. package/src/archiver/l1/types.ts +13 -0
  118. package/src/archiver/l1/validate_trace.ts +211 -0
  119. package/src/archiver/structs/inbox_message.ts +41 -0
  120. package/src/archiver/structs/published.ts +1 -11
  121. package/src/archiver/validation.ts +124 -0
  122. package/src/factory.ts +28 -69
  123. package/src/index.ts +1 -1
  124. package/src/rpc/index.ts +1 -5
  125. package/src/test/fixtures/debug_traceTransaction-multicall3.json +88 -0
  126. package/src/test/fixtures/debug_traceTransaction-multiplePropose.json +153 -0
  127. package/src/test/fixtures/debug_traceTransaction-proxied.json +122 -0
  128. package/src/test/fixtures/trace_transaction-multicall3.json +65 -0
  129. package/src/test/fixtures/trace_transaction-multiplePropose.json +319 -0
  130. package/src/test/fixtures/trace_transaction-proxied.json +128 -0
  131. package/src/test/fixtures/trace_transaction-randomRevert.json +216 -0
  132. package/src/test/mock_archiver.ts +22 -16
  133. package/src/test/mock_l1_to_l2_message_source.ts +26 -8
  134. package/src/test/mock_l2_block_source.ts +254 -31
  135. package/src/test/mock_structs.ts +50 -0
  136. package/dest/archiver/data_retrieval.d.ts +0 -74
  137. package/dest/archiver/data_retrieval.d.ts.map +0 -1
  138. package/dest/archiver/data_retrieval.js +0 -283
  139. package/dest/archiver/kv_archiver_store/nullifier_store.d.ts +0 -12
  140. package/dest/archiver/kv_archiver_store/nullifier_store.d.ts.map +0 -1
  141. package/dest/archiver/kv_archiver_store/nullifier_store.js +0 -73
  142. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts +0 -23
  143. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +0 -1
  144. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +0 -49
  145. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +0 -175
  146. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +0 -1
  147. package/dest/archiver/memory_archiver_store/memory_archiver_store.js +0 -636
  148. package/src/archiver/data_retrieval.ts +0 -422
  149. package/src/archiver/kv_archiver_store/nullifier_store.ts +0 -97
  150. package/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts +0 -61
  151. package/src/archiver/memory_archiver_store/memory_archiver_store.ts +0 -801
@@ -1,69 +1,105 @@
1
- import type { Fr } from '@aztec/foundation/fields';
1
+ import type { L1BlockId } from '@aztec/ethereum/l1-types';
2
+ import type { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
3
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
4
  import { toArray } from '@aztec/foundation/iterable';
3
5
  import { createLogger } from '@aztec/foundation/log';
4
- import type { AztecAsyncKVStore, StoreSize } from '@aztec/kv-store';
6
+ import type { AztecAsyncKVStore, CustomRange, StoreSize } from '@aztec/kv-store';
5
7
  import { FunctionSelector } from '@aztec/stdlib/abi';
6
8
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
7
- import type { InBlock, L2Block } from '@aztec/stdlib/block';
9
+ import { CheckpointedL2Block, L2BlockHash, L2BlockNew, type ValidateCheckpointResult } from '@aztec/stdlib/block';
10
+ import type { PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
8
11
  import type {
9
12
  ContractClassPublic,
13
+ ContractDataSource,
10
14
  ContractInstanceUpdateWithAddress,
11
15
  ContractInstanceWithAddress,
12
16
  ExecutablePrivateFunctionWithMembershipProof,
13
- UnconstrainedFunctionWithMembershipProof,
17
+ UtilityFunctionWithMembershipProof,
14
18
  } from '@aztec/stdlib/contract';
15
19
  import type { GetContractClassLogsResponse, GetPublicLogsResponse } from '@aztec/stdlib/interfaces/client';
16
- import { type LogFilter, PrivateLog, type TxScopedL2Log } from '@aztec/stdlib/logs';
17
- import type { InboxLeaf } from '@aztec/stdlib/messaging';
20
+ import type { LogFilter, SiloedTag, Tag, TxScopedL2Log } from '@aztec/stdlib/logs';
18
21
  import type { BlockHeader, TxHash, TxReceipt } from '@aztec/stdlib/tx';
22
+ import type { UInt64 } from '@aztec/stdlib/types';
23
+
24
+ import { join } from 'path';
19
25
 
20
26
  import type { ArchiverDataStore, ArchiverL1SynchPoint } from '../archiver_store.js';
21
- import type { DataRetrieval } from '../structs/data_retrieval.js';
22
- import type { L1Published } from '../structs/published.js';
23
- import { BlockStore } from './block_store.js';
27
+ import type { InboxMessage } from '../structs/inbox_message.js';
28
+ import { BlockStore, type CheckpointData } from './block_store.js';
24
29
  import { ContractClassStore } from './contract_class_store.js';
25
30
  import { ContractInstanceStore } from './contract_instance_store.js';
26
31
  import { LogStore } from './log_store.js';
27
32
  import { MessageStore } from './message_store.js';
28
- import { NullifierStore } from './nullifier_store.js';
33
+
34
+ export const ARCHIVER_DB_VERSION = 5;
35
+ export const MAX_FUNCTION_SIGNATURES = 1000;
36
+ export const MAX_FUNCTION_NAME_LEN = 256;
29
37
 
30
38
  /**
31
39
  * LMDB implementation of the ArchiverDataStore interface.
32
40
  */
33
- export class KVArchiverDataStore implements ArchiverDataStore {
34
- public static readonly SCHEMA_VERSION = 1;
41
+ export class KVArchiverDataStore implements ArchiverDataStore, ContractDataSource {
42
+ public static readonly SCHEMA_VERSION = ARCHIVER_DB_VERSION;
35
43
 
36
44
  #blockStore: BlockStore;
37
45
  #logStore: LogStore;
38
- #nullifierStore: NullifierStore;
39
46
  #messageStore: MessageStore;
40
47
  #contractClassStore: ContractClassStore;
41
48
  #contractInstanceStore: ContractInstanceStore;
49
+
42
50
  private functionNames = new Map<string, string>();
43
51
 
44
52
  #log = createLogger('archiver:data-store');
45
53
 
46
- constructor(private db: AztecAsyncKVStore, logsMaxPageSize: number = 1000) {
54
+ constructor(
55
+ private db: AztecAsyncKVStore,
56
+ logsMaxPageSize: number = 1000,
57
+ ) {
47
58
  this.#blockStore = new BlockStore(db);
48
59
  this.#logStore = new LogStore(db, this.#blockStore, logsMaxPageSize);
49
60
  this.#messageStore = new MessageStore(db);
50
61
  this.#contractClassStore = new ContractClassStore(db);
51
62
  this.#contractInstanceStore = new ContractInstanceStore(db);
52
- this.#nullifierStore = new NullifierStore(db);
53
63
  }
54
64
 
55
- // TODO: These function names are in memory only as they are for development/debugging. They require the full contract
56
- // artifact supplied to the node out of band. This should be reviewed and potentially removed as part of
57
- // the node api cleanup process.
58
- getContractFunctionName(_address: AztecAddress, selector: FunctionSelector): Promise<string | undefined> {
65
+ public transactionAsync<T>(callback: () => Promise<T>): Promise<T> {
66
+ return this.db.transactionAsync(callback);
67
+ }
68
+
69
+ public getBlockNumber(): Promise<BlockNumber> {
70
+ return this.#blockStore.getLatestL2BlockNumber();
71
+ }
72
+
73
+ public async getContract(
74
+ address: AztecAddress,
75
+ maybeTimestamp?: UInt64,
76
+ ): Promise<ContractInstanceWithAddress | undefined> {
77
+ const [header] = await this.getBlockHeaders(await this.getBlockNumber(), 1);
78
+ const timestamp = maybeTimestamp ?? header!.globalVariables.timestamp;
79
+ return this.getContractInstance(address, timestamp);
80
+ }
81
+
82
+ public async backupTo(path: string, compress = true): Promise<string> {
83
+ await this.db.backupTo(path, compress);
84
+ return join(path, 'data.mdb');
85
+ }
86
+
87
+ public close() {
88
+ return this.db.close();
89
+ }
90
+
91
+ getDebugFunctionName(_address: AztecAddress, selector: FunctionSelector): Promise<string | undefined> {
59
92
  return Promise.resolve(this.functionNames.get(selector.toString()));
60
93
  }
61
94
 
62
- async registerContractFunctionSignatures(_address: AztecAddress, signatures: string[]): Promise<void> {
95
+ async registerContractFunctionSignatures(signatures: string[]): Promise<void> {
63
96
  for (const sig of signatures) {
97
+ if (this.functionNames.size > MAX_FUNCTION_SIGNATURES) {
98
+ return;
99
+ }
64
100
  try {
65
101
  const selector = await FunctionSelector.fromSignature(sig);
66
- this.functionNames.set(selector.toString(), sig.slice(0, sig.indexOf('(')));
102
+ this.functionNames.set(selector.toString(), sig.slice(0, sig.indexOf('(')).slice(0, MAX_FUNCTION_NAME_LEN));
67
103
  } catch {
68
104
  this.#log.warn(`Failed to parse signature: ${sig}. Ignoring`);
69
105
  }
@@ -78,15 +114,18 @@ export class KVArchiverDataStore implements ArchiverDataStore {
78
114
  return this.#contractClassStore.getContractClassIds();
79
115
  }
80
116
 
81
- async getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
82
- const contract = this.#contractInstanceStore.getContractInstance(address, await this.getSynchedL2BlockNumber());
83
- return contract;
117
+ getContractInstance(address: AztecAddress, timestamp: UInt64): Promise<ContractInstanceWithAddress | undefined> {
118
+ return this.#contractInstanceStore.getContractInstance(address, timestamp);
119
+ }
120
+
121
+ getContractInstanceDeploymentBlockNumber(address: AztecAddress): Promise<number | undefined> {
122
+ return this.#contractInstanceStore.getContractInstanceDeploymentBlockNumber(address);
84
123
  }
85
124
 
86
125
  async addContractClasses(
87
126
  data: ContractClassPublic[],
88
127
  bytecodeCommitments: Fr[],
89
- blockNumber: number,
128
+ blockNumber: BlockNumber,
90
129
  ): Promise<boolean> {
91
130
  return (
92
131
  await Promise.all(
@@ -95,7 +134,7 @@ export class KVArchiverDataStore implements ArchiverDataStore {
95
134
  ).every(Boolean);
96
135
  }
97
136
 
98
- async deleteContractClasses(data: ContractClassPublic[], blockNumber: number): Promise<boolean> {
137
+ async deleteContractClasses(data: ContractClassPublic[], blockNumber: BlockNumber): Promise<boolean> {
99
138
  return (await Promise.all(data.map(c => this.#contractClassStore.deleteContractClasses(c, blockNumber)))).every(
100
139
  Boolean,
101
140
  );
@@ -108,36 +147,35 @@ export class KVArchiverDataStore implements ArchiverDataStore {
108
147
  addFunctions(
109
148
  contractClassId: Fr,
110
149
  privateFunctions: ExecutablePrivateFunctionWithMembershipProof[],
111
- unconstrainedFunctions: UnconstrainedFunctionWithMembershipProof[],
150
+ utilityFunctions: UtilityFunctionWithMembershipProof[],
112
151
  ): Promise<boolean> {
113
- return this.#contractClassStore.addFunctions(contractClassId, privateFunctions, unconstrainedFunctions);
152
+ return this.#contractClassStore.addFunctions(contractClassId, privateFunctions, utilityFunctions);
114
153
  }
115
154
 
116
- async addContractInstances(data: ContractInstanceWithAddress[], _blockNumber: number): Promise<boolean> {
117
- return (await Promise.all(data.map(c => this.#contractInstanceStore.addContractInstance(c)))).every(Boolean);
155
+ async addContractInstances(data: ContractInstanceWithAddress[], blockNumber: BlockNumber): Promise<boolean> {
156
+ return (await Promise.all(data.map(c => this.#contractInstanceStore.addContractInstance(c, blockNumber)))).every(
157
+ Boolean,
158
+ );
118
159
  }
119
160
 
120
- async deleteContractInstances(data: ContractInstanceWithAddress[], _blockNumber: number): Promise<boolean> {
161
+ async deleteContractInstances(data: ContractInstanceWithAddress[], _blockNumber: BlockNumber): Promise<boolean> {
121
162
  return (await Promise.all(data.map(c => this.#contractInstanceStore.deleteContractInstance(c)))).every(Boolean);
122
163
  }
123
164
 
124
- async addContractInstanceUpdates(data: ContractInstanceUpdateWithAddress[], blockNumber: number): Promise<boolean> {
165
+ async addContractInstanceUpdates(data: ContractInstanceUpdateWithAddress[], timestamp: UInt64): Promise<boolean> {
125
166
  return (
126
167
  await Promise.all(
127
168
  data.map((update, logIndex) =>
128
- this.#contractInstanceStore.addContractInstanceUpdate(update, blockNumber, logIndex),
169
+ this.#contractInstanceStore.addContractInstanceUpdate(update, timestamp, logIndex),
129
170
  ),
130
171
  )
131
172
  ).every(Boolean);
132
173
  }
133
- async deleteContractInstanceUpdates(
134
- data: ContractInstanceUpdateWithAddress[],
135
- blockNumber: number,
136
- ): Promise<boolean> {
174
+ async deleteContractInstanceUpdates(data: ContractInstanceUpdateWithAddress[], timestamp: UInt64): Promise<boolean> {
137
175
  return (
138
176
  await Promise.all(
139
177
  data.map((update, logIndex) =>
140
- this.#contractInstanceStore.deleteContractInstanceUpdate(update, blockNumber, logIndex),
178
+ this.#contractInstanceStore.deleteContractInstanceUpdate(update, timestamp, logIndex),
141
179
  ),
142
180
  )
143
181
  ).every(Boolean);
@@ -148,30 +186,56 @@ export class KVArchiverDataStore implements ArchiverDataStore {
148
186
  * @param blocks - The L2 blocks to be added to the store and the last processed L1 block.
149
187
  * @returns True if the operation is successful.
150
188
  */
151
- addBlocks(blocks: L1Published<L2Block>[]): Promise<boolean> {
152
- return this.#blockStore.addBlocks(blocks);
189
+ addBlocks(blocks: L2BlockNew[], opts: { force?: boolean; checkpointNumber?: number } = {}): Promise<boolean> {
190
+ return this.#blockStore.addBlocks(blocks, opts);
191
+ }
192
+
193
+ getRangeOfCheckpoints(from: CheckpointNumber, limit: number): Promise<CheckpointData[]> {
194
+ return this.#blockStore.getRangeOfCheckpoints(from, limit);
195
+ }
196
+ getLatestBlockNumber(): Promise<BlockNumber> {
197
+ return this.#blockStore.getLatestBlockNumber();
153
198
  }
154
199
 
155
200
  /**
156
- * Unwinds blocks from the database
201
+ * Unwinds checkpoints from the database
157
202
  * @param from - The tip of the chain, passed for verification purposes,
158
203
  * ensuring that we don't end up deleting something we did not intend
159
- * @param blocksToUnwind - The number of blocks we are to unwind
204
+ * @param checkpointsToUnwind - The number of checkpoints we are to unwind
160
205
  * @returns True if the operation is successful
161
206
  */
162
- unwindBlocks(from: number, blocksToUnwind: number): Promise<boolean> {
163
- return this.#blockStore.unwindBlocks(from, blocksToUnwind);
207
+ unwindCheckpoints(from: CheckpointNumber, checkpointsToUnwind: number): Promise<boolean> {
208
+ return this.#blockStore.unwindCheckpoints(from, checkpointsToUnwind);
164
209
  }
165
210
 
166
- /**
167
- * Gets up to `limit` amount of L2 blocks starting from `from`.
168
- *
169
- * @param start - Number of the first block to return (inclusive).
170
- * @param limit - The number of blocks to return.
171
- * @returns The requested L2 blocks
172
- */
173
- getBlocks(start: number, limit: number): Promise<L1Published<L2Block>[]> {
174
- return toArray(this.#blockStore.getBlocks(start, limit));
211
+ addCheckpoints(checkpoints: PublishedCheckpoint[]): Promise<boolean> {
212
+ return this.#blockStore.addCheckpoints(checkpoints);
213
+ }
214
+
215
+ getCheckpointedBlock(number: BlockNumber): Promise<CheckpointedL2Block | undefined> {
216
+ return this.#blockStore.getCheckpointedBlock(number);
217
+ }
218
+ getCheckpointedBlockByHash(blockHash: Fr): Promise<CheckpointedL2Block | undefined> {
219
+ return this.#blockStore.getCheckpointedBlockByHash(blockHash);
220
+ }
221
+ getCheckpointedBlockByArchive(archive: Fr): Promise<CheckpointedL2Block | undefined> {
222
+ return this.#blockStore.getCheckpointedBlockByArchive(archive);
223
+ }
224
+ getBlock(number: BlockNumber): Promise<L2BlockNew | undefined> {
225
+ return this.#blockStore.getBlock(number);
226
+ }
227
+ getBlockByHash(blockHash: Fr): Promise<L2BlockNew | undefined> {
228
+ return this.#blockStore.getBlockByHash(L2BlockHash.fromField(blockHash));
229
+ }
230
+ getBlockByArchive(archive: Fr): Promise<L2BlockNew | undefined> {
231
+ return this.#blockStore.getBlockByArchive(archive);
232
+ }
233
+ getBlocks(from: BlockNumber, limit: BlockNumber): Promise<L2BlockNew[]> {
234
+ return toArray(this.#blockStore.getBlocks(from, limit));
235
+ }
236
+
237
+ getCheckpointedBlocks(from: BlockNumber, limit: number): Promise<CheckpointedL2Block[]> {
238
+ return toArray(this.#blockStore.getCheckpointedBlocks(from, limit));
175
239
  }
176
240
 
177
241
  /**
@@ -181,14 +245,22 @@ export class KVArchiverDataStore implements ArchiverDataStore {
181
245
  * @param limit - The number of blocks to return.
182
246
  * @returns The requested L2 blocks
183
247
  */
184
- getBlockHeaders(start: number, limit: number): Promise<BlockHeader[]> {
248
+ getBlockHeaders(start: BlockNumber, limit: number): Promise<BlockHeader[]> {
185
249
  return toArray(this.#blockStore.getBlockHeaders(start, limit));
186
250
  }
187
251
 
252
+ getBlockHeaderByHash(blockHash: Fr): Promise<BlockHeader | undefined> {
253
+ return this.#blockStore.getBlockHeaderByHash(L2BlockHash.fromField(blockHash));
254
+ }
255
+
256
+ getBlockHeaderByArchive(archive: Fr): Promise<BlockHeader | undefined> {
257
+ return this.#blockStore.getBlockHeaderByArchive(archive);
258
+ }
259
+
188
260
  /**
189
261
  * Gets a tx effect.
190
- * @param txHash - The txHash of the tx corresponding to the tx effect.
191
- * @returns The requested tx effect (or undefined if not found).
262
+ * @param txHash - The hash of the tx corresponding to the tx effect.
263
+ * @returns The requested tx effect with block info (or undefined if not found).
192
264
  */
193
265
  getTxEffect(txHash: TxHash) {
194
266
  return this.#blockStore.getTxEffect(txHash);
@@ -208,41 +280,27 @@ export class KVArchiverDataStore implements ArchiverDataStore {
208
280
  * @param blocks - The blocks for which to add the logs.
209
281
  * @returns True if the operation is successful.
210
282
  */
211
- addLogs(blocks: L2Block[]): Promise<boolean> {
283
+ addLogs(blocks: L2BlockNew[]): Promise<boolean> {
212
284
  return this.#logStore.addLogs(blocks);
213
285
  }
214
286
 
215
- deleteLogs(blocks: L2Block[]): Promise<boolean> {
287
+ deleteLogs(blocks: L2BlockNew[]): Promise<boolean> {
216
288
  return this.#logStore.deleteLogs(blocks);
217
289
  }
218
290
 
219
- /**
220
- * Append new nullifiers to the store's list.
221
- * @param blocks - The blocks for which to add the nullifiers.
222
- * @returns True if the operation is successful.
223
- */
224
- addNullifiers(blocks: L2Block[]): Promise<boolean> {
225
- return this.#nullifierStore.addNullifiers(blocks);
226
- }
227
-
228
- deleteNullifiers(blocks: L2Block[]): Promise<boolean> {
229
- return this.#nullifierStore.deleteNullifiers(blocks);
230
- }
231
-
232
- findNullifiersIndexesWithBlock(blockNumber: number, nullifiers: Fr[]): Promise<(InBlock<bigint> | undefined)[]> {
233
- return this.#nullifierStore.findNullifiersIndexesWithBlock(blockNumber, nullifiers);
234
- }
235
-
236
291
  getTotalL1ToL2MessageCount(): Promise<bigint> {
237
292
  return this.#messageStore.getTotalL1ToL2MessageCount();
238
293
  }
239
294
 
295
+ getLastL1ToL2Message(): Promise<InboxMessage | undefined> {
296
+ return this.#messageStore.getLastMessage();
297
+ }
298
+
240
299
  /**
241
300
  * Append L1 to L2 messages to the store.
242
- * @param messages - The L1 to L2 messages to be added to the store and the last processed L1 block.
243
- * @returns True if the operation is successful.
301
+ * @param messages - The L1 to L2 messages to be added to the store.
244
302
  */
245
- addL1ToL2Messages(messages: DataRetrieval<InboxLeaf>): Promise<boolean> {
303
+ addL1ToL2Messages(messages: InboxMessage[]): Promise<void> {
246
304
  return this.#messageStore.addL1ToL2Messages(messages);
247
305
  }
248
306
 
@@ -256,33 +314,25 @@ export class KVArchiverDataStore implements ArchiverDataStore {
256
314
  }
257
315
 
258
316
  /**
259
- * Gets L1 to L2 message (to be) included in a given block.
260
- * @param blockNumber - L2 block number to get messages for.
317
+ * Gets L1 to L2 message (to be) included in a given checkpoint.
318
+ * @param checkpointNumber - Checkpoint number to get messages for.
261
319
  * @returns The L1 to L2 messages/leaves of the messages subtree (throws if not found).
262
320
  */
263
- getL1ToL2Messages(blockNumber: bigint): Promise<Fr[]> {
264
- return this.#messageStore.getL1ToL2Messages(blockNumber);
321
+ getL1ToL2Messages(checkpointNumber: CheckpointNumber): Promise<Fr[]> {
322
+ return this.#messageStore.getL1ToL2Messages(checkpointNumber);
265
323
  }
266
324
 
267
- /**
268
- * Retrieves all private logs from up to `limit` blocks, starting from the block number `from`.
269
- * @param from - The block number from which to begin retrieving logs.
270
- * @param limit - The maximum number of blocks to retrieve logs from.
271
- * @returns An array of private logs from the specified range of blocks.
272
- */
273
- getPrivateLogs(from: number, limit: number): Promise<PrivateLog[]> {
274
- return this.#logStore.getPrivateLogs(from, limit);
325
+ getPrivateLogsByTags(tags: SiloedTag[]): Promise<TxScopedL2Log[][]> {
326
+ try {
327
+ return this.#logStore.getPrivateLogsByTags(tags);
328
+ } catch (err) {
329
+ return Promise.reject(err);
330
+ }
275
331
  }
276
332
 
277
- /**
278
- * Gets all logs that match any of the received tags (i.e. logs with their first field equal to a tag).
279
- * @param tags - The tags to filter the logs by.
280
- * @returns For each received tag, an array of matching logs is returned. An empty array implies no logs match
281
- * that tag.
282
- */
283
- getLogsByTags(tags: Fr[]): Promise<TxScopedL2Log[][]> {
333
+ getPublicLogsByTagsFromContract(contractAddress: AztecAddress, tags: Tag[]): Promise<TxScopedL2Log[][]> {
284
334
  try {
285
- return this.#logStore.getLogsByTags(tags);
335
+ return this.#logStore.getPublicLogsByTagsFromContract(contractAddress, tags);
286
336
  } catch (err) {
287
337
  return Promise.reject(err);
288
338
  }
@@ -314,28 +364,24 @@ export class KVArchiverDataStore implements ArchiverDataStore {
314
364
  }
315
365
  }
316
366
 
317
- /**
318
- * Gets the number of the latest L2 block processed.
319
- * @returns The number of the latest L2 block processed.
320
- */
321
- getSynchedL2BlockNumber(): Promise<number> {
322
- return this.#blockStore.getSynchedL2BlockNumber();
323
- }
324
-
325
- getProvenL2BlockNumber(): Promise<number> {
326
- return this.#blockStore.getProvenL2BlockNumber();
367
+ getProvenCheckpointNumber(): Promise<CheckpointNumber> {
368
+ return this.#blockStore.getProvenCheckpointNumber();
327
369
  }
328
370
 
329
- async setProvenL2BlockNumber(blockNumber: number) {
330
- await this.#blockStore.setProvenL2BlockNumber(blockNumber);
371
+ async setProvenCheckpointNumber(checkpointNumber: CheckpointNumber) {
372
+ await this.#blockStore.setProvenCheckpointNumber(checkpointNumber);
331
373
  }
332
374
 
333
375
  async setBlockSynchedL1BlockNumber(l1BlockNumber: bigint) {
334
376
  await this.#blockStore.setSynchedL1BlockNumber(l1BlockNumber);
335
377
  }
336
378
 
337
- async setMessageSynchedL1BlockNumber(l1BlockNumber: bigint) {
338
- await this.#messageStore.setSynchedL1BlockNumber(l1BlockNumber);
379
+ async setMessageSynchedL1Block(l1Block: L1BlockId) {
380
+ await this.#messageStore.setSynchedL1Block(l1Block);
381
+ }
382
+
383
+ getProvenBlockNumber(): Promise<BlockNumber> {
384
+ return this.#blockStore.getProvenBlockNumber();
339
385
  }
340
386
 
341
387
  /**
@@ -344,7 +390,7 @@ export class KVArchiverDataStore implements ArchiverDataStore {
344
390
  async getSynchPoint(): Promise<ArchiverL1SynchPoint> {
345
391
  const [blocksSynchedTo, messagesSynchedTo] = await Promise.all([
346
392
  this.#blockStore.getSynchedL1BlockNumber(),
347
- this.#messageStore.getSynchedL1BlockNumber(),
393
+ this.#messageStore.getSynchedL1Block(),
348
394
  ]);
349
395
  return {
350
396
  blocksSynchedTo,
@@ -355,4 +401,42 @@ export class KVArchiverDataStore implements ArchiverDataStore {
355
401
  public estimateSize(): Promise<StoreSize> {
356
402
  return this.db.estimateSize();
357
403
  }
404
+
405
+ public rollbackL1ToL2MessagesToCheckpoint(targetCheckpointNumber: CheckpointNumber): Promise<void> {
406
+ return this.#messageStore.rollbackL1ToL2MessagesToCheckpoint(targetCheckpointNumber);
407
+ }
408
+
409
+ public iterateL1ToL2Messages(range: CustomRange<bigint> = {}): AsyncIterableIterator<InboxMessage> {
410
+ return this.#messageStore.iterateL1ToL2Messages(range);
411
+ }
412
+
413
+ public removeL1ToL2Messages(startIndex: bigint): Promise<void> {
414
+ return this.#messageStore.removeL1ToL2Messages(startIndex);
415
+ }
416
+
417
+ public getPendingChainValidationStatus(): Promise<ValidateCheckpointResult | undefined> {
418
+ return this.#blockStore.getPendingChainValidationStatus();
419
+ }
420
+
421
+ public setPendingChainValidationStatus(status: ValidateCheckpointResult | undefined): Promise<void> {
422
+ return this.#blockStore.setPendingChainValidationStatus(status);
423
+ }
424
+
425
+ public getCheckpointedL2BlockNumber(): Promise<BlockNumber> {
426
+ return this.#blockStore.getCheckpointedL2BlockNumber();
427
+ }
428
+ public getSynchedCheckpointNumber(): Promise<CheckpointNumber> {
429
+ return this.#blockStore.getLatestCheckpointNumber();
430
+ }
431
+ async setCheckpointSynchedL1BlockNumber(l1BlockNumber: bigint): Promise<void> {
432
+ await this.#blockStore.setSynchedL1BlockNumber(l1BlockNumber);
433
+ }
434
+
435
+ getBlocksForCheckpoint(checkpointNumber: CheckpointNumber): Promise<L2BlockNew[] | undefined> {
436
+ return this.#blockStore.getBlocksForCheckpoint(checkpointNumber);
437
+ }
438
+
439
+ getCheckpointData(checkpointNumber: CheckpointNumber): Promise<CheckpointData | undefined> {
440
+ return this.#blockStore.getCheckpointData(checkpointNumber);
441
+ }
358
442
  }