@aztec/pxe 0.0.1-commit.f295ac2 → 0.0.1-commit.f2ce05ee

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 (187) hide show
  1. package/dest/bin/check_oracle_version.js +1 -1
  2. package/dest/block_synchronizer/block_synchronizer.d.ts +9 -5
  3. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  4. package/dest/block_synchronizer/block_synchronizer.js +62 -16
  5. package/dest/config/index.d.ts +3 -1
  6. package/dest/config/index.d.ts.map +1 -1
  7. package/dest/config/index.js +17 -0
  8. package/dest/contract_function_simulator/contract_function_simulator.d.ts +5 -5
  9. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  10. package/dest/contract_function_simulator/contract_function_simulator.js +12 -15
  11. package/dest/contract_function_simulator/index.d.ts +2 -2
  12. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  13. package/dest/contract_function_simulator/index.js +1 -1
  14. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +1 -1
  15. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +1 -1
  16. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +1 -1
  17. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +1 -1
  18. package/dest/contract_function_simulator/oracle/interfaces.d.ts +15 -12
  19. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  20. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +4 -4
  21. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  22. package/dest/contract_function_simulator/oracle/note_packing_utils.js +4 -4
  23. package/dest/contract_function_simulator/oracle/oracle.d.ts +7 -5
  24. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  25. package/dest/contract_function_simulator/oracle/oracle.js +56 -34
  26. package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -22
  27. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/oracle/private_execution.js +0 -37
  29. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +12 -3
  30. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  31. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +20 -9
  32. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +38 -24
  33. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  34. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +84 -65
  35. package/dest/contract_sync/contract_sync_service.d.ts +41 -0
  36. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
  37. package/dest/contract_sync/contract_sync_service.js +82 -0
  38. package/dest/contract_sync/helpers.d.ts +28 -0
  39. package/dest/contract_sync/helpers.d.ts.map +1 -0
  40. package/dest/contract_sync/helpers.js +55 -0
  41. package/dest/debug/pxe_debug_utils.d.ts +22 -9
  42. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  43. package/dest/debug/pxe_debug_utils.js +28 -17
  44. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  45. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  46. package/dest/entrypoints/client/bundle/utils.js +12 -6
  47. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  48. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  49. package/dest/entrypoints/client/lazy/utils.js +13 -7
  50. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  51. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  52. package/dest/entrypoints/server/index.d.ts +2 -1
  53. package/dest/entrypoints/server/index.d.ts.map +1 -1
  54. package/dest/entrypoints/server/index.js +1 -0
  55. package/dest/entrypoints/server/utils.d.ts +1 -1
  56. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  57. package/dest/entrypoints/server/utils.js +19 -8
  58. package/dest/events/event_service.d.ts +5 -6
  59. package/dest/events/event_service.d.ts.map +1 -1
  60. package/dest/events/event_service.js +6 -7
  61. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  62. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  63. package/dest/job_coordinator/job_coordinator.js +3 -2
  64. package/dest/logs/log_service.d.ts +6 -5
  65. package/dest/logs/log_service.d.ts.map +1 -1
  66. package/dest/logs/log_service.js +20 -19
  67. package/dest/notes/note_service.d.ts +6 -6
  68. package/dest/notes/note_service.d.ts.map +1 -1
  69. package/dest/notes/note_service.js +14 -14
  70. package/dest/oracle_version.d.ts +3 -3
  71. package/dest/oracle_version.d.ts.map +1 -1
  72. package/dest/oracle_version.js +4 -3
  73. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  74. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  75. package/dest/private_kernel/private_kernel_execution_prover.js +2 -2
  76. package/dest/private_kernel/private_kernel_oracle.d.ts +3 -3
  77. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  78. package/dest/pxe.d.ts +13 -2
  79. package/dest/pxe.d.ts.map +1 -1
  80. package/dest/pxe.js +45 -20
  81. package/dest/storage/address_store/address_store.d.ts +1 -1
  82. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  83. package/dest/storage/address_store/address_store.js +12 -11
  84. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  85. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  86. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  87. package/dest/storage/capsule_store/capsule_store.js +6 -8
  88. package/dest/storage/contract_store/contract_store.d.ts +1 -2
  89. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  90. package/dest/storage/contract_store/contract_store.js +27 -30
  91. package/dest/storage/metadata.d.ts +1 -1
  92. package/dest/storage/metadata.js +1 -1
  93. package/dest/storage/note_store/note_store.d.ts +48 -50
  94. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  95. package/dest/storage/note_store/note_store.js +279 -252
  96. package/dest/storage/note_store/stored_note.d.ts +16 -0
  97. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  98. package/dest/storage/note_store/stored_note.js +43 -0
  99. package/dest/storage/private_event_store/private_event_store.d.ts +17 -4
  100. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  101. package/dest/storage/private_event_store/private_event_store.js +198 -147
  102. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  103. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  104. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  105. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +1 -1
  106. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  107. package/dest/storage/tagging_store/recipient_tagging_store.js +31 -19
  108. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  109. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  110. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  111. package/dest/storage/tagging_store/sender_tagging_store.d.ts +1 -1
  112. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  113. package/dest/storage/tagging_store/sender_tagging_store.js +183 -113
  114. package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
  115. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  116. package/dest/tagging/get_all_logs_by_tags.js +46 -0
  117. package/dest/tagging/index.d.ts +2 -1
  118. package/dest/tagging/index.d.ts.map +1 -1
  119. package/dest/tagging/index.js +1 -0
  120. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
  121. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  122. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +2 -2
  123. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
  124. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  125. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +5 -2
  126. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
  127. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  128. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +2 -2
  129. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
  130. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  131. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
  132. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +3 -2
  133. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  134. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +7 -4
  135. package/package.json +25 -16
  136. package/src/bin/check_oracle_version.ts +1 -0
  137. package/src/block_synchronizer/block_synchronizer.ts +76 -33
  138. package/src/config/index.ts +14 -0
  139. package/src/contract_function_simulator/contract_function_simulator.ts +12 -17
  140. package/src/contract_function_simulator/index.ts +1 -1
  141. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +1 -1
  142. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -1
  143. package/src/contract_function_simulator/oracle/interfaces.ts +20 -11
  144. package/src/contract_function_simulator/oracle/note_packing_utils.ts +4 -4
  145. package/src/contract_function_simulator/oracle/oracle.ts +62 -32
  146. package/src/contract_function_simulator/oracle/private_execution.ts +1 -60
  147. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +34 -11
  148. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +107 -74
  149. package/src/contract_sync/contract_sync_service.ts +129 -0
  150. package/src/contract_sync/helpers.ts +93 -0
  151. package/src/debug/pxe_debug_utils.ts +60 -17
  152. package/src/entrypoints/client/bundle/utils.ts +7 -14
  153. package/src/entrypoints/client/lazy/utils.ts +8 -14
  154. package/src/entrypoints/pxe_creation_options.ts +2 -1
  155. package/src/entrypoints/server/index.ts +1 -0
  156. package/src/entrypoints/server/utils.ts +15 -19
  157. package/src/events/event_service.ts +5 -7
  158. package/src/job_coordinator/job_coordinator.ts +4 -3
  159. package/src/logs/log_service.ts +31 -15
  160. package/src/notes/note_service.ts +21 -20
  161. package/src/oracle_version.ts +4 -3
  162. package/src/private_kernel/private_kernel_execution_prover.ts +6 -3
  163. package/src/private_kernel/private_kernel_oracle.ts +2 -2
  164. package/src/pxe.ts +84 -19
  165. package/src/storage/address_store/address_store.ts +15 -15
  166. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  167. package/src/storage/capsule_store/capsule_store.ts +8 -8
  168. package/src/storage/contract_store/contract_store.ts +26 -35
  169. package/src/storage/metadata.ts +1 -1
  170. package/src/storage/note_store/note_store.ts +318 -318
  171. package/src/storage/note_store/stored_note.ts +48 -0
  172. package/src/storage/private_event_store/private_event_store.ts +250 -190
  173. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  174. package/src/storage/tagging_store/recipient_tagging_store.ts +31 -21
  175. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  176. package/src/storage/tagging_store/sender_tagging_store.ts +210 -126
  177. package/src/tagging/get_all_logs_by_tags.ts +68 -0
  178. package/src/tagging/index.ts +1 -0
  179. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +11 -1
  180. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
  181. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +3 -1
  182. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -17
  183. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +12 -3
  184. package/dest/tree_membership/tree_membership_service.d.ts +0 -50
  185. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  186. package/dest/tree_membership/tree_membership_service.js +0 -75
  187. package/src/tree_membership/tree_membership_service.ts +0 -97
@@ -0,0 +1,43 @@
1
+ import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
2
+ import { NoteDao } from '@aztec/stdlib/note';
3
+ export class StoredNote {
4
+ noteDao;
5
+ scopes;
6
+ _nullifiedAt;
7
+ constructor(noteDao, scopes, _nullifiedAt = undefined){
8
+ this.noteDao = noteDao;
9
+ this.scopes = scopes;
10
+ this._nullifiedAt = _nullifiedAt;
11
+ }
12
+ static fromBuffer(buffer) {
13
+ const reader = BufferReader.asReader(buffer);
14
+ const noteDao = NoteDao.fromBuffer(reader);
15
+ const scopes = reader.readVector({
16
+ fromBuffer: (r)=>r.readString()
17
+ });
18
+ const nullifiedAtRaw = reader.readNumber();
19
+ const nullifiedAt = nullifiedAtRaw === 0 ? undefined : nullifiedAtRaw;
20
+ return new StoredNote(noteDao, new Set(scopes), nullifiedAt);
21
+ }
22
+ toBuffer() {
23
+ const scopesArray = [
24
+ ...this.scopes
25
+ ];
26
+ return serializeToBuffer(this.noteDao, scopesArray.length, ...scopesArray, this._nullifiedAt ?? 0);
27
+ }
28
+ addScope(scope) {
29
+ this.scopes.add(scope);
30
+ }
31
+ markAsNullified(blockNumber) {
32
+ this._nullifiedAt = blockNumber;
33
+ }
34
+ markAsActive() {
35
+ this._nullifiedAt = undefined;
36
+ }
37
+ isNullified() {
38
+ return this._nullifiedAt !== undefined;
39
+ }
40
+ get nullifiedAt() {
41
+ return this._nullifiedAt;
42
+ }
43
+ }
@@ -2,7 +2,7 @@ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
3
3
  import type { EventSelector } from '@aztec/stdlib/abi';
4
4
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
5
- import { type InTx, TxHash } from '@aztec/stdlib/tx';
5
+ import type { InTx, TxHash } from '@aztec/stdlib/tx';
6
6
  import type { StagedStore } from '../../job_coordinator/job_coordinator.js';
7
7
  import type { PackedPrivateEvent } from '../../pxe.js';
8
8
  export type PrivateEventStoreFilter = {
@@ -28,8 +28,6 @@ export declare class PrivateEventStore implements StagedStore {
28
28
  readonly storeName: string;
29
29
  logger: import("@aztec/foundation/log").Logger;
30
30
  constructor(store: AztecAsyncKVStore);
31
- commit(jobId: string): Promise<void>;
32
- discardStaged(jobId: string): Promise<void>;
33
31
  /**
34
32
  * Store a private event log.
35
33
  * @param eventSelector - The event selector of the event.
@@ -73,6 +71,21 @@ export declare class PrivateEventStore implements StagedStore {
73
71
  * IMPORTANT: This method must be called within a transaction to ensure atomicity.
74
72
  */
75
73
  rollback(blockNumber: number, synchedBlockNumber: number): Promise<void>;
74
+ /**
75
+ * Commits in memory job data to persistent storage.
76
+ *
77
+ * Called by JobCoordinator when a job completes successfully.
78
+ *
79
+ * Note: JobCoordinator wraps all commits in a single transaction, so we don't need our own transactionAsync here
80
+ * (and using one would throw on IndexedDB as it does not support nested txs).
81
+ *
82
+ * @param jobId - The jobId identifying which staged data to commit
83
+ */
84
+ commit(jobId: string): Promise<void>;
85
+ /**
86
+ * Discards in memory job data without persisting it.
87
+ */
88
+ discardStaged(jobId: string): Promise<void>;
76
89
  }
77
90
  export {};
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZV9ldmVudF9zdG9yZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0b3JhZ2UvcHJpdmF0ZV9ldmVudF9zdG9yZS9wcml2YXRlX2V2ZW50X3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdwRCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBcUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RixPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckQsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDNUUsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdkQsTUFBTSxNQUFNLHVCQUF1QixHQUFHO0lBQ3BDLGVBQWUsRUFBRSxZQUFZLENBQUM7SUFDOUIsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQixPQUFPLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztJQUN2QixNQUFNLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDakIsQ0FBQztBQWdCRixLQUFLLG9CQUFvQixHQUFHLElBQUksR0FBRztJQUNqQyxlQUFlLEVBQUUsWUFBWSxDQUFDO0lBQzlCLEtBQUssRUFBRSxZQUFZLENBQUM7SUFDcEIsMkNBQTJDO0lBQzNDLGNBQWMsRUFBRSxNQUFNLENBQUM7SUFDdkIseUVBQXlFO0lBQ3pFLGNBQWMsRUFBRSxNQUFNLENBQUM7Q0FDeEIsQ0FBQztBQUVGOztHQUVHO0FBQ0gscUJBQWEsaUJBQWtCLFlBQVcsV0FBVzs7SUFDbkQsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQW1CO0lBZTdDLE1BQU0seUNBQXVDO0lBRTdDLFlBQVksS0FBSyxFQUFFLGlCQUFpQixFQVFuQztJQU1LLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FlekM7SUFFRCxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBRzFDO0lBb0REOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsb0JBQW9CLENBQ2xCLGFBQWEsRUFBRSxhQUFhLEVBQzVCLFVBQVUsRUFBRSxFQUFFLEVBQ2QsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUNoQixxQkFBcUIsRUFBRSxFQUFFLEVBQ3pCLFFBQVEsRUFBRSxvQkFBb0IsRUFDOUIsS0FBSyxFQUFFLE1BQU0sR0FDWixPQUFPLENBQUMsSUFBSSxDQUFDLENBa0NmO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNVLGdCQUFnQixDQUMzQixhQUFhLEVBQUUsYUFBYSxFQUM1QixNQUFNLEVBQUUsdUJBQXVCLEdBQzlCLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBdUQvQjtJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ1UsUUFBUSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0E0QnBGO0NBQ0YifQ==
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZV9ldmVudF9zdG9yZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0b3JhZ2UvcHJpdmF0ZV9ldmVudF9zdG9yZS9wcml2YXRlX2V2ZW50X3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdwRCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBcUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RixPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckQsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDNUUsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHdkQsTUFBTSxNQUFNLHVCQUF1QixHQUFHO0lBQ3BDLGVBQWUsRUFBRSxZQUFZLENBQUM7SUFDOUIsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQixPQUFPLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztJQUN2QixNQUFNLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDakIsQ0FBQztBQUVGLEtBQUssb0JBQW9CLEdBQUcsSUFBSSxHQUFHO0lBQ2pDLGVBQWUsRUFBRSxZQUFZLENBQUM7SUFDOUIsS0FBSyxFQUFFLFlBQVksQ0FBQztJQUNwQiwyQ0FBMkM7SUFDM0MsY0FBYyxFQUFFLE1BQU0sQ0FBQztJQUN2Qix5RUFBeUU7SUFDekUsY0FBYyxFQUFFLE1BQU0sQ0FBQztDQUN4QixDQUFDO0FBRUY7O0dBRUc7QUFDSCxxQkFBYSxpQkFBa0IsWUFBVyxXQUFXOztJQUNuRCxRQUFRLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBbUI7SUFnQjdDLE1BQU0seUNBQXVDO0lBRTdDLFlBQVksS0FBSyxFQUFFLGlCQUFpQixFQVFuQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsb0JBQW9CLENBQ2xCLGFBQWEsRUFBRSxhQUFhLEVBQzVCLFVBQVUsRUFBRSxFQUFFLEVBQ2QsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUNoQixxQkFBcUIsRUFBRSxFQUFFLEVBQ3pCLFFBQVEsRUFBRSxvQkFBb0IsRUFDOUIsS0FBSyxFQUFFLE1BQU0saUJBeUNkO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLGdCQUFnQixDQUNyQixhQUFhLEVBQUUsYUFBYSxFQUM1QixNQUFNLEVBQUUsdUJBQXVCLEdBQzlCLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBK0UvQjtJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ1UsUUFBUSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FzQ3BGO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0csTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWdCekM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FHMUM7Q0EwRUYifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"private_event_store.d.ts","sourceRoot":"","sources":["../../../src/storage/private_event_store/private_event_store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAGpD,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,iBAAiB,CAAC;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,MAAM,uBAAuB,GAAG;IACpC,eAAe,EAAE,YAAY,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAgBF,KAAK,oBAAoB,GAAG,IAAI,GAAG;IACjC,eAAe,EAAE,YAAY,CAAC;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,qBAAa,iBAAkB,YAAW,WAAW;;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAmB;IAe7C,MAAM,yCAAuC;IAE7C,YAAY,KAAK,EAAE,iBAAiB,EAQnC;IAMK,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAezC;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1C;IAoDD;;;;;;;;;;;OAWG;IACH,oBAAoB,CAClB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,EAAE,EACd,UAAU,EAAE,EAAE,EAAE,EAChB,qBAAqB,EAAE,EAAE,EACzB,QAAQ,EAAE,oBAAoB,EAC9B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAkCf;IAED;;;;;;;;;;OAUG;IACU,gBAAgB,CAC3B,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAuD/B;IAED;;;;;;;;;;;;;;;;OAgBG;IACU,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BpF;CACF"}
1
+ {"version":3,"file":"private_event_store.d.ts","sourceRoot":"","sources":["../../../src/storage/private_event_store/private_event_store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAGpD,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,iBAAiB,CAAC;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGvD,MAAM,MAAM,uBAAuB,GAAG;IACpC,eAAe,EAAE,YAAY,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,oBAAoB,GAAG,IAAI,GAAG;IACjC,eAAe,EAAE,YAAY,CAAC;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,qBAAa,iBAAkB,YAAW,WAAW;;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAmB;IAgB7C,MAAM,yCAAuC;IAE7C,YAAY,KAAK,EAAE,iBAAiB,EAQnC;IAED;;;;;;;;;;;OAWG;IACH,oBAAoB,CAClB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,EAAE,EACd,UAAU,EAAE,EAAE,EAAE,EAChB,qBAAqB,EAAE,EAAE,EACzB,QAAQ,EAAE,oBAAoB,EAC9B,KAAK,EAAE,MAAM,iBAyCd;IAED;;;;;;;;;;OAUG;IACI,gBAAgB,CACrB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA+E/B;IAED;;;;;;;;;;;;;;;;OAgBG;IACU,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCpF;IAED;;;;;;;;;OASG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzC;IAED;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1C;CA0EF"}
@@ -1,86 +1,25 @@
1
1
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
- import { Fr } from '@aztec/foundation/curves/bn254';
3
2
  import { createLogger } from '@aztec/foundation/log';
4
- import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
5
- import { L2BlockHash } from '@aztec/stdlib/block';
6
- import { TxHash } from '@aztec/stdlib/tx';
3
+ import { Semaphore } from '@aztec/foundation/queue';
4
+ import { StoredPrivateEvent } from './stored_private_event.js';
7
5
  /**
8
6
  * Stores decrypted private event logs.
9
7
  */ export class PrivateEventStore {
10
8
  storeName = 'private_event';
11
9
  #store;
12
- /** Map storing the actual private event log entries, keyed by siloedEventCommitment */ #eventLogs;
13
- /** Multi-map from contractAddress_scope_eventSelector to siloedEventCommitment for efficient lookup */ #eventsByContractScopeSelector;
10
+ /** Actual private event log entries, keyed by siloedEventCommitment */ #events;
11
+ /** Multi-map from contractAddress_eventSelector to siloedEventCommitment for efficient lookup */ #eventsByContractAndEventSelector;
14
12
  /** Multi-map from block number to siloedEventCommitment for rollback support */ #eventsByBlockNumber;
15
- /** Map from siloedEventCommitment to boolean indicating if log has been seen. */ #seenLogs;
16
- /** jobId => eventId (event siloed nullifier) => PrivateEventEntry */ #eventLogsInJobStage;
13
+ /** jobId => eventId (event siloed nullifier) => StoredPrivateEvent */ #eventsForJob;
14
+ /** Per-job locks to prevent concurrent writes from affecting each other. */ #jobLocks;
17
15
  logger = createLogger('private_event_store');
18
16
  constructor(store){
19
17
  this.#store = store;
20
- this.#eventLogs = this.#store.openMap('private_event_logs');
21
- this.#eventsByContractScopeSelector = this.#store.openMultiMap('events_by_contract_scope_selector');
22
- this.#seenLogs = this.#store.openMap('seen_logs');
18
+ this.#events = this.#store.openMap('private_event_logs');
19
+ this.#eventsByContractAndEventSelector = this.#store.openMultiMap('events_by_contract_selector');
23
20
  this.#eventsByBlockNumber = this.#store.openMultiMap('events_by_block_number');
24
- this.#eventLogsInJobStage = new Map();
25
- }
26
- #keyFor(contractAddress, scope, eventSelector) {
27
- return `${contractAddress.toString()}_${scope.toString()}_${eventSelector.toString()}`;
28
- }
29
- async commit(jobId) {
30
- await Promise.all([
31
- ...this.#getEventLogsInJobStage(jobId).entries()
32
- ].map(async ([eventId, eventEntry])=>{
33
- this.logger.verbose('storing private event log (KV store)', eventEntry);
34
- await Promise.all([
35
- this.#eventLogs.set(eventId, eventEntry),
36
- this.#eventsByContractScopeSelector.set(eventEntry.lookupKey, eventId),
37
- this.#eventsByBlockNumber.set(eventEntry.l2BlockNumber, eventId),
38
- this.#seenLogs.set(eventId, true)
39
- ]);
40
- }));
41
- return this.discardStaged(jobId);
42
- }
43
- discardStaged(jobId) {
44
- this.#eventLogsInJobStage.delete(jobId);
45
- return Promise.resolve();
46
- }
47
- #getEventLogsInJobStage(jobId) {
48
- let jobStage = this.#eventLogsInJobStage.get(jobId);
49
- if (jobStage === undefined) {
50
- jobStage = new Map();
51
- this.#eventLogsInJobStage.set(jobId, jobStage);
52
- }
53
- return jobStage;
54
- }
55
- async #isSeenLog(jobId, eventId) {
56
- const eventLogsInJobStage = this.#getEventLogsInJobStage(jobId).get(eventId);
57
- return !!eventLogsInJobStage || !!await this.#seenLogs.getAsync(eventId);
58
- }
59
- #addEventLogToStage(jobId, eventId, eventEntry) {
60
- this.#getEventLogsInJobStage(jobId).set(eventId, eventEntry);
61
- }
62
- async #getEventSiloedNullifiers(contractAddress, scope, eventSelector, jobId) {
63
- const key = this.#keyFor(contractAddress, scope, eventSelector);
64
- const eventSiloedNullifiersInStorage = [];
65
- for await (const eventId of this.#eventsByContractScopeSelector.getValuesAsync(key)){
66
- eventSiloedNullifiersInStorage.push(eventId);
67
- }
68
- if (!jobId) {
69
- return eventSiloedNullifiersInStorage;
70
- }
71
- const eventSiloedNullifiersInJobStage = new Set([
72
- ...this.#getEventLogsInJobStage(jobId).entries()
73
- ].filter(([_, entry])=>entry.lookupKey === key).map(([idx, _])=>idx));
74
- return [
75
- ...new Set(eventSiloedNullifiersInStorage).union(eventSiloedNullifiersInJobStage)
76
- ];
77
- }
78
- async #getEventLogBySiloedNullifier(eventId, jobId) {
79
- if (jobId) {
80
- return this.#getEventLogsInJobStage(jobId).get(eventId) ?? await this.#eventLogs.getAsync(eventId);
81
- } else {
82
- return await this.#eventLogs.getAsync(eventId);
83
- }
21
+ this.#eventsForJob = new Map();
22
+ this.#jobLocks = new Map();
84
23
  }
85
24
  /**
86
25
  * Store a private event log.
@@ -94,37 +33,27 @@ import { TxHash } from '@aztec/stdlib/tx';
94
33
  * txHash - The transaction hash of the event log.
95
34
  * blockNumber - The block number in which the event was emitted.
96
35
  */ storePrivateEventLog(eventSelector, randomness, msgContent, siloedEventCommitment, metadata, jobId) {
97
- const { contractAddress, scope, txHash, l2BlockNumber, l2BlockHash, txIndexInBlock, eventIndexInTx } = metadata;
98
- return this.#store.transactionAsync(async ()=>{
99
- const key = this.#keyFor(contractAddress, scope, eventSelector);
100
- // The siloed event commitment is guaranteed to be unique as it's inserted into the nullifier tree. For this
101
- // reason we use it as id.
102
- const eventId = siloedEventCommitment.toString();
103
- const hasBeenSeen = await this.#isSeenLog(jobId, eventId);
104
- if (hasBeenSeen) {
105
- this.logger.verbose('Ignoring duplicate event log', {
106
- txHash: txHash.toString(),
107
- siloedEventCommitment
36
+ return this.#withJobLock(jobId, ()=>this.#store.transactionAsync(async ()=>{
37
+ const { contractAddress, scope, txHash, l2BlockNumber, l2BlockHash, txIndexInBlock, eventIndexInTx } = metadata;
38
+ const eventId = siloedEventCommitment.toString();
39
+ this.logger.verbose('storing private event log (job stage)', {
40
+ eventId,
41
+ contractAddress,
42
+ scope,
43
+ msgContent,
44
+ l2BlockNumber
108
45
  });
109
- return;
110
- }
111
- this.logger.verbose('storing private event log (job stage)', {
112
- contractAddress,
113
- scope,
114
- msgContent,
115
- l2BlockNumber
116
- });
117
- this.#addEventLogToStage(jobId, eventId, {
118
- randomness,
119
- msgContent: serializeToBuffer(msgContent),
120
- l2BlockNumber,
121
- l2BlockHash: l2BlockHash.toBuffer(),
122
- txHash: txHash.toBuffer(),
123
- txIndexInBlock,
124
- eventIndexInTx,
125
- lookupKey: key
126
- });
127
- });
46
+ const existing = await this.#readEvent(eventId, jobId);
47
+ if (existing) {
48
+ // If we already stored this event, we still want to make sure to track it for the given scope
49
+ existing.addScope(scope.toString());
50
+ this.#writeEvent(eventId, existing, jobId);
51
+ } else {
52
+ this.#writeEvent(eventId, new StoredPrivateEvent(randomness, msgContent, l2BlockNumber, l2BlockHash, txHash, txIndexInBlock, eventIndexInTx, contractAddress, eventSelector, new Set([
53
+ scope.toString()
54
+ ])), jobId);
55
+ }
56
+ }));
128
57
  }
129
58
  /**
130
59
  * Returns the private events given search parameters.
@@ -136,49 +65,67 @@ import { TxHash } from '@aztec/stdlib/tx';
136
65
  * scope: - The addresses that decrypted the logs.
137
66
  * @returns - The event log contents, augmented with metadata about the transaction and block in which the event was
138
67
  * included.
139
- */ async getPrivateEvents(eventSelector, filter) {
140
- const events = [];
141
- for (const scope of filter.scopes){
142
- const eventIds = await this.#getEventSiloedNullifiers(filter.contractAddress, scope, eventSelector);
143
- for (const eventId of eventIds){
144
- const entry = await this.#getEventLogBySiloedNullifier(eventId);
145
- if (!entry || entry.l2BlockNumber < filter.fromBlock || entry.l2BlockNumber >= filter.toBlock) {
68
+ */ getPrivateEvents(eventSelector, filter) {
69
+ return this.#store.transactionAsync(async ()=>{
70
+ const key = this.#keyFor(filter.contractAddress, eventSelector);
71
+ const targetScopes = new Set(filter.scopes.map((s)=>s.toString()));
72
+ // Map from eventId to the promise that reads the event buffer.
73
+ // We start reads during iteration to keep DB requests pending and avoid IndexedDB auto-commit.
74
+ const eventReadPromises = new Map();
75
+ for await (const eventId of this.#eventsByContractAndEventSelector.getValuesAsync(key)){
76
+ eventReadPromises.set(eventId, this.#events.getAsync(eventId));
77
+ }
78
+ const eventIds = [
79
+ ...eventReadPromises.keys()
80
+ ];
81
+ const eventBuffers = await Promise.all(eventReadPromises.values());
82
+ const events = [];
83
+ for(let i = 0; i < eventIds.length; i++){
84
+ const eventId = eventIds[i];
85
+ const eventBuffer = eventBuffers[i];
86
+ // Defensive, if it happens, there's a problem with how we're handling #eventsByContractAndEventSelector
87
+ if (!eventBuffer) {
88
+ this.logger.verbose(`EventId ${eventId} does not exist in main index but it is referenced from contract event selector index`);
89
+ continue;
90
+ }
91
+ const storedPrivateEvent = StoredPrivateEvent.fromBuffer(eventBuffer);
92
+ // Filter by block range
93
+ if (storedPrivateEvent.l2BlockNumber < filter.fromBlock || storedPrivateEvent.l2BlockNumber >= filter.toBlock) {
94
+ continue;
95
+ }
96
+ // Filter by scopes
97
+ if (storedPrivateEvent.scopes.intersection(targetScopes).size === 0) {
146
98
  continue;
147
99
  }
148
- // Convert buffer back to Fr array
149
- const reader = BufferReader.asReader(entry.msgContent);
150
- const numFields = entry.msgContent.length / Fr.SIZE_IN_BYTES;
151
- const msgContent = reader.readArray(numFields, Fr);
152
- const txHash = TxHash.fromBuffer(entry.txHash);
153
- const l2BlockHash = L2BlockHash.fromBuffer(entry.l2BlockHash);
154
- if (filter.txHash && !txHash.equals(filter.txHash)) {
100
+ // Filter by txHash
101
+ if (filter.txHash && !storedPrivateEvent.txHash.equals(filter.txHash)) {
155
102
  continue;
156
103
  }
157
104
  events.push({
158
- l2BlockNumber: entry.l2BlockNumber,
159
- txIndexInBlock: entry.txIndexInBlock,
160
- eventIndexInTx: entry.eventIndexInTx,
105
+ l2BlockNumber: storedPrivateEvent.l2BlockNumber,
106
+ txIndexInBlock: storedPrivateEvent.txIndexInBlock,
107
+ eventIndexInTx: storedPrivateEvent.eventIndexInTx,
161
108
  event: {
162
- packedEvent: msgContent,
163
- l2BlockNumber: BlockNumber(entry.l2BlockNumber),
164
- txHash,
165
- l2BlockHash,
109
+ packedEvent: storedPrivateEvent.msgContent,
110
+ l2BlockNumber: BlockNumber(storedPrivateEvent.l2BlockNumber),
111
+ txHash: storedPrivateEvent.txHash,
112
+ l2BlockHash: storedPrivateEvent.l2BlockHash,
166
113
  eventSelector
167
114
  }
168
115
  });
169
116
  }
170
- }
171
- // Sort by block number, then by tx index within block, then by event index within tx
172
- events.sort((a, b)=>{
173
- if (a.l2BlockNumber !== b.l2BlockNumber) {
174
- return a.l2BlockNumber - b.l2BlockNumber;
175
- }
176
- if (a.txIndexInBlock !== b.txIndexInBlock) {
177
- return a.txIndexInBlock - b.txIndexInBlock;
178
- }
179
- return a.eventIndexInTx - b.eventIndexInTx;
117
+ // Sort by block number, then by tx index within block, then by event index within tx
118
+ events.sort((a, b)=>{
119
+ if (a.l2BlockNumber !== b.l2BlockNumber) {
120
+ return a.l2BlockNumber - b.l2BlockNumber;
121
+ }
122
+ if (a.txIndexInBlock !== b.txIndexInBlock) {
123
+ return a.txIndexInBlock - b.txIndexInBlock;
124
+ }
125
+ return a.eventIndexInTx - b.eventIndexInTx;
126
+ });
127
+ return events.map((ev)=>ev.event);
180
128
  });
181
- return events.map((ev)=>ev.event);
182
129
  }
183
130
  /**
184
131
  * Rolls back private events that were stored after a given `blockNumber` and up to `synchedBlockNumber` (the block
@@ -197,26 +144,130 @@ import { TxHash } from '@aztec/stdlib/tx';
197
144
  *
198
145
  * IMPORTANT: This method must be called within a transaction to ensure atomicity.
199
146
  */ async rollback(blockNumber, synchedBlockNumber) {
200
- let removedCount = 0;
147
+ // First pass: collect all event IDs for all blocks, starting reads during iteration to keep tx alive.
148
+ const eventsByBlock = new Map();
201
149
  for(let block = blockNumber + 1; block <= synchedBlockNumber; block++){
202
- const eventIds = [];
150
+ const blockEvents = [];
203
151
  for await (const eventId of this.#eventsByBlockNumber.getValuesAsync(block)){
204
- eventIds.push(eventId);
152
+ // Start read immediately during iteration to keep IndexedDB transaction alive
153
+ blockEvents.push({
154
+ eventId,
155
+ eventReadPromise: this.#events.getAsync(eventId)
156
+ });
205
157
  }
206
- if (eventIds.length > 0) {
207
- await this.#eventsByBlockNumber.delete(block);
208
- for (const eventId of eventIds){
209
- const entry = await this.#eventLogs.getAsync(eventId);
210
- if (!entry) {
211
- throw new Error(`Event log not found for eventId ${eventId}`);
212
- }
213
- await this.#eventLogs.delete(eventId);
214
- await this.#seenLogs.delete(eventId);
215
- await this.#eventsByContractScopeSelector.deleteValue(entry.lookupKey, eventId);
216
- removedCount++;
158
+ if (blockEvents.length > 0) {
159
+ eventsByBlock.set(block, blockEvents);
160
+ }
161
+ }
162
+ // Second pass: await reads and perform deletes
163
+ let removedCount = 0;
164
+ for (const [block, events] of eventsByBlock){
165
+ await this.#eventsByBlockNumber.delete(block);
166
+ for (const { eventId, eventReadPromise } of events){
167
+ const buffer = await eventReadPromise;
168
+ if (!buffer) {
169
+ throw new Error(`Event not found for eventId ${eventId}`);
217
170
  }
171
+ const entry = StoredPrivateEvent.fromBuffer(buffer);
172
+ await this.#events.delete(eventId);
173
+ await this.#eventsByContractAndEventSelector.deleteValue(this.#keyFor(entry.contractAddress, entry.eventSelector), eventId);
174
+ removedCount++;
218
175
  }
219
176
  }
220
177
  this.logger.verbose(`Rolled back ${removedCount} private events after block ${blockNumber}`);
221
178
  }
179
+ /**
180
+ * Commits in memory job data to persistent storage.
181
+ *
182
+ * Called by JobCoordinator when a job completes successfully.
183
+ *
184
+ * Note: JobCoordinator wraps all commits in a single transaction, so we don't need our own transactionAsync here
185
+ * (and using one would throw on IndexedDB as it does not support nested txs).
186
+ *
187
+ * @param jobId - The jobId identifying which staged data to commit
188
+ */ async commit(jobId) {
189
+ // Note: Don't use #withJobLock here - commit runs within JobCoordinator's transactionAsync,
190
+ // and awaiting the lock would create a microtask boundary with no pending DB request,
191
+ // causing IndexedDB to auto-commit the transaction.
192
+ for (const [eventId, entry] of this.#getEventsForJob(jobId).entries()){
193
+ const lookupKey = this.#keyFor(entry.contractAddress, entry.eventSelector);
194
+ this.logger.verbose('storing private event log', {
195
+ eventId,
196
+ lookupKey
197
+ });
198
+ await Promise.all([
199
+ this.#events.set(eventId, entry.toBuffer()),
200
+ this.#eventsByContractAndEventSelector.set(lookupKey, eventId),
201
+ this.#eventsByBlockNumber.set(entry.l2BlockNumber, eventId)
202
+ ]);
203
+ }
204
+ this.#clearJobData(jobId);
205
+ }
206
+ /**
207
+ * Discards in memory job data without persisting it.
208
+ */ discardStaged(jobId) {
209
+ this.#clearJobData(jobId);
210
+ return Promise.resolve();
211
+ }
212
+ /**
213
+ * Reads an event from in-memory job data first, falling back to persistent storage if not found.
214
+ *
215
+ * Returns undefined if the event does not exist in the store overall.
216
+ */ async #readEvent(eventId, jobId) {
217
+ // Always issue DB read to keep IndexedDB transaction alive (they auto-commit when a new micro-task starts and there
218
+ // are no pending read requests). The staged value still takes precedence if it exists.
219
+ const buffer = await this.#events.getAsync(eventId);
220
+ const eventForJob = this.#getEventsForJob(jobId).get(eventId);
221
+ return eventForJob ?? (buffer ? StoredPrivateEvent.fromBuffer(buffer) : undefined);
222
+ }
223
+ /**
224
+ * Writes an event to in-memory job data.
225
+ *
226
+ * Writes are only allowed in a job context. Events modified during a job will only be persisted when `commit` is
227
+ * called.
228
+ */ #writeEvent(eventId, entry, jobId) {
229
+ this.#getEventsForJob(jobId).set(eventId, entry);
230
+ }
231
+ /**
232
+ * Get in-memory data only visible to @param jobId
233
+ */ #getEventsForJob(jobId) {
234
+ let eventsForJob = this.#eventsForJob.get(jobId);
235
+ if (eventsForJob === undefined) {
236
+ eventsForJob = new Map();
237
+ this.#eventsForJob.set(jobId, eventsForJob);
238
+ }
239
+ return eventsForJob;
240
+ }
241
+ /**
242
+ * Clear data structures supporting a specific job.
243
+ */ #clearJobData(jobId) {
244
+ this.#eventsForJob.delete(jobId);
245
+ this.#jobLocks.delete(jobId);
246
+ }
247
+ /**
248
+ * Ensures a function can only run once it acquires a unique per-job lock, and handles proper lock release after it
249
+ * runs.
250
+ *
251
+ * This primitive allows concurrent writes on this store without risking data corruption due to unsound write
252
+ * interleaving.
253
+ */ async #withJobLock(jobId, fn) {
254
+ let lock = this.#jobLocks.get(jobId);
255
+ if (!lock) {
256
+ lock = new Semaphore(1);
257
+ this.#jobLocks.set(jobId, lock);
258
+ }
259
+ await lock.acquire();
260
+ try {
261
+ return await fn();
262
+ } finally{
263
+ lock.release();
264
+ }
265
+ }
266
+ /**
267
+ * Returns a string key based on @param contractAddress and @param eventSelector.
268
+ *
269
+ * The returned key is meant to be used when interacting with index #eventsByContractAndEventSelector.
270
+ */ #keyFor(contractAddress, eventSelector) {
271
+ return `${contractAddress.toString()}_${eventSelector.toString()}`;
272
+ }
222
273
  }
@@ -0,0 +1,23 @@
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
+ import { EventSelector } from '@aztec/stdlib/abi';
3
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
4
+ import { BlockHash } from '@aztec/stdlib/block';
5
+ import { TxHash } from '@aztec/stdlib/tx';
6
+ /** Serializable private event entry with scope tracking. */
7
+ export declare class StoredPrivateEvent {
8
+ readonly randomness: Fr;
9
+ readonly msgContent: Fr[];
10
+ readonly l2BlockNumber: number;
11
+ readonly l2BlockHash: BlockHash;
12
+ readonly txHash: TxHash;
13
+ readonly txIndexInBlock: number;
14
+ readonly eventIndexInTx: number;
15
+ readonly contractAddress: AztecAddress;
16
+ readonly eventSelector: EventSelector;
17
+ readonly scopes: Set<string>;
18
+ constructor(randomness: Fr, msgContent: Fr[], l2BlockNumber: number, l2BlockHash: BlockHash, txHash: TxHash, txIndexInBlock: number, eventIndexInTx: number, contractAddress: AztecAddress, eventSelector: EventSelector, scopes: Set<string>);
19
+ addScope(scope: string): void;
20
+ toBuffer(): Buffer;
21
+ static fromBuffer(buffer: Buffer): StoredPrivateEvent;
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVkX3ByaXZhdGVfZXZlbnQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdG9yYWdlL3ByaXZhdGVfZXZlbnRfc3RvcmUvc3RvcmVkX3ByaXZhdGVfZXZlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQyw0REFBNEQ7QUFDNUQscUJBQWEsa0JBQWtCO0lBRTNCLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRTtJQUN2QixRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRTtJQUN6QixRQUFRLENBQUMsYUFBYSxFQUFFLE1BQU07SUFDOUIsUUFBUSxDQUFDLFdBQVcsRUFBRSxTQUFTO0lBQy9CLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTTtJQUN2QixRQUFRLENBQUMsY0FBYyxFQUFFLE1BQU07SUFDL0IsUUFBUSxDQUFDLGNBQWMsRUFBRSxNQUFNO0lBQy9CLFFBQVEsQ0FBQyxlQUFlLEVBQUUsWUFBWTtJQUN0QyxRQUFRLENBQUMsYUFBYSxFQUFFLGFBQWE7SUFDckMsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDO0lBVjlCLFlBQ1csVUFBVSxFQUFFLEVBQUUsRUFDZCxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQ2hCLGFBQWEsRUFBRSxNQUFNLEVBQ3JCLFdBQVcsRUFBRSxTQUFTLEVBQ3RCLE1BQU0sRUFBRSxNQUFNLEVBQ2QsY0FBYyxFQUFFLE1BQU0sRUFDdEIsY0FBYyxFQUFFLE1BQU0sRUFDdEIsZUFBZSxFQUFFLFlBQVksRUFDN0IsYUFBYSxFQUFFLGFBQWEsRUFDNUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFDMUI7SUFFSixRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sUUFFckI7SUFFRCxRQUFRLElBQUksTUFBTSxDQWdCakI7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsa0JBQWtCLENBMkJwRDtDQUNGIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stored_private_event.d.ts","sourceRoot":"","sources":["../../../src/storage/private_event_store/stored_private_event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,4DAA4D;AAC5D,qBAAa,kBAAkB;IAE3B,QAAQ,CAAC,UAAU,EAAE,EAAE;IACvB,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM;IAC9B,QAAQ,CAAC,WAAW,EAAE,SAAS;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM;IAC/B,QAAQ,CAAC,eAAe,EAAE,YAAY;IACtC,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC;IAV9B,YACW,UAAU,EAAE,EAAE,EACd,UAAU,EAAE,EAAE,EAAE,EAChB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,SAAS,EACtB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,YAAY,EAC7B,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,EAC1B;IAEJ,QAAQ,CAAC,KAAK,EAAE,MAAM,QAErB;IAED,QAAQ,IAAI,MAAM,CAgBjB;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CA2BpD;CACF"}
@@ -0,0 +1,56 @@
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
+ import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
3
+ import { EventSelector } from '@aztec/stdlib/abi';
4
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
5
+ import { BlockHash } from '@aztec/stdlib/block';
6
+ import { TxHash } from '@aztec/stdlib/tx';
7
+ /** Serializable private event entry with scope tracking. */ export class StoredPrivateEvent {
8
+ randomness;
9
+ msgContent;
10
+ l2BlockNumber;
11
+ l2BlockHash;
12
+ txHash;
13
+ txIndexInBlock;
14
+ eventIndexInTx;
15
+ contractAddress;
16
+ eventSelector;
17
+ scopes;
18
+ constructor(randomness, msgContent, l2BlockNumber, l2BlockHash, txHash, txIndexInBlock, eventIndexInTx, contractAddress, eventSelector, scopes){
19
+ this.randomness = randomness;
20
+ this.msgContent = msgContent;
21
+ this.l2BlockNumber = l2BlockNumber;
22
+ this.l2BlockHash = l2BlockHash;
23
+ this.txHash = txHash;
24
+ this.txIndexInBlock = txIndexInBlock;
25
+ this.eventIndexInTx = eventIndexInTx;
26
+ this.contractAddress = contractAddress;
27
+ this.eventSelector = eventSelector;
28
+ this.scopes = scopes;
29
+ }
30
+ addScope(scope) {
31
+ this.scopes.add(scope);
32
+ }
33
+ toBuffer() {
34
+ const scopesArray = [
35
+ ...this.scopes
36
+ ];
37
+ return serializeToBuffer(this.randomness, this.msgContent.length, ...this.msgContent, this.l2BlockNumber, this.l2BlockHash, this.txHash, this.txIndexInBlock, this.eventIndexInTx, this.contractAddress, this.eventSelector.toBuffer(), scopesArray.length, ...scopesArray);
38
+ }
39
+ static fromBuffer(buffer) {
40
+ const reader = BufferReader.asReader(buffer);
41
+ const randomness = Fr.fromBuffer(reader);
42
+ const msgContentLength = reader.readNumber();
43
+ const msgContent = reader.readArray(msgContentLength, Fr);
44
+ const l2BlockNumber = reader.readNumber();
45
+ const l2BlockHash = new BlockHash(Fr.fromBuffer(reader));
46
+ const txHash = TxHash.fromBuffer(reader);
47
+ const txIndexInBlock = reader.readNumber();
48
+ const eventIndexInTx = reader.readNumber();
49
+ const contractAddress = AztecAddress.fromBuffer(reader);
50
+ const eventSelector = EventSelector.fromBuffer(reader);
51
+ const scopes = reader.readVector({
52
+ fromBuffer: (r)=>r.readString()
53
+ });
54
+ return new StoredPrivateEvent(randomness, msgContent, l2BlockNumber, l2BlockHash, txHash, txIndexInBlock, eventIndexInTx, contractAddress, eventSelector, new Set(scopes));
55
+ }
56
+ }
@@ -25,4 +25,4 @@ export declare class RecipientTaggingStore implements StagedStore {
25
25
  getHighestFinalizedIndex(secret: DirectionalAppTaggingSecret, jobId: string): Promise<number | undefined>;
26
26
  updateHighestFinalizedIndex(secret: DirectionalAppTaggingSecret, index: number, jobId: string): Promise<void>;
27
27
  }
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXBpZW50X3RhZ2dpbmdfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdG9yYWdlL3RhZ2dpbmdfc3RvcmUvcmVjaXBpZW50X3RhZ2dpbmdfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFDeEUsT0FBTyxLQUFLLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUU1RTs7Ozs7OztHQU9HO0FBQ0gscUJBQWEscUJBQXNCLFlBQVcsV0FBVzs7SUFDdkQsU0FBUyxFQUFFLE1BQU0sQ0FBdUI7SUFheEMsWUFBWSxLQUFLLEVBQUUsaUJBQWlCLEVBUW5DO0lBc0NEOzs7O09BSUc7SUFDRyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBZ0J6QztJQUVELGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FJMUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsMkJBQTJCLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUVuRztJQUVLLHNCQUFzQixDQUFDLE1BQU0sRUFBRSwyQkFBMkIsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQU83RztJQUVELHdCQUF3QixDQUFDLE1BQU0sRUFBRSwyQkFBMkIsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBRXhHO0lBRUssMkJBQTJCLENBQUMsTUFBTSxFQUFFLDJCQUEyQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBUWxIO0NBQ0YifQ==
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXBpZW50X3RhZ2dpbmdfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdG9yYWdlL3RhZ2dpbmdfc3RvcmUvcmVjaXBpZW50X3RhZ2dpbmdfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFDeEUsT0FBTyxLQUFLLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUU1RTs7Ozs7OztHQU9HO0FBQ0gscUJBQWEscUJBQXNCLFlBQVcsV0FBVzs7SUFDdkQsU0FBUyxFQUFFLE1BQU0sQ0FBdUI7SUFheEMsWUFBWSxLQUFLLEVBQUUsaUJBQWlCLEVBUW5DO0lBNENEOzs7O09BSUc7SUFDRyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBZ0J6QztJQUVELGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FJMUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsMkJBQTJCLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUVuRztJQUVELHNCQUFzQixDQUFDLE1BQU0sRUFBRSwyQkFBMkIsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQVN2RztJQUVELHdCQUF3QixDQUFDLE1BQU0sRUFBRSwyQkFBMkIsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBRXhHO0lBRUQsMkJBQTJCLENBQUMsTUFBTSxFQUFFLDJCQUEyQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBVTVHO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"recipient_tagging_store.d.ts","sourceRoot":"","sources":["../../../src/storage/tagging_store/recipient_tagging_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAE5E;;;;;;;GAOG;AACH,qBAAa,qBAAsB,YAAW,WAAW;;IACvD,SAAS,EAAE,MAAM,CAAuB;IAaxC,YAAY,KAAK,EAAE,iBAAiB,EAQnC;IAsCD;;;;OAIG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzC;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1C;IAED,mBAAmB,CAAC,MAAM,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEnG;IAEK,sBAAsB,CAAC,MAAM,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO7G;IAED,wBAAwB,CAAC,MAAM,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAExG;IAEK,2BAA2B,CAAC,MAAM,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQlH;CACF"}
1
+ {"version":3,"file":"recipient_tagging_store.d.ts","sourceRoot":"","sources":["../../../src/storage/tagging_store/recipient_tagging_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAE5E;;;;;;;GAOG;AACH,qBAAa,qBAAsB,YAAW,WAAW;;IACvD,SAAS,EAAE,MAAM,CAAuB;IAaxC,YAAY,KAAK,EAAE,iBAAiB,EAQnC;IA4CD;;;;OAIG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzC;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1C;IAED,mBAAmB,CAAC,MAAM,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEnG;IAED,sBAAsB,CAAC,MAAM,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASvG;IAED,wBAAwB,CAAC,MAAM,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAExG;IAED,2BAA2B,CAAC,MAAM,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5G;CACF"}