@aztec/pxe 0.0.1-commit.8afd444 → 0.0.1-commit.8cb2d04d8

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 (244) hide show
  1. package/dest/bin/check_oracle_version.js +4 -4
  2. package/dest/block_synchronizer/block_synchronizer.d.ts +9 -3
  3. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  4. package/dest/block_synchronizer/block_synchronizer.js +26 -2
  5. package/dest/config/index.d.ts +2 -2
  6. package/dest/config/index.d.ts.map +1 -1
  7. package/dest/config/index.js +8 -15
  8. package/dest/config/package_info.js +1 -1
  9. package/dest/contract_function_simulator/contract_function_simulator.d.ts +63 -29
  10. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  11. package/dest/contract_function_simulator/contract_function_simulator.js +206 -75
  12. package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
  13. package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
  14. package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
  15. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +7 -7
  16. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/execution_tagging_index_cache.js +19 -11
  18. package/dest/contract_function_simulator/index.d.ts +2 -1
  19. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  20. package/dest/contract_function_simulator/index.js +1 -0
  21. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -6
  22. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  23. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +8 -10
  24. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +1 -1
  25. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +1 -1
  26. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +2 -2
  27. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +2 -4
  29. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +4 -7
  30. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  31. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +6 -11
  32. package/dest/contract_function_simulator/oracle/interfaces.d.ts +61 -45
  33. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  34. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +9 -0
  35. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +1 -0
  36. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +47 -0
  37. package/dest/contract_function_simulator/oracle/oracle.d.ts +75 -44
  38. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  39. package/dest/contract_function_simulator/oracle/oracle.js +282 -97
  40. package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
  41. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +54 -78
  42. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  43. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +114 -86
  44. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +119 -64
  45. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  46. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +315 -123
  47. package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
  48. package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
  49. package/dest/contract_function_simulator/pick_notes.js +20 -3
  50. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +1 -1
  51. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
  52. package/dest/contract_function_simulator/proxied_contract_data_source.js +3 -0
  53. package/dest/contract_logging.d.ts +27 -0
  54. package/dest/contract_logging.d.ts.map +1 -0
  55. package/dest/contract_logging.js +38 -0
  56. package/dest/contract_sync/contract_sync_service.d.ts +44 -0
  57. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
  58. package/dest/contract_sync/contract_sync_service.js +116 -0
  59. package/dest/contract_sync/helpers.d.ts +28 -0
  60. package/dest/contract_sync/helpers.d.ts.map +1 -0
  61. package/dest/contract_sync/{index.js → helpers.js} +14 -15
  62. package/dest/debug/pxe_debug_utils.d.ts +14 -10
  63. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  64. package/dest/debug/pxe_debug_utils.js +16 -15
  65. package/dest/entrypoints/client/bundle/index.d.ts +3 -1
  66. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  67. package/dest/entrypoints/client/bundle/index.js +2 -0
  68. package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
  69. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  70. package/dest/entrypoints/client/bundle/utils.js +11 -3
  71. package/dest/entrypoints/client/lazy/index.d.ts +3 -1
  72. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  73. package/dest/entrypoints/client/lazy/index.js +2 -0
  74. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  75. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  76. package/dest/entrypoints/client/lazy/utils.js +11 -3
  77. package/dest/entrypoints/pxe_creation_options.d.ts +3 -1
  78. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  79. package/dest/entrypoints/pxe_creation_options.js +3 -1
  80. package/dest/entrypoints/server/index.d.ts +4 -3
  81. package/dest/entrypoints/server/index.d.ts.map +1 -1
  82. package/dest/entrypoints/server/index.js +3 -2
  83. package/dest/entrypoints/server/utils.d.ts +2 -2
  84. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  85. package/dest/entrypoints/server/utils.js +11 -3
  86. package/dest/events/event_service.d.ts +3 -2
  87. package/dest/events/event_service.d.ts.map +1 -1
  88. package/dest/events/event_service.js +26 -5
  89. package/dest/events/private_event_filter_validator.d.ts +3 -2
  90. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  91. package/dest/events/private_event_filter_validator.js +15 -0
  92. package/dest/logs/log_service.d.ts +7 -7
  93. package/dest/logs/log_service.d.ts.map +1 -1
  94. package/dest/logs/log_service.js +33 -48
  95. package/dest/messages/message_context_service.d.ts +17 -0
  96. package/dest/messages/message_context_service.d.ts.map +1 -0
  97. package/dest/messages/message_context_service.js +36 -0
  98. package/dest/notes/note_service.d.ts +4 -4
  99. package/dest/notes/note_service.d.ts.map +1 -1
  100. package/dest/notes/note_service.js +17 -7
  101. package/dest/notes_filter.d.ts +24 -0
  102. package/dest/notes_filter.d.ts.map +1 -0
  103. package/dest/notes_filter.js +4 -0
  104. package/dest/oracle_version.d.ts +4 -3
  105. package/dest/oracle_version.d.ts.map +1 -1
  106. package/dest/oracle_version.js +20 -10
  107. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
  108. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
  109. package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
  110. package/dest/private_kernel/hints/index.d.ts +1 -1
  111. package/dest/private_kernel/hints/index.js +1 -1
  112. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
  113. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  114. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +129 -68
  115. package/dest/private_kernel/hints/test_utils.d.ts +122 -0
  116. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
  117. package/dest/private_kernel/hints/test_utils.js +203 -0
  118. package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
  119. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  120. package/dest/private_kernel/private_kernel_execution_prover.js +18 -13
  121. package/dest/private_kernel/private_kernel_oracle.d.ts +10 -6
  122. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  123. package/dest/private_kernel/private_kernel_oracle.js +19 -18
  124. package/dest/pxe.d.ts +74 -24
  125. package/dest/pxe.d.ts.map +1 -1
  126. package/dest/pxe.js +134 -76
  127. package/dest/storage/anchor_block_store/anchor_block_store.js +1 -1
  128. package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
  129. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
  130. package/dest/storage/capsule_store/capsule_service.js +50 -0
  131. package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
  132. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  133. package/dest/storage/capsule_store/capsule_store.js +36 -28
  134. package/dest/storage/capsule_store/index.d.ts +2 -1
  135. package/dest/storage/capsule_store/index.d.ts.map +1 -1
  136. package/dest/storage/capsule_store/index.js +1 -0
  137. package/dest/storage/contract_store/contract_store.d.ts +42 -15
  138. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  139. package/dest/storage/contract_store/contract_store.js +148 -70
  140. package/dest/storage/metadata.d.ts +1 -1
  141. package/dest/storage/metadata.js +1 -1
  142. package/dest/storage/note_store/note_store.d.ts +3 -3
  143. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  144. package/dest/storage/note_store/note_store.js +6 -4
  145. package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
  146. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  147. package/dest/storage/private_event_store/private_event_store.js +3 -0
  148. package/dest/storage/private_event_store/stored_private_event.js +1 -1
  149. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
  150. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  151. package/dest/storage/tagging_store/sender_tagging_store.d.ts +29 -28
  152. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  153. package/dest/storage/tagging_store/sender_tagging_store.js +141 -115
  154. package/dest/tagging/get_all_logs_by_tags.d.ts +1 -1
  155. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  156. package/dest/tagging/get_all_logs_by_tags.js +17 -3
  157. package/dest/tagging/index.d.ts +3 -3
  158. package/dest/tagging/index.d.ts.map +1 -1
  159. package/dest/tagging/index.js +1 -1
  160. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +4 -5
  161. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  162. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +8 -22
  163. package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
  164. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +6 -7
  165. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  166. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +12 -11
  167. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +4 -8
  168. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  169. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +13 -7
  170. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +4 -3
  171. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  172. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +20 -10
  173. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -7
  174. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  175. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +36 -24
  176. package/package.json +25 -16
  177. package/src/bin/check_oracle_version.ts +4 -4
  178. package/src/block_synchronizer/block_synchronizer.ts +28 -2
  179. package/src/config/index.ts +3 -9
  180. package/src/config/package_info.ts +1 -1
  181. package/src/contract_function_simulator/contract_function_simulator.ts +366 -136
  182. package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
  183. package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -14
  184. package/src/contract_function_simulator/index.ts +1 -0
  185. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +9 -9
  186. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +1 -1
  187. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +2 -5
  188. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +4 -10
  189. package/src/contract_function_simulator/oracle/interfaces.ts +82 -54
  190. package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +104 -0
  191. package/src/contract_function_simulator/oracle/oracle.ts +364 -140
  192. package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
  193. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +144 -178
  194. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +530 -153
  195. package/src/contract_function_simulator/pick_notes.ts +22 -3
  196. package/src/contract_function_simulator/proxied_contract_data_source.ts +8 -1
  197. package/src/contract_logging.ts +52 -0
  198. package/src/contract_sync/contract_sync_service.ts +176 -0
  199. package/src/contract_sync/{index.ts → helpers.ts} +14 -35
  200. package/src/debug/pxe_debug_utils.ts +48 -18
  201. package/src/entrypoints/client/bundle/index.ts +2 -0
  202. package/src/entrypoints/client/bundle/utils.ts +11 -4
  203. package/src/entrypoints/client/lazy/index.ts +2 -0
  204. package/src/entrypoints/client/lazy/utils.ts +11 -4
  205. package/src/entrypoints/pxe_creation_options.ts +7 -0
  206. package/src/entrypoints/server/index.ts +3 -2
  207. package/src/entrypoints/server/utils.ts +9 -10
  208. package/src/events/event_service.ts +30 -5
  209. package/src/events/private_event_filter_validator.ts +21 -1
  210. package/src/logs/log_service.ts +63 -91
  211. package/src/messages/message_context_service.ts +44 -0
  212. package/src/notes/note_service.ts +19 -8
  213. package/src/notes_filter.ts +24 -0
  214. package/src/oracle_version.ts +20 -10
  215. package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
  216. package/src/private_kernel/hints/index.ts +1 -1
  217. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +164 -117
  218. package/src/private_kernel/hints/test_utils.ts +325 -0
  219. package/src/private_kernel/private_kernel_execution_prover.ts +18 -16
  220. package/src/private_kernel/private_kernel_oracle.ts +21 -21
  221. package/src/pxe.ts +238 -129
  222. package/src/storage/anchor_block_store/anchor_block_store.ts +1 -1
  223. package/src/storage/capsule_store/capsule_service.ts +90 -0
  224. package/src/storage/capsule_store/capsule_store.ts +44 -26
  225. package/src/storage/capsule_store/index.ts +1 -0
  226. package/src/storage/contract_store/contract_store.ts +181 -80
  227. package/src/storage/metadata.ts +1 -1
  228. package/src/storage/note_store/note_store.ts +9 -5
  229. package/src/storage/private_event_store/private_event_store.ts +4 -0
  230. package/src/storage/private_event_store/stored_private_event.ts +1 -1
  231. package/src/storage/tagging_store/recipient_tagging_store.ts +9 -5
  232. package/src/storage/tagging_store/sender_tagging_store.ts +185 -138
  233. package/src/tagging/get_all_logs_by_tags.ts +28 -4
  234. package/src/tagging/index.ts +2 -2
  235. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +12 -25
  236. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
  237. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +10 -15
  238. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +23 -10
  239. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +26 -11
  240. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +27 -26
  241. package/dest/contract_sync/index.d.ts +0 -24
  242. package/dest/contract_sync/index.d.ts.map +0 -1
  243. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
  244. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
package/dest/pxe.js CHANGED
@@ -13,11 +13,14 @@ import { BlockSynchronizer } from './block_synchronizer/index.js';
13
13
  import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
14
14
  import { ContractFunctionSimulator, generateSimulatedProvingResult } from './contract_function_simulator/contract_function_simulator.js';
15
15
  import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
16
- import { ensureContractSynced, readCurrentClassId } from './contract_sync/index.js';
16
+ import { displayDebugLogs } from './contract_logging.js';
17
+ import { ContractSyncService } from './contract_sync/contract_sync_service.js';
18
+ import { readCurrentClassId } from './contract_sync/helpers.js';
17
19
  import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
18
20
  import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
19
21
  import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
20
22
  import { JobCoordinator } from './job_coordinator/job_coordinator.js';
23
+ import { MessageContextService } from './messages/message_context_service.js';
21
24
  import { PrivateKernelExecutionProver } from './private_kernel/private_kernel_execution_prover.js';
22
25
  import { PrivateKernelOracle } from './private_kernel/private_kernel_oracle.js';
23
26
  import { AddressStore } from './storage/address_store/address_store.js';
@@ -34,6 +37,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
34
37
  * manage private state of users.
35
38
  */ export class PXE {
36
39
  node;
40
+ db;
37
41
  blockStateSynchronizer;
38
42
  keyStore;
39
43
  contractStore;
@@ -45,6 +49,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
45
49
  recipientTaggingStore;
46
50
  addressStore;
47
51
  privateEventStore;
52
+ contractSyncService;
53
+ messageContextService;
54
+ l2TipsStore;
48
55
  simulator;
49
56
  proverEnabled;
50
57
  proofCreator;
@@ -53,8 +60,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
53
60
  jobQueue;
54
61
  jobCoordinator;
55
62
  debug;
56
- constructor(node, blockStateSynchronizer, keyStore, contractStore, noteStore, capsuleStore, anchorBlockStore, senderTaggingStore, senderAddressBookStore, recipientTaggingStore, addressStore, privateEventStore, simulator, proverEnabled, proofCreator, protocolContractsProvider, log, jobQueue, jobCoordinator, debug){
63
+ constructor(node, db, blockStateSynchronizer, keyStore, contractStore, noteStore, capsuleStore, anchorBlockStore, senderTaggingStore, senderAddressBookStore, recipientTaggingStore, addressStore, privateEventStore, contractSyncService, messageContextService, l2TipsStore, simulator, proverEnabled, proofCreator, protocolContractsProvider, log, jobQueue, jobCoordinator, debug){
57
64
  this.node = node;
65
+ this.db = db;
58
66
  this.blockStateSynchronizer = blockStateSynchronizer;
59
67
  this.keyStore = keyStore;
60
68
  this.contractStore = contractStore;
@@ -66,6 +74,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
66
74
  this.recipientTaggingStore = recipientTaggingStore;
67
75
  this.addressStore = addressStore;
68
76
  this.privateEventStore = privateEventStore;
77
+ this.contractSyncService = contractSyncService;
78
+ this.messageContextService = messageContextService;
79
+ this.l2TipsStore = l2TipsStore;
69
80
  this.simulator = simulator;
70
81
  this.proverEnabled = proverEnabled;
71
82
  this.proofCreator = proofCreator;
@@ -81,11 +92,12 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
81
92
  * can be contacted.
82
93
  *
83
94
  * @returns A promise that resolves PXE is ready to be used.
84
- */ static async create(node, store, proofCreator, simulator, protocolContractsProvider, config, loggerOrSuffix) {
95
+ */ static async create({ node, store, proofCreator, simulator, protocolContractsProvider, config, loggerOrSuffix }) {
85
96
  // Extract bindings from the logger, or use empty bindings if a string suffix is provided.
86
97
  const bindings = loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
87
98
  const log = !loggerOrSuffix || typeof loggerOrSuffix === 'string' ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`) : loggerOrSuffix;
88
- const proverEnabled = !!config.proverEnabled;
99
+ const info = await node.getNodeInfo();
100
+ const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
89
101
  const addressStore = new AddressStore(store);
90
102
  const privateEventStore = new PrivateEventStore(store);
91
103
  const contractStore = new ContractStore(store);
@@ -97,29 +109,46 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
97
109
  const capsuleStore = new CapsuleStore(store);
98
110
  const keyStore = new KeyStore(store);
99
111
  const tipsStore = new L2TipsKVStore(store, 'pxe');
100
- const synchronizer = new BlockSynchronizer(node, store, anchorBlockStore, noteStore, privateEventStore, tipsStore, config, bindings);
112
+ const contractSyncService = new ContractSyncService(node, contractStore, noteStore, createLogger('pxe:contract_sync', bindings));
113
+ const messageContextService = new MessageContextService(node);
114
+ const synchronizer = new BlockSynchronizer(node, store, anchorBlockStore, noteStore, privateEventStore, tipsStore, contractSyncService, config, bindings);
101
115
  const jobCoordinator = new JobCoordinator(store, bindings);
102
116
  jobCoordinator.registerStores([
103
117
  capsuleStore,
104
118
  senderTaggingStore,
105
119
  recipientTaggingStore,
106
120
  privateEventStore,
107
- noteStore
121
+ noteStore,
122
+ contractSyncService
108
123
  ]);
109
- const debugUtils = new PXEDebugUtils(contractStore, noteStore, synchronizer, anchorBlockStore);
124
+ const debugUtils = new PXEDebugUtils(contractSyncService, noteStore, synchronizer, anchorBlockStore);
110
125
  const jobQueue = new SerialQueue();
111
- const pxe = new PXE(node, synchronizer, keyStore, contractStore, noteStore, capsuleStore, anchorBlockStore, senderTaggingStore, senderAddressBookStore, recipientTaggingStore, addressStore, privateEventStore, simulator, proverEnabled, proofCreator, protocolContractsProvider, log, jobQueue, jobCoordinator, debugUtils);
112
- debugUtils.setPXE(pxe, pxe.#putInJobQueue.bind(pxe));
126
+ const pxe = new PXE(node, store, synchronizer, keyStore, contractStore, noteStore, capsuleStore, anchorBlockStore, senderTaggingStore, senderAddressBookStore, recipientTaggingStore, addressStore, privateEventStore, contractSyncService, messageContextService, tipsStore, simulator, proverEnabled, proofCreator, protocolContractsProvider, log, jobQueue, jobCoordinator, debugUtils);
127
+ debugUtils.setPXEHelpers(pxe.#putInJobQueue.bind(pxe), pxe.#getSimulatorForTx.bind(pxe), pxe.#executeUtility.bind(pxe));
113
128
  pxe.jobQueue.start();
114
129
  await pxe.#registerProtocolContracts();
115
- const info = await node.getNodeInfo();
116
130
  log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
117
131
  return pxe;
118
132
  }
119
133
  // Internal methods
120
134
  #getSimulatorForTx(overrides) {
121
135
  const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
122
- return new ContractFunctionSimulator(proxyContractStore, this.noteStore, this.keyStore, this.addressStore, BenchmarkedNodeFactory.create(this.node), this.senderTaggingStore, this.recipientTaggingStore, this.senderAddressBookStore, this.capsuleStore, this.privateEventStore, this.simulator);
136
+ return new ContractFunctionSimulator({
137
+ contractStore: proxyContractStore,
138
+ noteStore: this.noteStore,
139
+ keyStore: this.keyStore,
140
+ addressStore: this.addressStore,
141
+ aztecNode: BenchmarkedNodeFactory.create(this.node),
142
+ l2TipsStore: this.l2TipsStore,
143
+ senderTaggingStore: this.senderTaggingStore,
144
+ recipientTaggingStore: this.recipientTaggingStore,
145
+ senderAddressBookStore: this.senderAddressBookStore,
146
+ capsuleStore: this.capsuleStore,
147
+ privateEventStore: this.privateEventStore,
148
+ simulator: this.simulator,
149
+ contractSyncService: this.contractSyncService,
150
+ messageContextService: this.messageContextService
151
+ });
123
152
  }
124
153
  #contextualizeError(err, ...context) {
125
154
  let contextStr = '';
@@ -162,8 +191,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
162
191
  async #registerProtocolContracts() {
163
192
  const registered = {};
164
193
  for (const name of protocolContractNames){
165
- const { address, contractClass, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name);
166
- await this.contractStore.addContractArtifact(contractClass.id, artifact);
194
+ const { address, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name);
195
+ await this.contractStore.addContractArtifact(artifact);
167
196
  await this.contractStore.addContractInstance(instance);
168
197
  registered[name] = address.toString();
169
198
  }
@@ -175,10 +204,14 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
175
204
  const { origin: contractAddress, functionSelector } = txRequest;
176
205
  try {
177
206
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
178
- await ensureContractSynced(contractAddress, functionSelector, (privateSyncCall)=>this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId), this.node, this.contractStore, this.noteStore, anchorBlockHeader, jobId);
179
- const result = await contractFunctionSimulator.run(txRequest, contractAddress, functionSelector, undefined, anchorBlockHeader, // The sender for tags is set by contracts, typically by an account
180
- // contract entrypoint
181
- undefined, scopes, jobId);
207
+ await this.contractSyncService.ensureContractSynced(contractAddress, functionSelector, (privateSyncCall, execScopes)=>this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, scopes);
208
+ const result = await contractFunctionSimulator.run(txRequest, {
209
+ contractAddress,
210
+ selector: functionSelector,
211
+ anchorBlockHeader,
212
+ scopes,
213
+ jobId
214
+ });
182
215
  this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
183
216
  return result;
184
217
  } catch (err) {
@@ -189,18 +222,22 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
189
222
  }
190
223
  }
191
224
  /**
192
- * Simulate a utility function call on the given contract.
225
+ * Execute a utility function call on the given contract.
193
226
  * @param contractFunctionSimulator - The simulator to use for the function call.
194
227
  * @param call - The function call to execute.
195
228
  * @param authWitnesses - Authentication witnesses required for the function call.
196
229
  * @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
197
230
  * accounts if not specified.
198
231
  * @param jobId - The job ID for staged writes.
199
- * @returns The simulation result containing the outputs of the utility function.
200
- */ async #simulateUtility(contractFunctionSimulator, call, authWitnesses, scopes, jobId) {
232
+ * @returns The execution result containing the outputs of the utility function.
233
+ */ async #executeUtility(contractFunctionSimulator, call, authWitnesses, scopes, jobId) {
201
234
  try {
202
235
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
203
- return contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes, jobId);
236
+ const { result, offchainEffects } = await contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes, jobId);
237
+ return {
238
+ result,
239
+ offchainEffects
240
+ };
204
241
  } catch (err) {
205
242
  if (err instanceof SimulationError) {
206
243
  await enrichSimulationError(err, this.contractStore, this.log);
@@ -245,14 +282,25 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
245
282
  * @returns An object that contains the output of the kernel execution, including the ChonkProof if proving is enabled.
246
283
  */ async #prove(txExecutionRequest, proofCreator, privateExecutionResult, config) {
247
284
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
248
- const anchorBlockHash = await anchorBlockHeader.hash();
249
- const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
285
+ const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
250
286
  const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled, this.log.getBindings());
251
287
  this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
252
288
  return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
253
289
  }
254
290
  // Public API
255
- getContractInstance(address) {
291
+ /**
292
+ * Returns the block header up to which the PXE has synced.
293
+ * @returns The synced block header
294
+ */ getSyncedBlockHeader() {
295
+ return this.#putInJobQueue(()=>{
296
+ return this.anchorBlockStore.getBlockHeader();
297
+ });
298
+ }
299
+ /**
300
+ * Returns the contract instance for a given address, if it's registered in the PXE.
301
+ * @param address - The contract address.
302
+ * @returns The contract instance if found, undefined otherwise.
303
+ */ getContractInstance(address) {
256
304
  return this.contractStore.getContractInstance(address);
257
305
  }
258
306
  /**
@@ -294,6 +342,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
294
342
  * @returns The address of the sender.
295
343
  * TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
296
344
  */ async registerSender(sender) {
345
+ if (!await sender.isValid()) {
346
+ throw new Error(`Address ${sender} is not valid: it does not correspond to a point on the Grumpkin curve. Cannot register it as a sender.`);
347
+ }
297
348
  const accounts = await this.keyStore.getAccounts();
298
349
  if (accounts.includes(sender)) {
299
350
  this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
@@ -302,6 +353,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
302
353
  const wasAdded = await this.senderAddressBookStore.addSender(sender);
303
354
  if (wasAdded) {
304
355
  this.log.info(`Added sender:\n ${sender.toString()}`);
356
+ // Wipe the entire sync cache: the new sender's tagged logs could contain notes/events for any contract, so
357
+ // all contracts must re-sync to discover them. Queued to avoid wiping while a job is in flight.
358
+ await this.#putInJobQueue(()=>Promise.resolve(this.contractSyncService.wipe()));
305
359
  } else {
306
360
  this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
307
361
  }
@@ -339,8 +393,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
339
393
  *
340
394
  * @param artifact - The build artifact for the contract class.
341
395
  */ async registerContractClass(artifact) {
342
- const { id: contractClassId } = await getContractClassFromArtifact(artifact);
343
- await this.contractStore.addContractArtifact(contractClassId, artifact);
396
+ const contractClassId = await this.contractStore.addContractArtifact(artifact);
344
397
  this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
345
398
  }
346
399
  /**
@@ -356,15 +409,14 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
356
409
  if (artifact) {
357
410
  // If the user provides an artifact, validate it against the expected class id and register it
358
411
  const contractClass = await getContractClassFromArtifact(artifact);
359
- const contractClassId = contractClass.id;
360
- if (!contractClassId.equals(instance.currentContractClassId)) {
361
- throw new Error(`Artifact does not match expected class id (computed ${contractClassId} but instance refers to ${instance.currentContractClassId})`);
412
+ if (!contractClass.id.equals(instance.currentContractClassId)) {
413
+ throw new Error(`Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`);
362
414
  }
363
415
  const computedAddress = await computeContractAddressFromInstance(instance);
364
416
  if (!computedAddress.equals(instance.address)) {
365
417
  throw new Error('Added a contract in which the address does not match the contract instance.');
366
418
  }
367
- await this.contractStore.addContractArtifact(contractClass.id, artifact);
419
+ await this.contractStore.addContractArtifact(artifact, contractClass);
368
420
  const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
369
421
  await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
370
422
  } else {
@@ -400,11 +452,13 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
400
452
  if (!contractClass.id.equals(currentClassId)) {
401
453
  throw new Error('Could not update contract to a class different from the current one.');
402
454
  }
403
- await this.contractStore.addContractArtifact(contractClass.id, artifact);
404
455
  const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
405
456
  await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
406
457
  currentInstance.currentContractClassId = contractClass.id;
407
- await this.contractStore.addContractInstance(currentInstance);
458
+ await Promise.all([
459
+ this.contractStore.addContractArtifact(artifact, contractClass),
460
+ this.contractStore.addContractInstance(currentInstance)
461
+ ]);
408
462
  this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
409
463
  });
410
464
  }
@@ -419,10 +473,11 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
419
473
  * (where validators prove the public portion).
420
474
  *
421
475
  * @param txRequest - An authenticated tx request ready for proving
476
+ * @param scopes - Addresses whose private state and keys are accessible during private execution.
422
477
  * @returns A result containing the proof and public inputs of the tail circuit.
423
478
  * @throws If contract code not found, or public simulation reverts.
424
479
  * Also throws if simulatePublic is true and public simulation reverts.
425
- */ proveTx(txRequest) {
480
+ */ proveTx(txRequest, scopes) {
426
481
  let privateExecutionResult;
427
482
  // We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
428
483
  // computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
@@ -433,7 +488,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
433
488
  await this.blockStateSynchronizer.sync();
434
489
  const syncTime = syncTimer.ms();
435
490
  const contractFunctionSimulator = this.#getSimulatorForTx();
436
- privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, undefined, jobId);
491
+ privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
437
492
  const { publicInputs, chonkProof, executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
438
493
  simulate: false,
439
494
  skipFeeEnforcement: false,
@@ -464,16 +519,16 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
464
519
  // transaction before this one is included in a block from this PXE, and that transaction contains a log with
465
520
  // a tag derived from the same secret, we would reuse the tag and the transactions would be linked. Hence
466
521
  // storing the tags here prevents linkage of txs sent from the same PXE.
467
- const preTagsUsedInTheTx = privateExecutionResult.entrypoint.preTags;
468
- if (preTagsUsedInTheTx.length > 0) {
522
+ const taggingIndexRangesUsedInTheTx = privateExecutionResult.entrypoint.taggingIndexRanges;
523
+ if (taggingIndexRangesUsedInTheTx.length > 0) {
469
524
  // TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
470
525
  const txHash = (await txProvingResult.toTx()).txHash;
471
- await this.senderTaggingStore.storePendingIndexes(preTagsUsedInTheTx, txHash, jobId);
472
- this.log.debug(`Stored used pre-tags as sender for the tx`, {
473
- preTagsUsedInTheTx
526
+ await this.senderTaggingStore.storePendingIndexes(taggingIndexRangesUsedInTheTx, txHash, jobId);
527
+ this.log.debug(`Stored used tagging index ranges as sender for the tx`, {
528
+ taggingIndexRangesUsedInTheTx
474
529
  });
475
530
  } else {
476
- this.log.debug(`No pre-tags used in the tx`);
531
+ this.log.debug(`No tagging index ranges used in the tx`);
477
532
  }
478
533
  return txProvingResult;
479
534
  } catch (err) {
@@ -483,13 +538,10 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
483
538
  }
484
539
  /**
485
540
  * Profiles a transaction, reporting gate counts (unless disabled) and returns an execution trace.
486
- *
487
- * @param txRequest - An authenticated tx request ready for simulation
488
- * @param msgSender - (Optional) The message sender to use for the simulation.
489
- * @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
541
+ * @param txRequest - An authenticated tx request ready for simulation.
490
542
  * @returns A trace of the program execution with gate counts.
491
543
  * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
492
- */ profileTx(txRequest, profileMode, skipProofGeneration = true) {
544
+ */ profileTx(txRequest, { profileMode, skipProofGeneration = true, scopes }) {
493
545
  // We disable concurrent profiles for consistency with simulateTx.
494
546
  return this.#putInJobQueue(async (jobId)=>{
495
547
  const totalTimer = new Timer();
@@ -507,7 +559,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
507
559
  await this.blockStateSynchronizer.sync();
508
560
  const syncTime = syncTimer.ms();
509
561
  const contractFunctionSimulator = this.#getSimulatorForTx();
510
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, undefined, jobId);
562
+ const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
511
563
  const { executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
512
564
  simulate: skipProofGeneration,
513
565
  skipFeeEnforcement: false,
@@ -552,18 +604,13 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
552
604
  * In that case, the transaction returned is only potentially ready to be sent to the network for execution.
553
605
  *
554
606
  *
555
- * @param txRequest - An authenticated tx request ready for simulation
556
- * @param simulatePublic - Whether to simulate the public part of the transaction.
557
- * @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
558
- * @param skipFeeEnforcement - (Optional) If false, fees are enforced.
559
- * @param overrides - (Optional) State overrides for the simulation, such as msgSender, contract instances and artifacts.
560
- * @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will default to all.
607
+ * @param txRequest - An authenticated tx request ready for simulation.
561
608
  * @returns A simulated transaction result object that includes public and private return values.
562
609
  * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
563
610
  * Also throws if simulatePublic is true and public simulation reverts.
564
611
  *
565
612
  * TODO(#7456) Prevent msgSender being defined here for the first call
566
- */ simulateTx(txRequest, simulatePublic, skipTxValidation = false, skipFeeEnforcement = false, overrides, scopes) {
613
+ */ simulateTx(txRequest, { simulatePublic, skipTxValidation = false, skipFeeEnforcement = false, skipKernels = true, overrides, scopes }) {
567
614
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
568
615
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
569
616
  // delete the same read value, or reading values that another simulation is currently modifying).
@@ -582,17 +629,23 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
582
629
  const syncTimer = new Timer();
583
630
  await this.blockStateSynchronizer.sync();
584
631
  const syncTime = syncTimer.ms();
632
+ const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
633
+ const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
634
+ if (hasOverriddenContracts && !skipKernels) {
635
+ throw new Error('Simulating with overridden contracts is not compatible with kernel execution. Please set skipKernels to true when simulating with overridden contracts.');
636
+ }
585
637
  const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
586
- // Temporary: in case there are overrides, we have to skip the kernels or validations
587
- // will fail. Consider handing control to the user/wallet on whether they want to run them
588
- // or not.
589
- const skipKernels = overrides?.contracts !== undefined && Object.keys(overrides.contracts ?? {}).length > 0;
638
+ if (hasOverriddenContracts) {
639
+ // Overridden contracts don't have a sync function, so calling sync on them would fail.
640
+ // We exclude them so the sync service skips them entirely.
641
+ this.contractSyncService.setExcludedFromSync(jobId, overriddenContracts);
642
+ }
590
643
  // Execution of private functions only; no proving, and no kernel logic.
591
644
  const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
592
645
  let publicInputs;
593
646
  let executionSteps = [];
594
647
  if (skipKernels) {
595
- ({ publicInputs, executionSteps } = await generateSimulatedProvingResult(privateExecutionResult, this.contractStore));
648
+ ({ publicInputs, executionSteps } = await generateSimulatedProvingResult(privateExecutionResult, (addr, sel)=>this.contractStore.getDebugFunctionName(addr, sel), this.node));
596
649
  } else {
597
650
  // Kernel logic, plus proving of all private functions and kernels.
598
651
  ({ publicInputs, executionSteps } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
@@ -609,6 +662,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
609
662
  const publicSimulationTimer = new Timer();
610
663
  publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
611
664
  publicSimulationTime = publicSimulationTimer.ms();
665
+ if (publicOutput?.debugLogs?.length) {
666
+ await displayDebugLogs(publicOutput.debugLogs, (addr)=>this.contractStore.getDebugContractName(addr));
667
+ }
612
668
  }
613
669
  let validationTime;
614
670
  if (!skipTxValidation) {
@@ -619,7 +675,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
619
675
  });
620
676
  validationTime = validationTimer.ms();
621
677
  if (validationResult.result === 'invalid') {
622
- throw new Error('The simulated transaction is unable to be added to state and is invalid.');
678
+ const reason = validationResult.reason.length > 0 ? ` Reason: ${validationResult.reason.join(', ')}` : '';
679
+ throw new Error(`The simulated transaction is unable to be added to state and is invalid.${reason}`);
623
680
  }
624
681
  }
625
682
  const txHash = simulatedTx.getTxHash();
@@ -652,22 +709,19 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
652
709
  nodeRPCCalls: simulatorStats.nodeRPCCalls
653
710
  });
654
711
  } catch (err) {
655
- throw this.#contextualizeError(err, inspect(txRequest), `simulatePublic=${simulatePublic}`, `skipTxValidation=${skipTxValidation}`, `scopes=${scopes?.map((s)=>s.toString()).join(', ') ?? 'undefined'}`);
712
+ throw this.#contextualizeError(err, inspect(txRequest), `simulatePublic=${simulatePublic}`, `skipTxValidation=${skipTxValidation}`, `scopes=${scopes.map((s)=>s.toString()).join(', ')}`);
656
713
  }
657
714
  });
658
715
  }
659
716
  /**
660
- * Simulate the execution of a contract utility function.
661
- *
717
+ * Executes a contract utility function.
662
718
  * @param call - The function call containing the function details, arguments, and target contract address.
663
- * @param authwits - (Optional) The authentication witnesses required for the function call.
664
- * @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will
665
- * default to all.
666
- * @returns The result of the utility function call, structured based on the function ABI.
667
- */ simulateUtility(call, authwits, scopes) {
668
- // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
719
+ */ executeUtility(call, { authwits, scopes } = {
720
+ scopes: []
721
+ }) {
722
+ // We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
669
723
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
670
- // delete the same read value, or reading values that another simulation is currently modifying).
724
+ // delete the same read value, or reading values that another execution is currently modifying).
671
725
  return this.#putInJobQueue(async (jobId)=>{
672
726
  try {
673
727
  const totalTimer = new Timer();
@@ -677,8 +731,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
677
731
  const functionTimer = new Timer();
678
732
  const contractFunctionSimulator = this.#getSimulatorForTx();
679
733
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
680
- await ensureContractSynced(call.to, call.selector, (privateSyncCall)=>this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId), this.node, this.contractStore, this.noteStore, anchorBlockHeader, jobId);
681
- const executionResult = await this.#simulateUtility(contractFunctionSimulator, call, authwits ?? [], scopes, jobId);
734
+ await this.contractSyncService.ensureContractSynced(call.to, call.selector, (privateSyncCall, execScopes)=>this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, scopes);
735
+ const { result: executionResult, offchainEffects } = await this.#executeUtility(contractFunctionSimulator, call, authwits ?? [], scopes, jobId);
682
736
  const functionTime = functionTimer.ms();
683
737
  const totalTime = totalTimer.ms();
684
738
  const perFunction = [
@@ -696,6 +750,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
696
750
  const simulationStats = contractFunctionSimulator.getStats();
697
751
  return {
698
752
  result: executionResult,
753
+ offchainEffects,
754
+ anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
699
755
  stats: {
700
756
  timings,
701
757
  nodeRPCCalls: simulationStats.nodeRPCCalls
@@ -704,7 +760,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
704
760
  } catch (err) {
705
761
  const { to, name, args } = call;
706
762
  const stringifiedArgs = args.map((arg)=>arg.toString()).join(', ');
707
- throw this.#contextualizeError(err, `simulateUtility ${to}:${name}(${stringifiedArgs})`, `scopes=${scopes?.map((s)=>s.toString()).join(', ') ?? 'undefined'}`);
763
+ throw this.#contextualizeError(err, `executeUtility ${to}:${name}(${stringifiedArgs})`, `scopes=${scopes.map((s)=>s.toString()).join(', ')}`);
708
764
  }
709
765
  });
710
766
  }
@@ -727,7 +783,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
727
783
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
728
784
  anchorBlockNumber = anchorBlockHeader.getBlockNumber();
729
785
  const contractFunctionSimulator = this.#getSimulatorForTx();
730
- await ensureContractSynced(filter.contractAddress, null, async (privateSyncCall)=>await this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId), this.node, this.contractStore, this.noteStore, anchorBlockHeader, jobId);
786
+ await this.contractSyncService.ensureContractSynced(filter.contractAddress, null, async (privateSyncCall, execScopes)=>await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, filter.scopes);
731
787
  });
732
788
  // anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
733
789
  const sanitizedFilter = new PrivateEventFilterValidator(anchorBlockNumber).validate(filter);
@@ -735,8 +791,10 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
735
791
  return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
736
792
  }
737
793
  /**
738
- * Stops the PXE's job queue.
739
- */ stop() {
740
- return this.jobQueue.end();
794
+ * Stops the PXE's job queue and closes the backing store.
795
+ */ async stop() {
796
+ await this.jobQueue.end();
797
+ await this.blockStateSynchronizer.stop();
798
+ await this.db.close();
741
799
  }
742
800
  }
@@ -17,7 +17,7 @@ export class AnchorBlockStore {
17
17
  await this.#synchronizedHeader.set(header.toBuffer());
18
18
  }
19
19
  async getBlockHeader() {
20
- const headerBuffer = await this.#synchronizedHeader.getAsync();
20
+ const headerBuffer = await this.#store.transactionAsync(()=>this.#synchronizedHeader.getAsync());
21
21
  if (!headerBuffer) {
22
22
  throw new Error(`Trying to get block header with a not-yet-synchronized PXE - this should never happen`);
23
23
  }
@@ -0,0 +1,21 @@
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
3
+ import type { Capsule } from '@aztec/stdlib/tx';
4
+ import type { CapsuleStore } from './capsule_store.js';
5
+ /**
6
+ * Wraps a CapsuleStore with scope-based access control. Each operation asserts that the requested scope is in the
7
+ * allowed scopes list before delegating to the underlying store.
8
+ */
9
+ export declare class CapsuleService {
10
+ private readonly capsuleStore;
11
+ private readonly allowedScopes;
12
+ constructor(capsuleStore: CapsuleStore, allowedScopes: AztecAddress[]);
13
+ setCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[], jobId: string, scope: AztecAddress): void;
14
+ getCapsule(contractAddress: AztecAddress, slot: Fr, jobId: string, scope: AztecAddress, transientCapsules?: Capsule[]): Promise<Fr[] | null>;
15
+ deleteCapsule(contractAddress: AztecAddress, slot: Fr, jobId: string, scope: AztecAddress): void;
16
+ copyCapsule(contractAddress: AztecAddress, srcSlot: Fr, dstSlot: Fr, numEntries: number, jobId: string, scope: AztecAddress): Promise<void>;
17
+ appendToCapsuleArray(contractAddress: AztecAddress, baseSlot: Fr, content: Fr[][], jobId: string, scope: AztecAddress): Promise<void>;
18
+ readCapsuleArray(contractAddress: AztecAddress, baseSlot: Fr, jobId: string, scope: AztecAddress): Promise<Fr[][]>;
19
+ setCapsuleArray(contractAddress: AztecAddress, baseSlot: Fr, content: Fr[][], jobId: string, scope: AztecAddress): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fwc3VsZV9zZXJ2aWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RvcmFnZS9jYXBzdWxlX3N0b3JlL2NhcHN1bGVfc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFaEQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkQ7OztHQUdHO0FBQ0gscUJBQWEsY0FBYztJQUV2QixPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVk7SUFDN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhO0lBRmhDLFlBQ21CLFlBQVksRUFBRSxZQUFZLEVBQzFCLGFBQWEsRUFBRSxZQUFZLEVBQUUsRUFDNUM7SUFFSixVQUFVLENBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLFFBR3BHO0lBRUssVUFBVSxDQUNkLGVBQWUsRUFBRSxZQUFZLEVBQzdCLElBQUksRUFBRSxFQUFFLEVBQ1IsS0FBSyxFQUFFLE1BQU0sRUFDYixLQUFLLEVBQUUsWUFBWSxFQUNuQixpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUM1QixPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBWXRCO0lBRUQsYUFBYSxDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLFFBR3hGO0lBRUQsV0FBVyxDQUNULGVBQWUsRUFBRSxZQUFZLEVBQzdCLE9BQU8sRUFBRSxFQUFFLEVBQ1gsT0FBTyxFQUFFLEVBQUUsRUFDWCxVQUFVLEVBQUUsTUFBTSxFQUNsQixLQUFLLEVBQUUsTUFBTSxFQUNiLEtBQUssRUFBRSxZQUFZLEdBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FHZjtJQUVELG9CQUFvQixDQUNsQixlQUFlLEVBQUUsWUFBWSxFQUM3QixRQUFRLEVBQUUsRUFBRSxFQUNaLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUNmLEtBQUssRUFBRSxNQUFNLEVBQ2IsS0FBSyxFQUFFLFlBQVksR0FDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUdmO0lBRUQsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUdqSDtJQUVELGVBQWUsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxpQkFHL0c7Q0FDRiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capsule_service.d.ts","sourceRoot":"","sources":["../../../src/storage/capsule_store/capsule_service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;GAGG;AACH,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAFhC,YACmB,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,YAAY,EAAE,EAC5C;IAEJ,UAAU,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,QAGpG;IAEK,UAAU,CACd,eAAe,EAAE,YAAY,EAC7B,IAAI,EAAE,EAAE,EACR,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EACnB,iBAAiB,CAAC,EAAE,OAAO,EAAE,GAC5B,OAAO,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAYtB;IAED,aAAa,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,QAGxF;IAED,WAAW,CACT,eAAe,EAAE,YAAY,EAC7B,OAAO,EAAE,EAAE,EACX,OAAO,EAAE,EAAE,EACX,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAGf;IAED,oBAAoB,CAClB,eAAe,EAAE,YAAY,EAC7B,QAAQ,EAAE,EAAE,EACZ,OAAO,EAAE,EAAE,EAAE,EAAE,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAGf;IAED,gBAAgB,CAAC,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAGjH;IAED,eAAe,CAAC,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,iBAG/G;CACF"}
@@ -0,0 +1,50 @@
1
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
2
+ /**
3
+ * Wraps a CapsuleStore with scope-based access control. Each operation asserts that the requested scope is in the
4
+ * allowed scopes list before delegating to the underlying store.
5
+ */ export class CapsuleService {
6
+ capsuleStore;
7
+ allowedScopes;
8
+ constructor(capsuleStore, allowedScopes){
9
+ this.capsuleStore = capsuleStore;
10
+ this.allowedScopes = allowedScopes;
11
+ }
12
+ setCapsule(contractAddress, slot, capsule, jobId, scope) {
13
+ assertAllowedScope(scope, this.allowedScopes);
14
+ this.capsuleStore.setCapsule(contractAddress, slot, capsule, jobId, scope);
15
+ }
16
+ async getCapsule(contractAddress, slot, jobId, scope, transientCapsules) {
17
+ assertAllowedScope(scope, this.allowedScopes);
18
+ // TODO(#12425): On the following line, the pertinent capsule gets overshadowed by the transient one. Tackle this.
19
+ const maybeTransientCapsule = transientCapsules?.find((c)=>c.contractAddress.equals(contractAddress) && c.storageSlot.equals(slot) && (c.scope ?? AztecAddress.ZERO).equals(scope))?.data;
20
+ return maybeTransientCapsule ?? await this.capsuleStore.getCapsule(contractAddress, slot, jobId, scope);
21
+ }
22
+ deleteCapsule(contractAddress, slot, jobId, scope) {
23
+ assertAllowedScope(scope, this.allowedScopes);
24
+ this.capsuleStore.deleteCapsule(contractAddress, slot, jobId, scope);
25
+ }
26
+ copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, jobId, scope) {
27
+ assertAllowedScope(scope, this.allowedScopes);
28
+ return this.capsuleStore.copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, jobId, scope);
29
+ }
30
+ appendToCapsuleArray(contractAddress, baseSlot, content, jobId, scope) {
31
+ assertAllowedScope(scope, this.allowedScopes);
32
+ return this.capsuleStore.appendToCapsuleArray(contractAddress, baseSlot, content, jobId, scope);
33
+ }
34
+ readCapsuleArray(contractAddress, baseSlot, jobId, scope) {
35
+ assertAllowedScope(scope, this.allowedScopes);
36
+ return this.capsuleStore.readCapsuleArray(contractAddress, baseSlot, jobId, scope);
37
+ }
38
+ setCapsuleArray(contractAddress, baseSlot, content, jobId, scope) {
39
+ assertAllowedScope(scope, this.allowedScopes);
40
+ return this.capsuleStore.setCapsuleArray(contractAddress, baseSlot, content, jobId, scope);
41
+ }
42
+ }
43
+ function assertAllowedScope(scope, allowedScopes) {
44
+ if (scope.equals(AztecAddress.ZERO)) {
45
+ return;
46
+ }
47
+ if (!allowedScopes.some((allowed)=>allowed.equals(scope))) {
48
+ throw new Error(`Scope ${scope.toString()} is not in the allowed scopes list: [${allowedScopes.map((s)=>s.toString()).join(', ')}]. See https://docs.aztec.network/errors/10`);
49
+ }
50
+ }