@aztec/pxe 0.0.1-commit.fcb71a6 → 0.0.1-commit.fffb133c

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 (218) hide show
  1. package/dest/bin/check_oracle_version.js +1 -1
  2. package/dest/block_synchronizer/block_synchronizer.d.ts +10 -4
  3. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  4. package/dest/block_synchronizer/block_synchronizer.js +66 -18
  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/config/package_info.js +1 -1
  9. package/dest/contract_function_simulator/benchmarked_node.d.ts +9 -0
  10. package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
  11. package/dest/contract_function_simulator/benchmarked_node.js +77 -0
  12. package/dest/contract_function_simulator/contract_function_simulator.d.ts +8 -9
  13. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  14. package/dest/contract_function_simulator/contract_function_simulator.js +32 -21
  15. package/dest/contract_function_simulator/execution_note_cache.d.ts +18 -9
  16. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/execution_note_cache.js +45 -28
  18. package/dest/contract_function_simulator/index.d.ts +2 -2
  19. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  20. package/dest/contract_function_simulator/index.js +1 -1
  21. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -3
  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 +6 -3
  24. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +1 -1
  25. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +1 -1
  26. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +4 -10
  27. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/noir-structs/utility_context.js +7 -18
  29. package/dest/contract_function_simulator/oracle/interfaces.d.ts +15 -11
  30. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  31. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -1
  32. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  33. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +6 -6
  34. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  35. package/dest/contract_function_simulator/oracle/note_packing_utils.js +8 -8
  36. package/dest/contract_function_simulator/oracle/oracle.d.ts +10 -8
  37. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  38. package/dest/contract_function_simulator/oracle/oracle.js +43 -32
  39. package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -26
  40. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  41. package/dest/contract_function_simulator/oracle/private_execution.js +1 -37
  42. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +11 -17
  43. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  44. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +23 -39
  45. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +27 -17
  46. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  47. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +72 -72
  48. package/dest/contract_sync/index.d.ts +23 -0
  49. package/dest/contract_sync/index.d.ts.map +1 -0
  50. package/dest/contract_sync/index.js +54 -0
  51. package/dest/debug/pxe_debug_utils.d.ts +1 -1
  52. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  53. package/dest/debug/pxe_debug_utils.js +3 -2
  54. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  55. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  56. package/dest/entrypoints/client/bundle/utils.js +10 -1
  57. package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
  58. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  59. package/dest/entrypoints/client/lazy/utils.js +10 -1
  60. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  61. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  62. package/dest/entrypoints/server/index.d.ts +3 -1
  63. package/dest/entrypoints/server/index.d.ts.map +1 -1
  64. package/dest/entrypoints/server/index.js +2 -0
  65. package/dest/entrypoints/server/utils.d.ts +1 -1
  66. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  67. package/dest/entrypoints/server/utils.js +11 -7
  68. package/dest/events/event_service.d.ts +4 -3
  69. package/dest/events/event_service.d.ts.map +1 -1
  70. package/dest/events/event_service.js +17 -19
  71. package/dest/events/private_event_filter_validator.d.ts +5 -5
  72. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  73. package/dest/events/private_event_filter_validator.js +5 -6
  74. package/dest/job_coordinator/job_coordinator.d.ts +74 -0
  75. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -0
  76. package/dest/job_coordinator/job_coordinator.js +93 -0
  77. package/dest/logs/log_service.d.ts +3 -2
  78. package/dest/logs/log_service.d.ts.map +1 -1
  79. package/dest/logs/log_service.js +21 -13
  80. package/dest/notes/note_service.d.ts +5 -4
  81. package/dest/notes/note_service.d.ts.map +1 -1
  82. package/dest/notes/note_service.js +30 -34
  83. package/dest/oracle_version.d.ts +3 -3
  84. package/dest/oracle_version.d.ts.map +1 -1
  85. package/dest/oracle_version.js +4 -3
  86. package/dest/private_kernel/hints/index.d.ts +2 -2
  87. package/dest/private_kernel/hints/index.d.ts.map +1 -1
  88. package/dest/private_kernel/hints/index.js +1 -1
  89. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +28 -0
  90. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
  91. package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +13 -7
  92. package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
  93. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  94. package/dest/private_kernel/private_kernel_execution_prover.js +4 -5
  95. package/dest/private_kernel/private_kernel_oracle.d.ts +24 -28
  96. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  97. package/dest/private_kernel/private_kernel_oracle.js +90 -2
  98. package/dest/pxe.d.ts +8 -36
  99. package/dest/pxe.d.ts.map +1 -1
  100. package/dest/pxe.js +70 -93
  101. package/dest/storage/capsule_store/capsule_store.d.ts +24 -9
  102. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  103. package/dest/storage/capsule_store/capsule_store.js +132 -23
  104. package/dest/storage/contract_store/contract_store.d.ts +1 -2
  105. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  106. package/dest/storage/contract_store/contract_store.js +0 -12
  107. package/dest/storage/note_store/note_store.d.ts +45 -56
  108. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  109. package/dest/storage/note_store/note_store.js +244 -263
  110. package/dest/storage/note_store/stored_note.d.ts +16 -0
  111. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  112. package/dest/storage/note_store/stored_note.js +43 -0
  113. package/dest/storage/private_event_store/private_event_store.d.ts +47 -7
  114. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  115. package/dest/storage/private_event_store/private_event_store.js +203 -68
  116. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  117. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  118. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  119. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +15 -8
  120. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  121. package/dest/storage/tagging_store/recipient_tagging_store.js +69 -12
  122. package/dest/storage/tagging_store/sender_tagging_store.d.ts +19 -9
  123. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  124. package/dest/storage/tagging_store/sender_tagging_store.js +110 -28
  125. package/dest/tagging/constants.d.ts +2 -0
  126. package/dest/tagging/constants.d.ts.map +1 -0
  127. package/dest/tagging/constants.js +10 -0
  128. package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
  129. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  130. package/dest/tagging/get_all_logs_by_tags.js +46 -0
  131. package/dest/tagging/index.d.ts +3 -2
  132. package/dest/tagging/index.d.ts.map +1 -1
  133. package/dest/tagging/index.js +2 -10
  134. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
  135. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  136. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +8 -8
  137. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
  138. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  139. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +5 -2
  140. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
  141. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  142. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +8 -8
  143. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
  144. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  145. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
  146. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -2
  147. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  148. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +10 -5
  149. package/package.json +18 -18
  150. package/src/bin/check_oracle_version.ts +1 -0
  151. package/src/block_synchronizer/block_synchronizer.ts +77 -20
  152. package/src/config/index.ts +14 -0
  153. package/src/config/package_info.ts +1 -1
  154. package/src/contract_function_simulator/benchmarked_node.ts +103 -0
  155. package/src/contract_function_simulator/contract_function_simulator.ts +37 -26
  156. package/src/contract_function_simulator/execution_note_cache.ts +44 -25
  157. package/src/contract_function_simulator/index.ts +1 -1
  158. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +5 -1
  159. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -1
  160. package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
  161. package/src/contract_function_simulator/oracle/interfaces.ts +20 -10
  162. package/src/contract_function_simulator/oracle/note_packing_utils.ts +10 -10
  163. package/src/contract_function_simulator/oracle/oracle.ts +56 -41
  164. package/src/contract_function_simulator/oracle/private_execution.ts +1 -69
  165. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +39 -44
  166. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +90 -76
  167. package/src/contract_sync/index.ts +98 -0
  168. package/src/debug/pxe_debug_utils.ts +3 -2
  169. package/src/entrypoints/client/bundle/utils.ts +7 -1
  170. package/src/entrypoints/client/lazy/utils.ts +7 -2
  171. package/src/entrypoints/pxe_creation_options.ts +2 -1
  172. package/src/entrypoints/server/index.ts +2 -0
  173. package/src/entrypoints/server/utils.ts +11 -15
  174. package/src/events/event_service.ts +17 -21
  175. package/src/events/private_event_filter_validator.ts +3 -5
  176. package/src/job_coordinator/job_coordinator.ts +149 -0
  177. package/src/logs/log_service.ts +27 -9
  178. package/src/notes/note_service.ts +37 -40
  179. package/src/oracle_version.ts +4 -3
  180. package/src/private_kernel/hints/index.ts +1 -1
  181. package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +33 -22
  182. package/src/private_kernel/private_kernel_execution_prover.ts +3 -5
  183. package/src/private_kernel/private_kernel_oracle.ts +116 -36
  184. package/src/pxe.ts +123 -127
  185. package/src/storage/capsule_store/capsule_store.ts +159 -23
  186. package/src/storage/contract_store/contract_store.ts +0 -20
  187. package/src/storage/note_store/note_store.ts +286 -317
  188. package/src/storage/note_store/stored_note.ts +48 -0
  189. package/src/storage/private_event_store/private_event_store.ts +277 -76
  190. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  191. package/src/storage/tagging_store/recipient_tagging_store.ts +89 -13
  192. package/src/storage/tagging_store/sender_tagging_store.ts +129 -28
  193. package/src/tagging/constants.ts +10 -0
  194. package/src/tagging/get_all_logs_by_tags.ts +68 -0
  195. package/src/tagging/index.ts +2 -11
  196. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +21 -7
  197. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
  198. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +10 -7
  199. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -13
  200. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +16 -4
  201. package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
  202. package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
  203. package/dest/contract_function_simulator/proxied_node.js +0 -27
  204. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
  205. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
  206. package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
  207. package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
  208. package/dest/private_kernel/private_kernel_oracle_impl.js +0 -86
  209. package/dest/public_storage/public_storage_service.d.ts +0 -24
  210. package/dest/public_storage/public_storage_service.d.ts.map +0 -1
  211. package/dest/public_storage/public_storage_service.js +0 -26
  212. package/dest/tree_membership/tree_membership_service.d.ts +0 -52
  213. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  214. package/dest/tree_membership/tree_membership_service.js +0 -84
  215. package/src/contract_function_simulator/proxied_node.ts +0 -33
  216. package/src/private_kernel/private_kernel_oracle_impl.ts +0 -133
  217. package/src/public_storage/public_storage_service.ts +0 -33
  218. package/src/tree_membership/tree_membership_service.ts +0 -112
@@ -1,72 +1,152 @@
1
- import { FUNCTION_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT, VK_TREE_HEIGHT } from '@aztec/constants';
1
+ import { FUNCTION_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT, VK_TREE_HEIGHT } from '@aztec/constants';
2
2
  import type { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import type { GrumpkinScalar, Point } from '@aztec/foundation/curves/grumpkin';
4
4
  import { MembershipWitness } from '@aztec/foundation/trees';
5
+ import type { KeyStore } from '@aztec/key-store';
6
+ import { getVKIndex, getVKSiblingPath } from '@aztec/noir-protocol-circuits-types/vk-tree';
7
+ import { ProtocolContractAddress } from '@aztec/protocol-contracts';
5
8
  import type { FunctionSelector } from '@aztec/stdlib/abi';
6
9
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
10
+ import { L2BlockHash } from '@aztec/stdlib/block';
11
+ import {
12
+ type ContractInstanceWithAddress,
13
+ computeContractClassIdPreimage,
14
+ computeSaltedInitializationHash,
15
+ } from '@aztec/stdlib/contract';
16
+ import { DelayedPublicMutableValues, DelayedPublicMutableValuesWithHash } from '@aztec/stdlib/delayed-public-mutable';
17
+ import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash';
18
+ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
7
19
  import { UpdatedClassIdHints } from '@aztec/stdlib/kernel';
8
- import type { PublicKeys } from '@aztec/stdlib/keys';
9
20
  import type { NullifierMembershipWitness } from '@aztec/stdlib/trees';
10
21
  import type { VerificationKeyAsFields } from '@aztec/stdlib/vks';
11
22
 
23
+ import type { ContractStore } from '../storage/contract_store/contract_store.js';
24
+
12
25
  /**
13
26
  * Provides functionality needed by the private kernel for interacting with our state trees.
14
- * This is either PrivateKernelOracleImpl, or a mocked test implementation.
15
27
  */
16
- export interface PrivateKernelOracle {
28
+ export class PrivateKernelOracle {
29
+ constructor(
30
+ private contractStore: ContractStore,
31
+ private keyStore: KeyStore,
32
+ private node: AztecNode,
33
+ private blockHash: L2BlockHash,
34
+ ) {}
35
+
17
36
  /** Retrieves the preimage of a contract address from the registered contract instances db. */
18
- getContractAddressPreimage(address: AztecAddress): Promise<{
19
- saltedInitializationHash: Fr;
20
- publicKeys: PublicKeys;
21
- currentContractClassId: Fr;
22
- originalContractClassId: Fr;
23
- }>;
37
+ public async getContractAddressPreimage(
38
+ address: AztecAddress,
39
+ ): Promise<ContractInstanceWithAddress & { saltedInitializationHash: Fr }> {
40
+ const instance = await this.contractStore.getContractInstance(address);
41
+ if (!instance) {
42
+ throw new Error(`Contract instance not found when getting address preimage. Contract address: ${address}.`);
43
+ }
44
+ return {
45
+ saltedInitializationHash: await computeSaltedInitializationHash(instance),
46
+ ...instance,
47
+ };
48
+ }
24
49
 
25
50
  /** Retrieves the preimage of a contract class id from the contract classes db. */
26
- getContractClassIdPreimage(
27
- contractClassId: Fr,
28
- ): Promise<{ artifactHash: Fr; publicBytecodeCommitment: Fr; privateFunctionsRoot: Fr }>;
51
+ public async getContractClassIdPreimage(contractClassId: Fr) {
52
+ const contractClass = await this.contractStore.getContractClass(contractClassId);
53
+ if (!contractClass) {
54
+ throw new Error(`Contract class not found when getting class id preimage. Class id: ${contractClassId}.`);
55
+ }
56
+ return computeContractClassIdPreimage(contractClass);
57
+ }
29
58
 
30
- /**
31
- * Returns a membership witness with the sibling path and leaf index in our private functions tree.
32
- */
33
- getFunctionMembershipWitness(
59
+ /** Returns a membership witness with the sibling path and leaf index in our private functions tree. */
60
+ public async getFunctionMembershipWitness(
34
61
  contractClassId: Fr,
35
62
  selector: FunctionSelector,
36
- ): Promise<MembershipWitness<typeof FUNCTION_TREE_HEIGHT>>;
63
+ ): Promise<MembershipWitness<typeof FUNCTION_TREE_HEIGHT>> {
64
+ const membershipWitness = await this.contractStore.getFunctionMembershipWitness(contractClassId, selector);
65
+ if (!membershipWitness) {
66
+ throw new Error(
67
+ `Membership witness not found for contract class id ${contractClassId} and selector ${selector}.`,
68
+ );
69
+ }
70
+ return membershipWitness;
71
+ }
37
72
 
38
73
  /**
39
74
  * Returns a membership witness with the sibling path and leaf index in our protocol VK indexed merkle tree.
40
75
  * Used to validate the previous kernel's verification key.
41
76
  */
42
- getVkMembershipWitness(vk: VerificationKeyAsFields): Promise<MembershipWitness<typeof VK_TREE_HEIGHT>>;
77
+ public getVkMembershipWitness(vk: VerificationKeyAsFields): Promise<MembershipWitness<typeof VK_TREE_HEIGHT>> {
78
+ const leafIndex = getVKIndex(vk);
79
+ return Promise.resolve(new MembershipWitness(VK_TREE_HEIGHT, BigInt(leafIndex), getVKSiblingPath(leafIndex)));
80
+ }
43
81
 
44
- /**
45
- * Returns a membership witness with the sibling path and leaf index in our private function indexed merkle tree.
46
- */ getNoteHashMembershipWitness(leafIndex: bigint): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT>>;
82
+ /** Returns a membership witness with the sibling path and leaf index in our note hash tree. */
83
+ getNoteHashMembershipWitness(noteHash: Fr): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined> {
84
+ return this.node.getNoteHashMembershipWitness(this.blockHash, noteHash);
85
+ }
47
86
 
48
- /**
49
- * Returns a membership witness with the sibling path and leaf index in our nullifier indexed merkle tree.
50
- */
51
- getNullifierMembershipWitness(nullifier: Fr): Promise<NullifierMembershipWitness | undefined>;
52
- /**
53
- * Returns the root of our note hash merkle tree.
54
- */
55
- getNoteHashTreeRoot(): Promise<Fr>;
87
+ /** Returns a membership witness with the sibling path and leaf index in our nullifier indexed merkle tree. */
88
+ getNullifierMembershipWitness(nullifier: Fr): Promise<NullifierMembershipWitness | undefined> {
89
+ return this.node.getNullifierMembershipWitness(this.blockHash, nullifier);
90
+ }
91
+
92
+ /** Returns the root of our note hash merkle tree. */
93
+ async getNoteHashTreeRoot(): Promise<Fr> {
94
+ const header = await this.node.getBlockHeader(this.blockHash);
95
+ if (!header) {
96
+ throw new Error(`No block header found for block hash ${this.blockHash}`);
97
+ }
98
+ return header.state.partial.noteHashTree.root;
99
+ }
56
100
 
57
101
  /**
58
102
  * Retrieves the sk_m corresponding to the pk_m.
59
103
  * @throws If the provided public key is not associated with any of the registered accounts.
60
- * @param pkM - The master public key to get secret key for.
104
+ * @param masterPublicKey - The master public key to get secret key for.
61
105
  * @returns A Promise that resolves to sk_m.
62
106
  * @dev Used when feeding the sk_m to the kernel circuit for keys verification.
63
107
  */
64
- getMasterSecretKey(masterPublicKey: Point): Promise<GrumpkinScalar>;
108
+ public getMasterSecretKey(masterPublicKey: Point): Promise<GrumpkinScalar> {
109
+ return this.keyStore.getMasterSecretKey(masterPublicKey);
110
+ }
65
111
 
66
112
  /** Use debug data to get the function name corresponding to a selector. */
67
- getDebugFunctionName(contractAddress: AztecAddress, selector: FunctionSelector): Promise<string | undefined>;
113
+ public getDebugFunctionName(contractAddress: AztecAddress, selector: FunctionSelector): Promise<string | undefined> {
114
+ return this.contractStore.getDebugFunctionName(contractAddress, selector);
115
+ }
116
+
117
+ /**
118
+ * Returns a membership witness and leaf index to our public data indexed merkle tree,
119
+ * along with an associated DelayedPublicMutable containing the class ID to update.
120
+ */
121
+ public async getUpdatedClassIdHints(contractAddress: AztecAddress): Promise<UpdatedClassIdHints> {
122
+ const { delayedPublicMutableSlot, delayedPublicMutableHashSlot } =
123
+ await DelayedPublicMutableValuesWithHash.getContractUpdateSlots(contractAddress);
124
+
125
+ const hashLeafSlot = await computePublicDataTreeLeafSlot(
126
+ ProtocolContractAddress.ContractInstanceRegistry,
127
+ delayedPublicMutableHashSlot,
128
+ );
129
+ const updatedClassIdWitness = await this.node.getPublicDataWitness(this.blockHash, hashLeafSlot);
130
+
131
+ if (!updatedClassIdWitness) {
132
+ throw new Error(`No public data tree witness found for ${hashLeafSlot}`);
133
+ }
134
+
135
+ const readStorage = (storageSlot: Fr) =>
136
+ this.node.getPublicStorageAt(this.blockHash, ProtocolContractAddress.ContractInstanceRegistry, storageSlot);
137
+ const delayedPublicMutableValues = await DelayedPublicMutableValues.readFromTree(
138
+ delayedPublicMutableSlot,
139
+ readStorage,
140
+ );
68
141
 
69
- /** Returns a membership witness and leaf index to our public data indexed merkle tree,
70
- * along with an associated DelayedPublicMutable containing the class ID to update. */
71
- getUpdatedClassIdHints(contractAddress: AztecAddress): Promise<UpdatedClassIdHints>;
142
+ return new UpdatedClassIdHints(
143
+ new MembershipWitness(
144
+ PUBLIC_DATA_TREE_HEIGHT,
145
+ updatedClassIdWitness.index,
146
+ updatedClassIdWitness.siblingPath.toTuple(),
147
+ ),
148
+ updatedClassIdWitness.leafPreimage,
149
+ delayedPublicMutableValues,
150
+ );
151
+ }
72
152
  }
package/src/pxe.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
2
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
3
  import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import { type Logger, createLogger } from '@aztec/foundation/log';
4
5
  import { SerialQueue } from '@aztec/foundation/queue';
@@ -19,14 +20,12 @@ import type { AuthWitness } from '@aztec/stdlib/auth-witness';
19
20
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
20
21
  import {
21
22
  CompleteAddress,
22
- type ContractClassWithId,
23
23
  type ContractInstanceWithAddress,
24
24
  type PartialAddress,
25
25
  computeContractAddressFromInstance,
26
26
  getContractClassFromArtifact,
27
27
  } from '@aztec/stdlib/contract';
28
28
  import { SimulationError } from '@aztec/stdlib/errors';
29
- import { computeProtocolNullifier, siloNullifier } from '@aztec/stdlib/hash';
30
29
  import type { AztecNode, PrivateKernelProver } from '@aztec/stdlib/interfaces/client';
31
30
  import type {
32
31
  PrivateExecutionStep,
@@ -54,20 +53,22 @@ import { inspect } from 'util';
54
53
 
55
54
  import { BlockSynchronizer } from './block_synchronizer/index.js';
56
55
  import type { PXEConfig } from './config/index.js';
56
+ import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
57
57
  import {
58
58
  ContractFunctionSimulator,
59
59
  generateSimulatedProvingResult,
60
60
  } from './contract_function_simulator/contract_function_simulator.js';
61
- import { readCurrentClassId } from './contract_function_simulator/oracle/private_execution.js';
62
61
  import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
62
+ import { ensureContractSynced, readCurrentClassId } from './contract_sync/index.js';
63
63
  import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
64
64
  import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
65
65
  import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
66
+ import { JobCoordinator } from './job_coordinator/job_coordinator.js';
66
67
  import {
67
68
  PrivateKernelExecutionProver,
68
69
  type PrivateKernelExecutionProverConfig,
69
70
  } from './private_kernel/private_kernel_execution_prover.js';
70
- import { PrivateKernelOracleImpl } from './private_kernel/private_kernel_oracle_impl.js';
71
+ import { PrivateKernelOracle } from './private_kernel/private_kernel_oracle.js';
71
72
  import { AddressStore } from './storage/address_store/address_store.js';
72
73
  import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_store.js';
73
74
  import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
@@ -107,6 +108,7 @@ export class PXE {
107
108
  private protocolContractsProvider: ProtocolContractsProvider,
108
109
  private log: Logger,
109
110
  private jobQueue: SerialQueue,
111
+ private jobCoordinator: JobCoordinator,
110
112
  public debug: PXEDebugUtils,
111
113
  ) {}
112
114
 
@@ -135,7 +137,7 @@ export class PXE {
135
137
  const addressStore = new AddressStore(store);
136
138
  const privateEventStore = new PrivateEventStore(store);
137
139
  const contractStore = new ContractStore(store);
138
- const noteStore = await NoteStore.create(store);
140
+ const noteStore = new NoteStore(store);
139
141
  const anchorBlockStore = new AnchorBlockStore(store);
140
142
  const senderTaggingStore = new SenderTaggingStore(store);
141
143
  const senderAddressBookStore = new SenderAddressBookStore(store);
@@ -143,7 +145,25 @@ export class PXE {
143
145
  const capsuleStore = new CapsuleStore(store);
144
146
  const keyStore = new KeyStore(store);
145
147
  const tipsStore = new L2TipsKVStore(store, 'pxe');
146
- const synchronizer = new BlockSynchronizer(node, anchorBlockStore, noteStore, tipsStore, config, loggerOrSuffix);
148
+ const synchronizer = new BlockSynchronizer(
149
+ node,
150
+ store,
151
+ anchorBlockStore,
152
+ noteStore,
153
+ privateEventStore,
154
+ tipsStore,
155
+ config,
156
+ loggerOrSuffix,
157
+ );
158
+
159
+ const jobCoordinator = new JobCoordinator(store);
160
+ jobCoordinator.registerStores([
161
+ capsuleStore,
162
+ senderTaggingStore,
163
+ recipientTaggingStore,
164
+ privateEventStore,
165
+ noteStore,
166
+ ]);
147
167
 
148
168
  const debugUtils = new PXEDebugUtils(contractStore, noteStore);
149
169
 
@@ -168,6 +188,7 @@ export class PXE {
168
188
  protocolContractsProvider,
169
189
  log,
170
190
  jobQueue,
191
+ jobCoordinator,
171
192
  debugUtils,
172
193
  );
173
194
 
@@ -191,7 +212,7 @@ export class PXE {
191
212
  this.noteStore,
192
213
  this.keyStore,
193
214
  this.addressStore,
194
- this.node,
215
+ BenchmarkedNodeFactory.create(this.node),
195
216
  this.anchorBlockStore,
196
217
  this.senderTaggingStore,
197
218
  this.recipientTaggingStore,
@@ -222,7 +243,7 @@ export class PXE {
222
243
  *
223
244
  * Useful for tasks that cannot run concurrently, such as contract function simulation.
224
245
  */
225
- #putInJobQueue<T>(fn: () => Promise<T>): Promise<T> {
246
+ #putInJobQueue<T>(fn: (jobId: string) => Promise<T>): Promise<T> {
226
247
  // TODO(#12636): relax the conditions under which we forbid concurrency.
227
248
  if (this.jobQueue.length() != 0) {
228
249
  this.log.warn(
@@ -230,7 +251,22 @@ export class PXE {
230
251
  );
231
252
  }
232
253
 
233
- return this.jobQueue.put(fn);
254
+ return this.jobQueue.put(async () => {
255
+ const jobId = this.jobCoordinator.beginJob();
256
+ this.log.verbose(`Beginning job ${jobId}`);
257
+
258
+ try {
259
+ const result = await fn(jobId);
260
+ this.log.verbose(`Committing job ${jobId}`);
261
+
262
+ await this.jobCoordinator.commitJob(jobId);
263
+ return result;
264
+ } catch (err) {
265
+ this.log.verbose(`Aborting job ${jobId}`);
266
+ await this.jobCoordinator.abortJob(jobId);
267
+ throw err;
268
+ }
269
+ });
234
270
  }
235
271
 
236
272
  async #registerProtocolContracts() {
@@ -245,31 +281,28 @@ export class PXE {
245
281
  this.log.verbose(`Registered protocol contracts in pxe`, registered);
246
282
  }
247
283
 
248
- async #isContractClassPubliclyRegistered(id: Fr): Promise<boolean> {
249
- return !!(await this.node.getContractClass(id));
250
- }
251
-
252
- async #isContractPublished(address: AztecAddress): Promise<boolean> {
253
- return !!(await this.node.getContract(address));
254
- }
255
-
256
- async #isContractInitialized(address: AztecAddress): Promise<boolean> {
257
- const initNullifier = await siloNullifier(address, address.toField());
258
- return !!(await this.node.getNullifierMembershipWitness('latest', initNullifier));
259
- }
260
-
261
284
  // Executes the entrypoint private function, as well as all nested private
262
285
  // functions that might arise.
263
286
  async #executePrivate(
264
287
  contractFunctionSimulator: ContractFunctionSimulator,
265
288
  txRequest: TxExecutionRequest,
266
- scopes?: AztecAddress[],
289
+ scopes: AztecAddress[] | undefined,
290
+ jobId: string,
267
291
  ): Promise<PrivateExecutionResult> {
268
292
  const { origin: contractAddress, functionSelector } = txRequest;
269
293
 
270
294
  try {
271
295
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
272
296
 
297
+ await ensureContractSynced(
298
+ contractAddress,
299
+ functionSelector,
300
+ privateSyncCall => this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
301
+ this.node,
302
+ this.contractStore,
303
+ anchorBlockHeader,
304
+ );
305
+
273
306
  const result = await contractFunctionSimulator.run(
274
307
  txRequest,
275
308
  contractAddress,
@@ -280,6 +313,7 @@ export class PXE {
280
313
  // contract entrypoint
281
314
  undefined, // senderForTags
282
315
  scopes,
316
+ jobId,
283
317
  );
284
318
  this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
285
319
  return result;
@@ -298,17 +332,19 @@ export class PXE {
298
332
  * @param authWitnesses - Authentication witnesses required for the function call.
299
333
  * @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
300
334
  * accounts if not specified.
335
+ * @param jobId - The job ID for staged writes.
301
336
  * @returns The simulation result containing the outputs of the utility function.
302
337
  */
303
338
  async #simulateUtility(
304
339
  contractFunctionSimulator: ContractFunctionSimulator,
305
340
  call: FunctionCall,
306
- authWitnesses?: AuthWitness[],
307
- scopes?: AztecAddress[],
341
+ authWitnesses: AuthWitness[] | undefined,
342
+ scopes: AztecAddress[] | undefined,
343
+ jobId: string,
308
344
  ) {
309
345
  try {
310
346
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
311
- return contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes);
347
+ return contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes, jobId);
312
348
  } catch (err) {
313
349
  if (err instanceof SimulationError) {
314
350
  await enrichSimulationError(err, this.contractStore, this.log);
@@ -361,13 +397,9 @@ export class PXE {
361
397
  privateExecutionResult: PrivateExecutionResult,
362
398
  config: PrivateKernelExecutionProverConfig,
363
399
  ): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
364
- const simulationAnchorBlock = privateExecutionResult.getSimulationAnchorBlockNumber();
365
- const kernelOracle = new PrivateKernelOracleImpl(
366
- this.contractStore,
367
- this.keyStore,
368
- this.node,
369
- simulationAnchorBlock,
370
- );
400
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
401
+ const anchorBlockHash = await anchorBlockHeader.hash();
402
+ const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
371
403
  const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled);
372
404
  this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
373
405
  return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
@@ -380,66 +412,12 @@ export class PXE {
380
412
  }
381
413
 
382
414
  /**
383
- * Returns the contract class metadata given a contract class id.
384
- * The metadata consists of its contract class, whether it has been publicly registered, and its artifact.
385
- * @remark - it queries the node to check whether the contract class with the given id has been publicly registered.
386
- * @param id - Identifier of the class.
387
- * @param includeArtifact - Identifier of the class.
388
- * @returns - It returns the contract class metadata, with the artifact field being optional, and will only be returned if true is passed in
389
- * for `includeArtifact`
390
- * TODO(@spalladino): The PXE actually holds artifacts and not classes, what should we return? Also,
391
- * should the pxe query the node for contract public info, and merge it with its own definitions?
392
- * TODO(@spalladino): This method is strictly needed to decide whether to publicly register a class or not
393
- * during a public deployment. We probably want a nicer and more general API for this, but it'll have to
394
- * do for the time being.
415
+ * Returns the contract artifact for a given contract class id, if it's registered in the PXE.
416
+ * @param id - Identifier of the contract class.
417
+ * @returns The contract artifact if found, undefined otherwise.
395
418
  */
396
- public async getContractClassMetadata(
397
- id: Fr,
398
- includeArtifact: boolean = false,
399
- ): Promise<{
400
- contractClass: ContractClassWithId | undefined;
401
- isContractClassPubliclyRegistered: boolean;
402
- artifact: ContractArtifact | undefined;
403
- }> {
404
- const artifact = await this.contractStore.getContractArtifact(id);
405
- if (!artifact) {
406
- this.log.warn(`No artifact found for contract class ${id.toString()} when looking for its metadata`);
407
- }
408
-
409
- return {
410
- contractClass: artifact && (await getContractClassFromArtifact(artifact)),
411
- isContractClassPubliclyRegistered: await this.#isContractClassPubliclyRegistered(id),
412
- artifact: includeArtifact ? artifact : undefined,
413
- };
414
- }
415
-
416
- /**
417
- * Returns the contract metadata given an address.
418
- * The metadata consists of its contract instance, which includes the contract class identifier,
419
- * initialization hash, deployment salt, and public keys hash; whether the contract instance has been initialized;
420
- * and whether the contract instance with the given address has been publicly deployed.
421
- * @remark - it queries the node to check whether the contract instance has been initialized / publicly deployed through a node.
422
- * This query is not dependent on the PXE.
423
- * @param address - The address that the contract instance resides at.
424
- * @returns - It returns the contract metadata
425
- * TODO(@spalladino): Should we return the public keys in plain as well here?
426
- */
427
- public async getContractMetadata(address: AztecAddress): Promise<{
428
- contractInstance: ContractInstanceWithAddress | undefined;
429
- isContractInitialized: boolean;
430
- isContractPublished: boolean;
431
- }> {
432
- let instance;
433
- try {
434
- instance = await this.contractStore.getContractInstance(address);
435
- } catch {
436
- this.log.warn(`No instance found for contract ${address.toString()} when looking for its metadata`);
437
- }
438
- return {
439
- contractInstance: instance,
440
- isContractInitialized: await this.#isContractInitialized(address),
441
- isContractPublished: await this.#isContractPublished(address),
442
- };
419
+ public async getContractArtifact(id: Fr): Promise<ContractArtifact | undefined> {
420
+ return await this.contractStore.getContractArtifact(id);
443
421
  }
444
422
 
445
423
  /**
@@ -464,7 +442,6 @@ export class PXE {
464
442
  }
465
443
 
466
444
  await this.addressStore.addCompleteAddress(accountCompleteAddress);
467
- await this.noteStore.addScope(accountCompleteAddress.address);
468
445
  return accountCompleteAddress;
469
446
  }
470
447
 
@@ -612,13 +589,7 @@ export class PXE {
612
589
 
613
590
  const header = await this.anchorBlockStore.getBlockHeader();
614
591
 
615
- const currentClassId = await readCurrentClassId(
616
- contractAddress,
617
- currentInstance,
618
- this.node,
619
- header.globalVariables.blockNumber,
620
- header.globalVariables.timestamp,
621
- );
592
+ const currentClassId = await readCurrentClassId(contractAddress, currentInstance, this.node, header);
622
593
  if (!contractClass.id.equals(currentClassId)) {
623
594
  throw new Error('Could not update contract to a class different from the current one.');
624
595
  }
@@ -657,14 +628,14 @@ export class PXE {
657
628
  let privateExecutionResult: PrivateExecutionResult;
658
629
  // We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
659
630
  // computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
660
- return this.#putInJobQueue(async () => {
631
+ return this.#putInJobQueue(async jobId => {
661
632
  const totalTimer = new Timer();
662
633
  try {
663
634
  const syncTimer = new Timer();
664
635
  await this.blockStateSynchronizer.sync();
665
636
  const syncTime = syncTimer.ms();
666
637
  const contractFunctionSimulator = this.#getSimulatorForTx();
667
- privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest);
638
+ privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, undefined, jobId);
668
639
 
669
640
  const {
670
641
  publicInputs,
@@ -711,7 +682,7 @@ export class PXE {
711
682
  // TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
712
683
  const txHash = (await txProvingResult.toTx()).txHash;
713
684
 
714
- await this.senderTaggingStore.storePendingIndexes(preTagsUsedInTheTx, txHash);
685
+ await this.senderTaggingStore.storePendingIndexes(preTagsUsedInTheTx, txHash, jobId);
715
686
  this.log.debug(`Stored used pre-tags as sender for the tx`, {
716
687
  preTagsUsedInTheTx,
717
688
  });
@@ -741,7 +712,7 @@ export class PXE {
741
712
  skipProofGeneration: boolean = true,
742
713
  ): Promise<TxProfileResult> {
743
714
  // We disable concurrent profiles for consistency with simulateTx.
744
- return this.#putInJobQueue(async () => {
715
+ return this.#putInJobQueue(async jobId => {
745
716
  const totalTimer = new Timer();
746
717
  try {
747
718
  const txInfo = {
@@ -761,7 +732,12 @@ export class PXE {
761
732
  const syncTime = syncTimer.ms();
762
733
 
763
734
  const contractFunctionSimulator = this.#getSimulatorForTx();
764
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest);
735
+ const privateExecutionResult = await this.#executePrivate(
736
+ contractFunctionSimulator,
737
+ txRequest,
738
+ undefined,
739
+ jobId,
740
+ );
765
741
 
766
742
  const { executionSteps, timings: { proving } = {} } = await this.#prove(
767
743
  txRequest,
@@ -841,7 +817,7 @@ export class PXE {
841
817
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
842
818
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
843
819
  // delete the same read value, or reading values that another simulation is currently modifying).
844
- return this.#putInJobQueue(async () => {
820
+ return this.#putInJobQueue(async jobId => {
845
821
  try {
846
822
  const totalTimer = new Timer();
847
823
  const txInfo = {
@@ -867,20 +843,14 @@ export class PXE {
867
843
  const skipKernels = overrides?.contracts !== undefined && Object.keys(overrides.contracts ?? {}).length > 0;
868
844
 
869
845
  // Execution of private functions only; no proving, and no kernel logic.
870
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes);
846
+ const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
871
847
 
872
848
  let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
873
849
  let executionSteps: PrivateExecutionStep[] = [];
874
850
 
875
851
  if (skipKernels) {
876
- // According to the protocol rules, the nonce generator for the note hashes
877
- // can either be the first nullifier in the tx or the protocol nullifier if there are none.
878
- const nonceGenerator = privateExecutionResult.firstNullifier.equals(Fr.ZERO)
879
- ? await computeProtocolNullifier(await txRequest.toTxRequest().hash())
880
- : privateExecutionResult.firstNullifier;
881
852
  ({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
882
853
  privateExecutionResult,
883
- nonceGenerator,
884
854
  this.contractStore,
885
855
  ));
886
856
  } else {
@@ -982,7 +952,7 @@ export class PXE {
982
952
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
983
953
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
984
954
  // delete the same read value, or reading values that another simulation is currently modifying).
985
- return this.#putInJobQueue(async () => {
955
+ return this.#putInJobQueue(async jobId => {
986
956
  try {
987
957
  const totalTimer = new Timer();
988
958
  const syncTimer = new Timer();
@@ -991,11 +961,23 @@ export class PXE {
991
961
  const functionTimer = new Timer();
992
962
  const contractFunctionSimulator = this.#getSimulatorForTx();
993
963
 
994
- await this.contractStore.syncPrivateState(call.to, call.selector, privateSyncCall =>
995
- this.#simulateUtility(contractFunctionSimulator, privateSyncCall),
964
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
965
+ await ensureContractSynced(
966
+ call.to,
967
+ call.selector,
968
+ privateSyncCall => this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
969
+ this.node,
970
+ this.contractStore,
971
+ anchorBlockHeader,
996
972
  );
997
973
 
998
- const executionResult = await this.#simulateUtility(contractFunctionSimulator, call, authwits ?? [], scopes);
974
+ const executionResult = await this.#simulateUtility(
975
+ contractFunctionSimulator,
976
+ call,
977
+ authwits ?? [],
978
+ scopes,
979
+ jobId,
980
+ );
999
981
  const functionTime = functionTimer.ms();
1000
982
 
1001
983
  const totalTime = totalTimer.ms();
@@ -1036,25 +1018,39 @@ export class PXE {
1036
1018
  * Defaults to the latest known block to PXE + 1.
1037
1019
  * @returns - The packed events with block and tx metadata.
1038
1020
  */
1039
- public getPrivateEvents(eventSelector: EventSelector, filter: PrivateEventFilter): Promise<PackedPrivateEvent[]> {
1040
- return this.#putInJobQueue(async () => {
1021
+ public async getPrivateEvents(
1022
+ eventSelector: EventSelector,
1023
+ filter: PrivateEventFilter,
1024
+ ): Promise<PackedPrivateEvent[]> {
1025
+ let anchorBlockNumber: BlockNumber;
1026
+
1027
+ await this.#putInJobQueue(async jobId => {
1041
1028
  await this.blockStateSynchronizer.sync();
1029
+
1030
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1031
+ anchorBlockNumber = anchorBlockHeader.getBlockNumber();
1032
+
1042
1033
  const contractFunctionSimulator = this.#getSimulatorForTx();
1043
1034
 
1044
- await this.contractStore.syncPrivateState(
1035
+ await ensureContractSynced(
1045
1036
  filter.contractAddress,
1046
1037
  null,
1047
- async privateSyncCall => await this.#simulateUtility(contractFunctionSimulator, privateSyncCall),
1038
+ async privateSyncCall =>
1039
+ await this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
1040
+ this.node,
1041
+ this.contractStore,
1042
+ anchorBlockHeader,
1048
1043
  );
1044
+ });
1049
1045
 
1050
- const sanitizedFilter = await new PrivateEventFilterValidator(this.anchorBlockStore).validate(filter);
1046
+ // anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
1047
+ const sanitizedFilter = new PrivateEventFilterValidator(anchorBlockNumber!).validate(filter);
1051
1048
 
1052
- this.log.debug(
1053
- `Getting private events for ${sanitizedFilter.contractAddress.toString()} from ${sanitizedFilter.fromBlock} to ${sanitizedFilter.toBlock}`,
1054
- );
1049
+ this.log.debug(
1050
+ `Getting private events for ${sanitizedFilter.contractAddress.toString()} from ${sanitizedFilter.fromBlock} to ${sanitizedFilter.toBlock}`,
1051
+ );
1055
1052
 
1056
- return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
1057
- });
1053
+ return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
1058
1054
  }
1059
1055
 
1060
1056
  /**