@aztec/pxe 0.0.1-commit.3469e52 → 0.0.1-commit.43c09e3f

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 (179) 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 +4 -4
  9. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  10. package/dest/contract_function_simulator/contract_function_simulator.js +10 -13
  11. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +1 -1
  12. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +1 -1
  13. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +1 -1
  14. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +1 -1
  15. package/dest/contract_function_simulator/oracle/interfaces.d.ts +14 -11
  16. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/oracle/oracle.d.ts +6 -4
  18. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  19. package/dest/contract_function_simulator/oracle/oracle.js +48 -26
  20. package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -22
  21. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  22. package/dest/contract_function_simulator/oracle/private_execution.js +0 -37
  23. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +12 -3
  24. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  25. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +20 -9
  26. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +32 -21
  27. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +52 -59
  29. package/dest/contract_sync/contract_sync_service.d.ts +41 -0
  30. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
  31. package/dest/contract_sync/contract_sync_service.js +82 -0
  32. package/dest/contract_sync/helpers.d.ts +28 -0
  33. package/dest/contract_sync/helpers.d.ts.map +1 -0
  34. package/dest/contract_sync/helpers.js +55 -0
  35. package/dest/debug/pxe_debug_utils.d.ts +24 -9
  36. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  37. package/dest/debug/pxe_debug_utils.js +31 -17
  38. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  39. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  40. package/dest/entrypoints/client/bundle/utils.js +12 -6
  41. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  42. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  43. package/dest/entrypoints/client/lazy/utils.js +13 -7
  44. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  45. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  46. package/dest/entrypoints/server/index.d.ts +2 -1
  47. package/dest/entrypoints/server/index.d.ts.map +1 -1
  48. package/dest/entrypoints/server/index.js +1 -0
  49. package/dest/entrypoints/server/utils.d.ts +1 -1
  50. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  51. package/dest/entrypoints/server/utils.js +19 -8
  52. package/dest/events/event_service.d.ts +5 -6
  53. package/dest/events/event_service.d.ts.map +1 -1
  54. package/dest/events/event_service.js +6 -7
  55. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  56. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  57. package/dest/job_coordinator/job_coordinator.js +3 -2
  58. package/dest/logs/log_service.d.ts +6 -5
  59. package/dest/logs/log_service.d.ts.map +1 -1
  60. package/dest/logs/log_service.js +20 -19
  61. package/dest/notes/note_service.d.ts +6 -6
  62. package/dest/notes/note_service.d.ts.map +1 -1
  63. package/dest/notes/note_service.js +14 -14
  64. package/dest/oracle_version.d.ts +3 -3
  65. package/dest/oracle_version.d.ts.map +1 -1
  66. package/dest/oracle_version.js +4 -3
  67. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  68. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  69. package/dest/private_kernel/private_kernel_execution_prover.js +2 -2
  70. package/dest/private_kernel/private_kernel_oracle.d.ts +3 -3
  71. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  72. package/dest/pxe.d.ts +2 -1
  73. package/dest/pxe.d.ts.map +1 -1
  74. package/dest/pxe.js +33 -18
  75. package/dest/storage/address_store/address_store.d.ts +1 -1
  76. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  77. package/dest/storage/address_store/address_store.js +12 -11
  78. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  79. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  80. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  81. package/dest/storage/capsule_store/capsule_store.js +6 -8
  82. package/dest/storage/contract_store/contract_store.d.ts +1 -2
  83. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  84. package/dest/storage/contract_store/contract_store.js +22 -25
  85. package/dest/storage/metadata.d.ts +1 -1
  86. package/dest/storage/metadata.js +1 -1
  87. package/dest/storage/note_store/note_store.d.ts +48 -50
  88. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  89. package/dest/storage/note_store/note_store.js +276 -252
  90. package/dest/storage/note_store/stored_note.d.ts +16 -0
  91. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  92. package/dest/storage/note_store/stored_note.js +43 -0
  93. package/dest/storage/private_event_store/private_event_store.d.ts +17 -4
  94. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  95. package/dest/storage/private_event_store/private_event_store.js +198 -147
  96. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  97. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  98. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  99. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +1 -1
  100. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  101. package/dest/storage/tagging_store/recipient_tagging_store.js +31 -19
  102. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  103. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  104. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  105. package/dest/storage/tagging_store/sender_tagging_store.d.ts +1 -1
  106. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  107. package/dest/storage/tagging_store/sender_tagging_store.js +183 -113
  108. package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
  109. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  110. package/dest/tagging/get_all_logs_by_tags.js +46 -0
  111. package/dest/tagging/index.d.ts +2 -1
  112. package/dest/tagging/index.d.ts.map +1 -1
  113. package/dest/tagging/index.js +1 -0
  114. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
  115. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  116. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +2 -2
  117. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
  118. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  119. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +5 -2
  120. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
  121. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  122. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +2 -2
  123. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
  124. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  125. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
  126. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +3 -2
  127. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  128. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +7 -4
  129. package/package.json +25 -16
  130. package/src/bin/check_oracle_version.ts +1 -0
  131. package/src/block_synchronizer/block_synchronizer.ts +76 -33
  132. package/src/config/index.ts +14 -0
  133. package/src/contract_function_simulator/contract_function_simulator.ts +10 -15
  134. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +1 -1
  135. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -1
  136. package/src/contract_function_simulator/oracle/interfaces.ts +19 -10
  137. package/src/contract_function_simulator/oracle/oracle.ts +53 -23
  138. package/src/contract_function_simulator/oracle/private_execution.ts +1 -60
  139. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +34 -11
  140. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +72 -68
  141. package/src/contract_sync/contract_sync_service.ts +129 -0
  142. package/src/contract_sync/helpers.ts +93 -0
  143. package/src/debug/pxe_debug_utils.ts +65 -17
  144. package/src/entrypoints/client/bundle/utils.ts +7 -14
  145. package/src/entrypoints/client/lazy/utils.ts +8 -14
  146. package/src/entrypoints/pxe_creation_options.ts +2 -1
  147. package/src/entrypoints/server/index.ts +1 -0
  148. package/src/entrypoints/server/utils.ts +15 -19
  149. package/src/events/event_service.ts +5 -7
  150. package/src/job_coordinator/job_coordinator.ts +4 -3
  151. package/src/logs/log_service.ts +31 -15
  152. package/src/notes/note_service.ts +21 -20
  153. package/src/oracle_version.ts +4 -3
  154. package/src/private_kernel/private_kernel_execution_prover.ts +6 -3
  155. package/src/private_kernel/private_kernel_oracle.ts +2 -2
  156. package/src/pxe.ts +69 -18
  157. package/src/storage/address_store/address_store.ts +15 -15
  158. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  159. package/src/storage/capsule_store/capsule_store.ts +8 -8
  160. package/src/storage/contract_store/contract_store.ts +22 -31
  161. package/src/storage/metadata.ts +1 -1
  162. package/src/storage/note_store/note_store.ts +314 -318
  163. package/src/storage/note_store/stored_note.ts +48 -0
  164. package/src/storage/private_event_store/private_event_store.ts +250 -190
  165. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  166. package/src/storage/tagging_store/recipient_tagging_store.ts +31 -21
  167. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  168. package/src/storage/tagging_store/sender_tagging_store.ts +210 -126
  169. package/src/tagging/get_all_logs_by_tags.ts +68 -0
  170. package/src/tagging/index.ts +1 -0
  171. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +11 -1
  172. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
  173. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +3 -1
  174. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -17
  175. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +12 -3
  176. package/dest/tree_membership/tree_membership_service.d.ts +0 -50
  177. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  178. package/dest/tree_membership/tree_membership_service.js +0 -75
  179. package/src/tree_membership/tree_membership_service.ts +0 -97
package/src/pxe.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
2
2
  import { BlockNumber } from '@aztec/foundation/branded-types';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
- import { type Logger, createLogger } from '@aztec/foundation/log';
4
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
5
5
  import { SerialQueue } from '@aztec/foundation/queue';
6
6
  import { Timer } from '@aztec/foundation/timer';
7
7
  import { KeyStore } from '@aztec/key-store';
@@ -18,7 +18,6 @@ import {
18
18
  } from '@aztec/stdlib/abi';
19
19
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
20
20
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
21
- import { L2BlockHash } from '@aztec/stdlib/block';
22
21
  import {
23
22
  CompleteAddress,
24
23
  type ContractInstanceWithAddress,
@@ -59,8 +58,9 @@ import {
59
58
  ContractFunctionSimulator,
60
59
  generateSimulatedProvingResult,
61
60
  } from './contract_function_simulator/contract_function_simulator.js';
62
- import { readCurrentClassId } from './contract_function_simulator/oracle/private_execution.js';
63
61
  import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
62
+ import { ContractSyncService } from './contract_sync/contract_sync_service.js';
63
+ import { readCurrentClassId } from './contract_sync/helpers.js';
64
64
  import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
65
65
  import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
66
66
  import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
@@ -103,6 +103,7 @@ export class PXE {
103
103
  private recipientTaggingStore: RecipientTaggingStore,
104
104
  private addressStore: AddressStore,
105
105
  private privateEventStore: PrivateEventStore,
106
+ private contractSyncService: ContractSyncService,
106
107
  private simulator: CircuitSimulator,
107
108
  private proverEnabled: boolean,
108
109
  private proofCreator: PrivateKernelProver,
@@ -129,6 +130,10 @@ export class PXE {
129
130
  config: PXEConfig,
130
131
  loggerOrSuffix?: string | Logger,
131
132
  ) {
133
+ // Extract bindings from the logger, or use empty bindings if a string suffix is provided.
134
+ const bindings: LoggerBindings | undefined =
135
+ loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
136
+
132
137
  const log =
133
138
  !loggerOrSuffix || typeof loggerOrSuffix === 'string'
134
139
  ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
@@ -138,7 +143,7 @@ export class PXE {
138
143
  const addressStore = new AddressStore(store);
139
144
  const privateEventStore = new PrivateEventStore(store);
140
145
  const contractStore = new ContractStore(store);
141
- const noteStore = await NoteStore.create(store);
146
+ const noteStore = new NoteStore(store);
142
147
  const anchorBlockStore = new AnchorBlockStore(store);
143
148
  const senderTaggingStore = new SenderTaggingStore(store);
144
149
  const senderAddressBookStore = new SenderAddressBookStore(store);
@@ -146,6 +151,12 @@ export class PXE {
146
151
  const capsuleStore = new CapsuleStore(store);
147
152
  const keyStore = new KeyStore(store);
148
153
  const tipsStore = new L2TipsKVStore(store, 'pxe');
154
+ const contractSyncService = new ContractSyncService(
155
+ node,
156
+ contractStore,
157
+ noteStore,
158
+ createLogger('pxe:contract_sync', bindings),
159
+ );
149
160
  const synchronizer = new BlockSynchronizer(
150
161
  node,
151
162
  store,
@@ -153,14 +164,22 @@ export class PXE {
153
164
  noteStore,
154
165
  privateEventStore,
155
166
  tipsStore,
167
+ contractSyncService,
156
168
  config,
157
- loggerOrSuffix,
169
+ bindings,
158
170
  );
159
171
 
160
- const jobCoordinator = new JobCoordinator(store);
161
- jobCoordinator.registerStores([capsuleStore, senderTaggingStore, recipientTaggingStore, privateEventStore]);
172
+ const jobCoordinator = new JobCoordinator(store, bindings);
173
+ jobCoordinator.registerStores([
174
+ capsuleStore,
175
+ senderTaggingStore,
176
+ recipientTaggingStore,
177
+ privateEventStore,
178
+ noteStore,
179
+ contractSyncService,
180
+ ]);
162
181
 
163
- const debugUtils = new PXEDebugUtils(contractStore, noteStore);
182
+ const debugUtils = new PXEDebugUtils(contractSyncService, noteStore, synchronizer, anchorBlockStore);
164
183
 
165
184
  const jobQueue = new SerialQueue();
166
185
 
@@ -177,6 +196,7 @@ export class PXE {
177
196
  recipientTaggingStore,
178
197
  addressStore,
179
198
  privateEventStore,
199
+ contractSyncService,
180
200
  simulator,
181
201
  proverEnabled,
182
202
  proofCreator,
@@ -187,7 +207,11 @@ export class PXE {
187
207
  debugUtils,
188
208
  );
189
209
 
190
- debugUtils.setPXE(pxe);
210
+ debugUtils.setPXEHelpers(
211
+ pxe.#putInJobQueue.bind(pxe),
212
+ pxe.#getSimulatorForTx.bind(pxe),
213
+ pxe.#simulateUtility.bind(pxe),
214
+ );
191
215
 
192
216
  pxe.jobQueue.start();
193
217
 
@@ -208,13 +232,13 @@ export class PXE {
208
232
  this.keyStore,
209
233
  this.addressStore,
210
234
  BenchmarkedNodeFactory.create(this.node),
211
- this.anchorBlockStore,
212
235
  this.senderTaggingStore,
213
236
  this.recipientTaggingStore,
214
237
  this.senderAddressBookStore,
215
238
  this.capsuleStore,
216
239
  this.privateEventStore,
217
240
  this.simulator,
241
+ this.contractSyncService,
218
242
  );
219
243
  }
220
244
 
@@ -289,6 +313,14 @@ export class PXE {
289
313
  try {
290
314
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
291
315
 
316
+ await this.contractSyncService.ensureContractSynced(
317
+ contractAddress,
318
+ functionSelector,
319
+ privateSyncCall => this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
320
+ anchorBlockHeader,
321
+ jobId,
322
+ );
323
+
292
324
  const result = await contractFunctionSimulator.run(
293
325
  txRequest,
294
326
  contractAddress,
@@ -384,9 +416,14 @@ export class PXE {
384
416
  config: PrivateKernelExecutionProverConfig,
385
417
  ): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
386
418
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
387
- const anchorBlockHash = L2BlockHash.fromField(await anchorBlockHeader.hash());
419
+ const anchorBlockHash = await anchorBlockHeader.hash();
388
420
  const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
389
- const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled);
421
+ const kernelTraceProver = new PrivateKernelExecutionProver(
422
+ kernelOracle,
423
+ proofCreator,
424
+ !this.proverEnabled,
425
+ this.log.getBindings(),
426
+ );
390
427
  this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
391
428
  return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
392
429
  }
@@ -428,7 +465,6 @@ export class PXE {
428
465
  }
429
466
 
430
467
  await this.addressStore.addCompleteAddress(accountCompleteAddress);
431
- await this.noteStore.addScope(accountCompleteAddress.address);
432
468
  return accountCompleteAddress;
433
469
  }
434
470
 
@@ -827,7 +863,14 @@ export class PXE {
827
863
  // Temporary: in case there are overrides, we have to skip the kernels or validations
828
864
  // will fail. Consider handing control to the user/wallet on whether they want to run them
829
865
  // or not.
830
- const skipKernels = overrides?.contracts !== undefined && Object.keys(overrides.contracts ?? {}).length > 0;
866
+ const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
867
+ const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
868
+ const skipKernels = hasOverriddenContracts;
869
+
870
+ // Set overridden contracts on the sync service so it knows to skip syncing them
871
+ if (hasOverriddenContracts) {
872
+ this.contractSyncService.setOverriddenContracts(jobId, overriddenContracts);
873
+ }
831
874
 
832
875
  // Execution of private functions only; no proving, and no kernel logic.
833
876
  const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
@@ -948,8 +991,13 @@ export class PXE {
948
991
  const functionTimer = new Timer();
949
992
  const contractFunctionSimulator = this.#getSimulatorForTx();
950
993
 
951
- await this.contractStore.syncPrivateState(call.to, call.selector, privateSyncCall =>
952
- this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
994
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
995
+ await this.contractSyncService.ensureContractSynced(
996
+ call.to,
997
+ call.selector,
998
+ privateSyncCall => this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
999
+ anchorBlockHeader,
1000
+ jobId,
953
1001
  );
954
1002
 
955
1003
  const executionResult = await this.#simulateUtility(
@@ -1008,15 +1056,18 @@ export class PXE {
1008
1056
  await this.#putInJobQueue(async jobId => {
1009
1057
  await this.blockStateSynchronizer.sync();
1010
1058
 
1011
- anchorBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber();
1059
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1060
+ anchorBlockNumber = anchorBlockHeader.getBlockNumber();
1012
1061
 
1013
1062
  const contractFunctionSimulator = this.#getSimulatorForTx();
1014
1063
 
1015
- await this.contractStore.syncPrivateState(
1064
+ await this.contractSyncService.ensureContractSynced(
1016
1065
  filter.contractAddress,
1017
1066
  null,
1018
1067
  async privateSyncCall =>
1019
1068
  await this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
1069
+ anchorBlockHeader,
1070
+ jobId,
1020
1071
  );
1021
1072
  });
1022
1073
 
@@ -43,23 +43,23 @@ export class AddressStore {
43
43
  });
44
44
  }
45
45
 
46
- async #getCompleteAddress(address: AztecAddress): Promise<CompleteAddress | undefined> {
47
- const index = await this.#completeAddressIndex.getAsync(address.toString());
48
- if (index === undefined) {
49
- return undefined;
50
- }
51
-
52
- const value = await this.#completeAddresses.atAsync(index);
53
- return value ? await CompleteAddress.fromBuffer(value) : undefined;
54
- }
55
-
56
46
  getCompleteAddress(account: AztecAddress): Promise<CompleteAddress | undefined> {
57
- return this.#getCompleteAddress(account);
47
+ return this.#store.transactionAsync(async () => {
48
+ const index = await this.#completeAddressIndex.getAsync(account.toString());
49
+ if (index === undefined) {
50
+ return undefined;
51
+ }
52
+
53
+ const value = await this.#completeAddresses.atAsync(index);
54
+ return value ? await CompleteAddress.fromBuffer(value) : undefined;
55
+ });
58
56
  }
59
57
 
60
- async getCompleteAddresses(): Promise<CompleteAddress[]> {
61
- return await Promise.all(
62
- (await toArray(this.#completeAddresses.valuesAsync())).map(v => CompleteAddress.fromBuffer(v)),
63
- );
58
+ getCompleteAddresses(): Promise<CompleteAddress[]> {
59
+ return this.#store.transactionAsync(async () => {
60
+ return await Promise.all(
61
+ (await toArray(this.#completeAddresses.valuesAsync())).map(v => CompleteAddress.fromBuffer(v)),
62
+ );
63
+ });
64
64
  }
65
65
  }
@@ -10,6 +10,14 @@ export class AnchorBlockStore {
10
10
  this.#synchronizedHeader = this.#store.openSingleton('header');
11
11
  }
12
12
 
13
+ /**
14
+ * Sets the currently synchronized block
15
+ *
16
+ * Important: this method is only called from BlockSynchronizer, and since we need it to run atomically with other
17
+ * stores in the case of a reorg, it MUST NOT be wrapped in a `transactionAsync` call. Doing so would result in a
18
+ * deadlock when the backend is IndexedDB, because `transactionAsync` is not designed to support reentrancy.
19
+ *
20
+ */
13
21
  async setHeader(header: BlockHeader): Promise<void> {
14
22
  await this.#synchronizedHeader.set(header.toBuffer());
15
23
  }
@@ -57,14 +57,14 @@ export class CapsuleStore implements StagedStore {
57
57
  */
58
58
  async #getFromStage(jobId: string, dbSlotKey: string): Promise<Buffer | null | undefined> {
59
59
  const jobStagedCapsules = this.#getJobStagedCapsules(jobId);
60
- let staged: Buffer | null | undefined = jobStagedCapsules.get(dbSlotKey);
61
- // Note that if staged === null, we marked it for deletion, so we don't want to
62
- // re-read it from DB
63
- if (staged === undefined) {
64
- // If we don't have a staged version of this dbSlotKey, first we check if there's one in DB
65
- staged = await this.#loadCapsuleFromDb(dbSlotKey);
66
- }
67
- return staged;
60
+ const staged: Buffer | null | undefined = jobStagedCapsules.get(dbSlotKey);
61
+
62
+ // Always issue DB read to keep IndexedDB transaction alive, even if the value is in the job staged data. This
63
+ // keeps IndexedDB transactions alive (they auto-commit when a new micro-task starts and there are no pending read
64
+ // requests). The staged value still takes precedence if it exists (including null for deletions).
65
+ const dbValue = await this.#loadCapsuleFromDb(dbSlotKey);
66
+
67
+ return staged !== undefined ? staged : dbValue;
68
68
  }
69
69
 
70
70
  /**
@@ -3,7 +3,6 @@ import type { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { toArray } from '@aztec/foundation/iterable';
4
4
  import type { MembershipWitness } from '@aztec/foundation/trees';
5
5
  import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
6
- import { isProtocolContract } from '@aztec/protocol-contracts';
7
6
  import {
8
7
  type ContractArtifact,
9
8
  type FunctionAbi,
@@ -43,10 +42,12 @@ export class ContractStore {
43
42
  /** Map from contract address to contract class id */
44
43
  #contractClassIdMap: Map<string, Fr> = new Map();
45
44
 
45
+ #store: AztecAsyncKVStore;
46
46
  #contractArtifacts: AztecAsyncMap<string, Buffer>;
47
47
  #contractInstances: AztecAsyncMap<string, Buffer>;
48
48
 
49
49
  constructor(store: AztecAsyncKVStore) {
50
+ this.#store = store;
50
51
  this.#contractArtifacts = store.openMap('contract_artifacts');
51
52
  this.#contractInstances = store.openMap('contracts_instances');
52
53
  }
@@ -54,6 +55,7 @@ export class ContractStore {
54
55
  // Setters
55
56
 
56
57
  public async addContractArtifact(id: Fr, contract: ContractArtifact): Promise<void> {
58
+ // Validation outside transactionAsync - these are not DB operations
57
59
  const privateFunctions = contract.functions.filter(
58
60
  functionArtifact => functionArtifact.functionType === FunctionType.PRIVATE,
59
61
  );
@@ -70,7 +72,9 @@ export class ContractStore {
70
72
  throw new Error('Repeated function selectors of private functions');
71
73
  }
72
74
 
73
- await this.#contractArtifacts.set(id.toString(), contractArtifactToBuffer(contract));
75
+ await this.#store.transactionAsync(() =>
76
+ this.#contractArtifacts.set(id.toString(), contractArtifactToBuffer(contract)),
77
+ );
74
78
  }
75
79
 
76
80
  async addContractInstance(contract: ContractInstanceWithAddress): Promise<void> {
@@ -124,21 +128,27 @@ export class ContractStore {
124
128
 
125
129
  // Public getters
126
130
 
127
- async getContractsAddresses(): Promise<AztecAddress[]> {
128
- const keys = await toArray(this.#contractInstances.keysAsync());
129
- return keys.map(AztecAddress.fromString);
131
+ getContractsAddresses(): Promise<AztecAddress[]> {
132
+ return this.#store.transactionAsync(async () => {
133
+ const keys = await toArray(this.#contractInstances.keysAsync());
134
+ return keys.map(AztecAddress.fromString);
135
+ });
130
136
  }
131
137
 
132
138
  /** Returns a contract instance for a given address. Throws if not found. */
133
- public async getContractInstance(contractAddress: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
134
- const contract = await this.#contractInstances.getAsync(contractAddress.toString());
135
- return contract && SerializableContractInstance.fromBuffer(contract).withAddress(contractAddress);
139
+ public getContractInstance(contractAddress: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
140
+ return this.#store.transactionAsync(async () => {
141
+ const contract = await this.#contractInstances.getAsync(contractAddress.toString());
142
+ return contract && SerializableContractInstance.fromBuffer(contract).withAddress(contractAddress);
143
+ });
136
144
  }
137
145
 
138
- public async getContractArtifact(contractClassId: Fr): Promise<ContractArtifact | undefined> {
139
- const contract = await this.#contractArtifacts.getAsync(contractClassId.toString());
140
- // TODO(@spalladino): AztecAsyncMap lies and returns Uint8Arrays instead of Buffers, hence the extra Buffer.from.
141
- return contract && contractArtifactFromBuffer(Buffer.from(contract));
146
+ public getContractArtifact(contractClassId: Fr): Promise<ContractArtifact | undefined> {
147
+ return this.#store.transactionAsync(async () => {
148
+ const contract = await this.#contractArtifacts.getAsync(contractClassId.toString());
149
+ // TODO(@spalladino): AztecAsyncMap lies and returns Uint8Arrays instead of Buffers, hence the extra Buffer.from.
150
+ return contract && contractArtifactFromBuffer(Buffer.from(contract));
151
+ });
142
152
  }
143
153
 
144
154
  /** Returns a contract class for a given class id. Throws if not found. */
@@ -317,23 +327,4 @@ export class ContractStore {
317
327
  returnTypes: functionDao.returnTypes,
318
328
  };
319
329
  }
320
-
321
- // Synchronize target contract data
322
- public async syncPrivateState(
323
- contractAddress: AztecAddress,
324
- functionToInvokeAfterSync: FunctionSelector | null,
325
- utilityExecutor: (privateSyncCall: FunctionCall) => Promise<any>,
326
- ) {
327
- // Protocol contracts don't have private state to sync
328
- if (!isProtocolContract(contractAddress)) {
329
- const syncPrivateStateFunctionCall = await this.getFunctionCall('sync_private_state', [], contractAddress);
330
- if (functionToInvokeAfterSync && functionToInvokeAfterSync.equals(syncPrivateStateFunctionCall.selector)) {
331
- throw new Error(
332
- 'Forbidden `sync_private_state` invocation. `sync_private_state` can only be invoked by PXE, manual execution can lead to inconsistencies.',
333
- );
334
- }
335
-
336
- return utilityExecutor(syncPrivateStateFunctionCall);
337
- }
338
- }
339
330
  }
@@ -1 +1 @@
1
- export const PXE_DATA_SCHEMA_VERSION = 2;
1
+ export const PXE_DATA_SCHEMA_VERSION = 3;