@aztec/archiver 0.0.1-commit.96bb3f7 → 0.0.1-commit.a072138

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 (191) hide show
  1. package/README.md +156 -22
  2. package/dest/archiver.d.ts +136 -0
  3. package/dest/archiver.d.ts.map +1 -0
  4. package/dest/archiver.js +781 -0
  5. package/dest/{archiver/config.d.ts → config.d.ts} +9 -1
  6. package/dest/config.d.ts.map +1 -0
  7. package/dest/{archiver/config.js → config.js} +9 -0
  8. package/dest/errors.d.ts +41 -0
  9. package/dest/errors.d.ts.map +1 -0
  10. package/dest/{archiver/errors.js → errors.js} +8 -0
  11. package/dest/factory.d.ts +9 -7
  12. package/dest/factory.d.ts.map +1 -1
  13. package/dest/factory.js +89 -11
  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/{archiver/l1 → l1}/bin/retrieve-calldata.d.ts +1 -1
  21. package/dest/l1/bin/retrieve-calldata.d.ts.map +1 -0
  22. package/dest/{archiver/l1 → l1}/bin/retrieve-calldata.js +2 -2
  23. package/dest/{archiver/l1 → l1}/calldata_retriever.d.ts +2 -2
  24. package/dest/l1/calldata_retriever.d.ts.map +1 -0
  25. package/dest/l1/data_retrieval.d.ts +88 -0
  26. package/dest/l1/data_retrieval.d.ts.map +1 -0
  27. package/dest/{archiver/l1 → l1}/data_retrieval.js +36 -55
  28. package/dest/{archiver/l1 → l1}/debug_tx.d.ts +1 -1
  29. package/dest/l1/debug_tx.d.ts.map +1 -0
  30. package/dest/{archiver/l1 → l1}/spire_proposer.d.ts +1 -1
  31. package/dest/l1/spire_proposer.d.ts.map +1 -0
  32. package/dest/{archiver/l1 → l1}/trace_tx.d.ts +1 -1
  33. package/dest/l1/trace_tx.d.ts.map +1 -0
  34. package/dest/l1/types.d.ts +12 -0
  35. package/dest/l1/types.d.ts.map +1 -0
  36. package/dest/{archiver/l1 → l1}/validate_trace.d.ts +6 -3
  37. package/dest/l1/validate_trace.d.ts.map +1 -0
  38. package/dest/{archiver/l1 → l1}/validate_trace.js +13 -9
  39. package/dest/modules/data_source_base.d.ts +84 -0
  40. package/dest/modules/data_source_base.d.ts.map +1 -0
  41. package/dest/modules/data_source_base.js +260 -0
  42. package/dest/modules/data_store_updater.d.ts +73 -0
  43. package/dest/modules/data_store_updater.d.ts.map +1 -0
  44. package/dest/modules/data_store_updater.js +302 -0
  45. package/dest/modules/instrumentation.d.ts +37 -0
  46. package/dest/modules/instrumentation.d.ts.map +1 -0
  47. package/dest/{archiver → modules}/instrumentation.js +17 -10
  48. package/dest/modules/l1_synchronizer.d.ts +75 -0
  49. package/dest/modules/l1_synchronizer.d.ts.map +1 -0
  50. package/dest/modules/l1_synchronizer.js +1112 -0
  51. package/dest/{archiver → modules}/validation.d.ts +1 -1
  52. package/dest/modules/validation.d.ts.map +1 -0
  53. package/dest/{archiver → modules}/validation.js +6 -0
  54. package/dest/store/block_store.d.ts +192 -0
  55. package/dest/store/block_store.d.ts.map +1 -0
  56. package/dest/{archiver/kv_archiver_store → store}/block_store.js +142 -47
  57. package/dest/store/contract_class_store.d.ts +18 -0
  58. package/dest/store/contract_class_store.d.ts.map +1 -0
  59. package/dest/{archiver/kv_archiver_store → store}/contract_class_store.js +12 -8
  60. package/dest/store/contract_instance_store.d.ts +24 -0
  61. package/dest/store/contract_instance_store.d.ts.map +1 -0
  62. package/dest/{archiver/kv_archiver_store → store}/contract_instance_store.js +1 -1
  63. package/dest/store/kv_archiver_store.d.ts +340 -0
  64. package/dest/store/kv_archiver_store.d.ts.map +1 -0
  65. package/dest/store/kv_archiver_store.js +446 -0
  66. package/dest/store/log_store.d.ts +54 -0
  67. package/dest/store/log_store.d.ts.map +1 -0
  68. package/dest/{archiver/kv_archiver_store → store}/log_store.js +91 -56
  69. package/dest/{archiver/kv_archiver_store → store}/message_store.d.ts +1 -1
  70. package/dest/store/message_store.d.ts.map +1 -0
  71. package/dest/{archiver/structs → structs}/data_retrieval.d.ts +1 -1
  72. package/dest/structs/data_retrieval.d.ts.map +1 -0
  73. package/dest/structs/inbox_message.d.ts +15 -0
  74. package/dest/structs/inbox_message.d.ts.map +1 -0
  75. package/dest/{archiver/structs → structs}/published.d.ts +1 -1
  76. package/dest/structs/published.d.ts.map +1 -0
  77. package/dest/test/fake_l1_state.d.ts +190 -0
  78. package/dest/test/fake_l1_state.d.ts.map +1 -0
  79. package/dest/test/fake_l1_state.js +383 -0
  80. package/dest/test/index.d.ts +2 -1
  81. package/dest/test/index.d.ts.map +1 -1
  82. package/dest/test/index.js +4 -1
  83. package/dest/test/mock_archiver.d.ts +2 -2
  84. package/dest/test/mock_archiver.d.ts.map +1 -1
  85. package/dest/test/mock_archiver.js +1 -2
  86. package/dest/test/mock_l2_block_source.d.ts +20 -17
  87. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  88. package/dest/test/mock_l2_block_source.js +108 -48
  89. package/dest/test/mock_structs.d.ts +78 -3
  90. package/dest/test/mock_structs.d.ts.map +1 -1
  91. package/dest/test/mock_structs.js +140 -7
  92. package/dest/test/noop_l1_archiver.d.ts +23 -0
  93. package/dest/test/noop_l1_archiver.d.ts.map +1 -0
  94. package/dest/test/noop_l1_archiver.js +68 -0
  95. package/package.json +16 -17
  96. package/src/archiver.ts +543 -0
  97. package/src/{archiver/config.ts → config.ts} +11 -0
  98. package/src/{archiver/errors.ts → errors.ts} +12 -0
  99. package/src/factory.ts +125 -11
  100. package/src/index.ts +10 -3
  101. package/src/interfaces.ts +9 -0
  102. package/src/{archiver/l1 → l1}/bin/retrieve-calldata.ts +7 -2
  103. package/src/{archiver/l1 → l1}/calldata_retriever.ts +1 -1
  104. package/src/{archiver/l1 → l1}/data_retrieval.ts +57 -74
  105. package/src/{archiver/l1 → l1}/validate_trace.ts +24 -6
  106. package/src/modules/data_source_base.ts +367 -0
  107. package/src/modules/data_store_updater.ts +423 -0
  108. package/src/{archiver → modules}/instrumentation.ts +17 -12
  109. package/src/modules/l1_synchronizer.ts +930 -0
  110. package/src/{archiver → modules}/validation.ts +5 -0
  111. package/src/{archiver/kv_archiver_store → store}/block_store.ts +179 -63
  112. package/src/{archiver/kv_archiver_store → store}/contract_class_store.ts +12 -8
  113. package/src/{archiver/kv_archiver_store → store}/contract_instance_store.ts +1 -1
  114. package/src/{archiver/kv_archiver_store → store}/kv_archiver_store.ts +234 -37
  115. package/src/{archiver/kv_archiver_store → store}/log_store.ts +149 -90
  116. package/src/test/fake_l1_state.ts +599 -0
  117. package/src/test/index.ts +4 -0
  118. package/src/test/mock_archiver.ts +2 -2
  119. package/src/test/mock_l2_block_source.ts +114 -66
  120. package/src/test/mock_structs.ts +269 -8
  121. package/src/test/noop_l1_archiver.ts +109 -0
  122. package/dest/archiver/archiver.d.ts +0 -307
  123. package/dest/archiver/archiver.d.ts.map +0 -1
  124. package/dest/archiver/archiver.js +0 -2102
  125. package/dest/archiver/archiver_store.d.ts +0 -315
  126. package/dest/archiver/archiver_store.d.ts.map +0 -1
  127. package/dest/archiver/archiver_store.js +0 -4
  128. package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
  129. package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
  130. package/dest/archiver/archiver_store_test_suite.js +0 -2770
  131. package/dest/archiver/config.d.ts.map +0 -1
  132. package/dest/archiver/errors.d.ts +0 -36
  133. package/dest/archiver/errors.d.ts.map +0 -1
  134. package/dest/archiver/index.d.ts +0 -7
  135. package/dest/archiver/index.d.ts.map +0 -1
  136. package/dest/archiver/index.js +0 -4
  137. package/dest/archiver/instrumentation.d.ts +0 -37
  138. package/dest/archiver/instrumentation.d.ts.map +0 -1
  139. package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -164
  140. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
  141. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -18
  142. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
  143. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -24
  144. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
  145. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -159
  146. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
  147. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +0 -316
  148. package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -45
  149. package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
  150. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
  151. package/dest/archiver/l1/bin/retrieve-calldata.d.ts.map +0 -1
  152. package/dest/archiver/l1/calldata_retriever.d.ts.map +0 -1
  153. package/dest/archiver/l1/data_retrieval.d.ts +0 -90
  154. package/dest/archiver/l1/data_retrieval.d.ts.map +0 -1
  155. package/dest/archiver/l1/debug_tx.d.ts.map +0 -1
  156. package/dest/archiver/l1/spire_proposer.d.ts.map +0 -1
  157. package/dest/archiver/l1/trace_tx.d.ts.map +0 -1
  158. package/dest/archiver/l1/types.d.ts +0 -12
  159. package/dest/archiver/l1/types.d.ts.map +0 -1
  160. package/dest/archiver/l1/validate_trace.d.ts.map +0 -1
  161. package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
  162. package/dest/archiver/structs/inbox_message.d.ts +0 -15
  163. package/dest/archiver/structs/inbox_message.d.ts.map +0 -1
  164. package/dest/archiver/structs/published.d.ts.map +0 -1
  165. package/dest/archiver/validation.d.ts.map +0 -1
  166. package/dest/rpc/index.d.ts +0 -9
  167. package/dest/rpc/index.d.ts.map +0 -1
  168. package/dest/rpc/index.js +0 -15
  169. package/src/archiver/archiver.ts +0 -2265
  170. package/src/archiver/archiver_store.ts +0 -380
  171. package/src/archiver/archiver_store_test_suite.ts +0 -2842
  172. package/src/archiver/index.ts +0 -6
  173. package/src/rpc/index.ts +0 -16
  174. /package/dest/{archiver/l1 → l1}/calldata_retriever.js +0 -0
  175. /package/dest/{archiver/l1 → l1}/debug_tx.js +0 -0
  176. /package/dest/{archiver/l1 → l1}/spire_proposer.js +0 -0
  177. /package/dest/{archiver/l1 → l1}/trace_tx.js +0 -0
  178. /package/dest/{archiver/l1 → l1}/types.js +0 -0
  179. /package/dest/{archiver/kv_archiver_store → store}/message_store.js +0 -0
  180. /package/dest/{archiver/structs → structs}/data_retrieval.js +0 -0
  181. /package/dest/{archiver/structs → structs}/inbox_message.js +0 -0
  182. /package/dest/{archiver/structs → structs}/published.js +0 -0
  183. /package/src/{archiver/l1 → l1}/README.md +0 -0
  184. /package/src/{archiver/l1 → l1}/debug_tx.ts +0 -0
  185. /package/src/{archiver/l1 → l1}/spire_proposer.ts +0 -0
  186. /package/src/{archiver/l1 → l1}/trace_tx.ts +0 -0
  187. /package/src/{archiver/l1 → l1}/types.ts +0 -0
  188. /package/src/{archiver/kv_archiver_store → store}/message_store.ts +0 -0
  189. /package/src/{archiver/structs → structs}/data_retrieval.ts +0 -0
  190. /package/src/{archiver/structs → structs}/inbox_message.ts +0 -0
  191. /package/src/{archiver/structs → structs}/published.ts +0 -0
@@ -1,11 +1,13 @@
1
1
  import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
2
2
  import { BlockNumber } from '@aztec/foundation/branded-types';
3
+ import { filterAsync } from '@aztec/foundation/collection';
3
4
  import { Fr } from '@aztec/foundation/curves/bn254';
4
5
  import { createLogger } from '@aztec/foundation/log';
5
6
  import { BufferReader, numToUInt32BE } from '@aztec/foundation/serialize';
6
7
  import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
7
8
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
8
- import { L2BlockHash, L2BlockNew } from '@aztec/stdlib/block';
9
+ import { BlockHash, L2Block } from '@aztec/stdlib/block';
10
+ import { MAX_LOGS_PER_TAG } from '@aztec/stdlib/interfaces/api-limit';
9
11
  import type { GetContractClassLogsResponse, GetPublicLogsResponse } from '@aztec/stdlib/interfaces/client';
10
12
  import {
11
13
  ContractClassLog,
@@ -57,7 +59,7 @@ export class LogStore {
57
59
  * @param block - The L2 block to extract logs from.
58
60
  * @returns An object containing the private and public tagged logs for the block.
59
61
  */
60
- #extractTaggedLogsFromBlock(block: L2BlockNew) {
62
+ #extractTaggedLogsFromBlock(block: L2Block) {
61
63
  // SiloedTag (as string) -> array of log buffers.
62
64
  const privateTaggedLogs = new Map<string, Buffer[]>();
63
65
  // "{contractAddress}_{tag}" (as string) -> array of log buffers.
@@ -118,7 +120,7 @@ export class LogStore {
118
120
  * @returns A map from tag (as string) to an array of serialized private logs belonging to that tag, and a map from
119
121
  * "{contractAddress}_{tag}" (as string) to an array of serialized public logs belonging to that key.
120
122
  */
121
- #extractTaggedLogs(blocks: L2BlockNew[]): {
123
+ #extractTaggedLogs(blocks: L2Block[]): {
122
124
  privateTaggedLogs: Map<string, Buffer[]>;
123
125
  publicTaggedLogs: Map<string, Buffer[]>;
124
126
  } {
@@ -144,111 +146,146 @@ export class LogStore {
144
146
  return { privateTaggedLogs, publicTaggedLogs };
145
147
  }
146
148
 
147
- /**
148
- * Append new logs to the store's list.
149
- * @param blocks - The blocks for which to add the logs.
150
- * @returns True if the operation is successful.
151
- */
152
- addLogs(blocks: L2BlockNew[]): Promise<boolean> {
153
- const { privateTaggedLogs, publicTaggedLogs } = this.#extractTaggedLogs(blocks);
149
+ async #addPrivateLogs(blocks: L2Block[]): Promise<void> {
150
+ const newBlocks = await filterAsync(
151
+ blocks,
152
+ async block => !(await this.#privateLogKeysByBlock.hasAsync(block.number)),
153
+ );
154
154
 
155
+ const { privateTaggedLogs } = this.#extractTaggedLogs(newBlocks);
155
156
  const keysOfPrivateLogsToUpdate = Array.from(privateTaggedLogs.keys());
156
- const keysOfPublicLogsToUpdate = Array.from(publicTaggedLogs.keys());
157
157
 
158
- return this.db.transactionAsync(async () => {
159
- const currentPrivateTaggedLogs = await Promise.all(
160
- keysOfPrivateLogsToUpdate.map(async key => ({
161
- tag: key,
162
- logBuffers: await this.#privateLogsByTag.getAsync(key),
163
- })),
164
- );
165
- currentPrivateTaggedLogs.forEach(taggedLogBuffer => {
166
- if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
167
- privateTaggedLogs.set(
168
- taggedLogBuffer.tag,
169
- taggedLogBuffer.logBuffers!.concat(privateTaggedLogs.get(taggedLogBuffer.tag)!),
170
- );
171
- }
172
- });
158
+ const currentPrivateTaggedLogs = await Promise.all(
159
+ keysOfPrivateLogsToUpdate.map(async key => ({
160
+ tag: key,
161
+ logBuffers: await this.#privateLogsByTag.getAsync(key),
162
+ })),
163
+ );
173
164
 
174
- const currentPublicTaggedLogs = await Promise.all(
175
- keysOfPublicLogsToUpdate.map(async key => ({
176
- key,
177
- logBuffers: await this.#publicLogsByContractAndTag.getAsync(key),
178
- })),
179
- );
180
- currentPublicTaggedLogs.forEach(taggedLogBuffer => {
181
- if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
182
- publicTaggedLogs.set(
183
- taggedLogBuffer.key,
184
- taggedLogBuffer.logBuffers!.concat(publicTaggedLogs.get(taggedLogBuffer.key)!),
185
- );
186
- }
187
- });
165
+ for (const taggedLogBuffer of currentPrivateTaggedLogs) {
166
+ if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
167
+ privateTaggedLogs.set(
168
+ taggedLogBuffer.tag,
169
+ taggedLogBuffer.logBuffers!.concat(privateTaggedLogs.get(taggedLogBuffer.tag)!),
170
+ );
171
+ }
172
+ }
188
173
 
189
- for (const block of blocks) {
190
- const blockHash = await block.hash();
174
+ for (const block of newBlocks) {
175
+ const privateTagsInBlock: string[] = [];
176
+ for (const [tag, logs] of privateTaggedLogs.entries()) {
177
+ await this.#privateLogsByTag.set(tag, logs);
178
+ privateTagsInBlock.push(tag);
179
+ }
180
+ await this.#privateLogKeysByBlock.set(block.number, privateTagsInBlock);
181
+ }
182
+ }
191
183
 
192
- const privateTagsInBlock: string[] = [];
193
- for (const [tag, logs] of privateTaggedLogs.entries()) {
194
- await this.#privateLogsByTag.set(tag, logs);
195
- privateTagsInBlock.push(tag);
196
- }
197
- await this.#privateLogKeysByBlock.set(block.number, privateTagsInBlock);
184
+ async #addPublicLogs(blocks: L2Block[]): Promise<void> {
185
+ const newBlocks = await filterAsync(
186
+ blocks,
187
+ async block => !(await this.#publicLogKeysByBlock.hasAsync(block.number)),
188
+ );
198
189
 
199
- const publicKeysInBlock: string[] = [];
200
- for (const [key, logs] of publicTaggedLogs.entries()) {
201
- await this.#publicLogsByContractAndTag.set(key, logs);
202
- publicKeysInBlock.push(key);
203
- }
204
- await this.#publicLogKeysByBlock.set(block.number, publicKeysInBlock);
205
-
206
- const publicLogsInBlock = block.body.txEffects
207
- .map((txEffect, txIndex) =>
208
- [
209
- numToUInt32BE(txIndex),
210
- numToUInt32BE(txEffect.publicLogs.length),
211
- txEffect.publicLogs.map(log => log.toBuffer()),
212
- ].flat(),
213
- )
214
- .flat();
215
-
216
- const contractClassLogsInBlock = block.body.txEffects
217
- .map((txEffect, txIndex) =>
218
- [
219
- numToUInt32BE(txIndex),
220
- numToUInt32BE(txEffect.contractClassLogs.length),
221
- txEffect.contractClassLogs.map(log => log.toBuffer()),
222
- ].flat(),
223
- )
224
- .flat();
225
-
226
- await this.#publicLogsByBlock.set(block.number, this.#packWithBlockHash(blockHash, publicLogsInBlock));
227
- await this.#contractClassLogsByBlock.set(
228
- block.number,
229
- this.#packWithBlockHash(blockHash, contractClassLogsInBlock),
190
+ const { publicTaggedLogs } = this.#extractTaggedLogs(newBlocks);
191
+ const keysOfPublicLogsToUpdate = Array.from(publicTaggedLogs.keys());
192
+
193
+ const currentPublicTaggedLogs = await Promise.all(
194
+ keysOfPublicLogsToUpdate.map(async key => ({
195
+ tag: key,
196
+ logBuffers: await this.#publicLogsByContractAndTag.getAsync(key),
197
+ })),
198
+ );
199
+
200
+ for (const taggedLogBuffer of currentPublicTaggedLogs) {
201
+ if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
202
+ publicTaggedLogs.set(
203
+ taggedLogBuffer.tag,
204
+ taggedLogBuffer.logBuffers!.concat(publicTaggedLogs.get(taggedLogBuffer.tag)!),
230
205
  );
231
206
  }
207
+ }
232
208
 
209
+ for (const block of newBlocks) {
210
+ const blockHash = await block.hash();
211
+ const publicTagsInBlock: string[] = [];
212
+ for (const [tag, logs] of publicTaggedLogs.entries()) {
213
+ await this.#publicLogsByContractAndTag.set(tag, logs);
214
+ publicTagsInBlock.push(tag);
215
+ }
216
+ await this.#publicLogKeysByBlock.set(block.number, publicTagsInBlock);
217
+
218
+ const publicLogsInBlock = block.body.txEffects
219
+ .map((txEffect, txIndex) =>
220
+ [
221
+ numToUInt32BE(txIndex),
222
+ numToUInt32BE(txEffect.publicLogs.length),
223
+ txEffect.publicLogs.map(log => log.toBuffer()),
224
+ ].flat(),
225
+ )
226
+ .flat();
227
+
228
+ await this.#publicLogsByBlock.set(block.number, this.#packWithBlockHash(blockHash, publicLogsInBlock));
229
+ }
230
+ }
231
+
232
+ async #addContractClassLogs(blocks: L2Block[]): Promise<void> {
233
+ const newBlocks = await filterAsync(
234
+ blocks,
235
+ async block => !(await this.#contractClassLogsByBlock.hasAsync(block.number)),
236
+ );
237
+
238
+ for (const block of newBlocks) {
239
+ const blockHash = await block.hash();
240
+
241
+ const contractClassLogsInBlock = block.body.txEffects
242
+ .map((txEffect, txIndex) =>
243
+ [
244
+ numToUInt32BE(txIndex),
245
+ numToUInt32BE(txEffect.contractClassLogs.length),
246
+ txEffect.contractClassLogs.map(log => log.toBuffer()),
247
+ ].flat(),
248
+ )
249
+ .flat();
250
+
251
+ await this.#contractClassLogsByBlock.set(
252
+ block.number,
253
+ this.#packWithBlockHash(blockHash, contractClassLogsInBlock),
254
+ );
255
+ }
256
+ }
257
+
258
+ /**
259
+ * Append new logs to the store's list.
260
+ * @param blocks - The blocks for which to add the logs.
261
+ * @returns True if the operation is successful.
262
+ */
263
+ addLogs(blocks: L2Block[]): Promise<boolean> {
264
+ return this.db.transactionAsync(async () => {
265
+ await Promise.all([
266
+ this.#addPrivateLogs(blocks),
267
+ this.#addPublicLogs(blocks),
268
+ this.#addContractClassLogs(blocks),
269
+ ]);
233
270
  return true;
234
271
  });
235
272
  }
236
273
 
237
- #packWithBlockHash(blockHash: Fr, data: Buffer<ArrayBufferLike>[]): Buffer<ArrayBufferLike> {
274
+ #packWithBlockHash(blockHash: BlockHash, data: Buffer<ArrayBufferLike>[]): Buffer<ArrayBufferLike> {
238
275
  return Buffer.concat([blockHash.toBuffer(), ...data]);
239
276
  }
240
277
 
241
- #unpackBlockHash(reader: BufferReader): L2BlockHash {
278
+ #unpackBlockHash(reader: BufferReader): BlockHash {
242
279
  const blockHash = reader.remainingBytes() > 0 ? reader.readObject(Fr) : undefined;
243
280
 
244
281
  if (!blockHash) {
245
282
  throw new Error('Failed to read block hash from log entry buffer');
246
283
  }
247
284
 
248
- return L2BlockHash.fromField(blockHash);
285
+ return new BlockHash(blockHash);
249
286
  }
250
287
 
251
- deleteLogs(blocks: L2BlockNew[]): Promise<boolean> {
288
+ deleteLogs(blocks: L2Block[]): Promise<boolean> {
252
289
  return this.db.transactionAsync(async () => {
253
290
  await Promise.all(
254
291
  blocks.map(async block => {
@@ -278,27 +315,49 @@ export class LogStore {
278
315
  }
279
316
 
280
317
  /**
281
- * Gets all private logs that match any of the `tags`. For each tag, an array of matching logs is returned. An empty
318
+ * Gets private logs that match any of the `tags`. For each tag, an array of matching logs is returned. An empty
282
319
  * array implies no logs match that tag.
320
+ * @param tags - The tags to search for.
321
+ * @param page - The page number (0-indexed) for pagination.
322
+ * @returns An array of log arrays, one per tag. Returns at most MAX_LOGS_PER_TAG logs per tag per page. If
323
+ * MAX_LOGS_PER_TAG logs are returned for a tag, the caller should fetch the next page to check for more logs.
283
324
  */
284
- async getPrivateLogsByTags(tags: SiloedTag[]): Promise<TxScopedL2Log[][]> {
325
+ async getPrivateLogsByTags(tags: SiloedTag[], page: number = 0): Promise<TxScopedL2Log[][]> {
285
326
  const logs = await Promise.all(tags.map(tag => this.#privateLogsByTag.getAsync(tag.toString())));
327
+ const start = page * MAX_LOGS_PER_TAG;
328
+ const end = start + MAX_LOGS_PER_TAG;
286
329
 
287
- return logs.map(logBuffers => logBuffers?.map(logBuffer => TxScopedL2Log.fromBuffer(logBuffer)) ?? []);
330
+ return logs.map(
331
+ logBuffers => logBuffers?.slice(start, end).map(logBuffer => TxScopedL2Log.fromBuffer(logBuffer)) ?? [],
332
+ );
288
333
  }
289
334
 
290
335
  /**
291
- * Gets all public logs that match any of the `tags` from the specified contract. For each tag, an array of matching
336
+ * Gets public logs that match any of the `tags` from the specified contract. For each tag, an array of matching
292
337
  * logs is returned. An empty array implies no logs match that tag.
338
+ * @param contractAddress - The contract address to search logs for.
339
+ * @param tags - The tags to search for.
340
+ * @param page - The page number (0-indexed) for pagination.
341
+ * @returns An array of log arrays, one per tag. Returns at most MAX_LOGS_PER_TAG logs per tag per page. If
342
+ * MAX_LOGS_PER_TAG logs are returned for a tag, the caller should fetch the next page to check for more logs.
293
343
  */
294
- async getPublicLogsByTagsFromContract(contractAddress: AztecAddress, tags: Tag[]): Promise<TxScopedL2Log[][]> {
344
+ async getPublicLogsByTagsFromContract(
345
+ contractAddress: AztecAddress,
346
+ tags: Tag[],
347
+ page: number = 0,
348
+ ): Promise<TxScopedL2Log[][]> {
295
349
  const logs = await Promise.all(
296
350
  tags.map(tag => {
297
351
  const key = `${contractAddress.toString()}_${tag.value.toString()}`;
298
352
  return this.#publicLogsByContractAndTag.getAsync(key);
299
353
  }),
300
354
  );
301
- return logs.map(logBuffers => logBuffers?.map(logBuffer => TxScopedL2Log.fromBuffer(logBuffer)) ?? []);
355
+ const start = page * MAX_LOGS_PER_TAG;
356
+ const end = start + MAX_LOGS_PER_TAG;
357
+
358
+ return logs.map(
359
+ logBuffers => logBuffers?.slice(start, end).map(logBuffer => TxScopedL2Log.fromBuffer(logBuffer)) ?? [],
360
+ );
302
361
  }
303
362
 
304
363
  /**
@@ -484,7 +543,7 @@ export class LogStore {
484
543
  #accumulateLogs(
485
544
  results: (ExtendedContractClassLog | ExtendedPublicLog)[],
486
545
  blockNumber: number,
487
- blockHash: L2BlockHash,
546
+ blockHash: BlockHash,
488
547
  txIndex: number,
489
548
  txLogs: (ContractClassLog | PublicLog)[],
490
549
  filter: LogFilter = {},