@aztec/pxe 0.0.0-test.1 → 0.0.1-commit.b655e406

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 (309) hide show
  1. package/README.md +5 -5
  2. package/dest/bin/check_oracle_version.d.ts +2 -0
  3. package/dest/bin/check_oracle_version.d.ts.map +1 -0
  4. package/dest/bin/check_oracle_version.js +39 -0
  5. package/dest/config/index.d.ts +10 -15
  6. package/dest/config/index.d.ts.map +1 -1
  7. package/dest/config/index.js +11 -20
  8. package/dest/config/package_info.js +1 -1
  9. package/dest/contract_function_simulator/contract_function_simulator.d.ts +56 -0
  10. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -0
  11. package/dest/contract_function_simulator/contract_function_simulator.js +301 -0
  12. package/dest/contract_function_simulator/execution_data_provider.d.ts +274 -0
  13. package/dest/contract_function_simulator/execution_data_provider.d.ts.map +1 -0
  14. package/dest/contract_function_simulator/execution_data_provider.js +14 -0
  15. package/dest/contract_function_simulator/execution_note_cache.d.ts +93 -0
  16. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -0
  17. package/dest/contract_function_simulator/execution_note_cache.js +183 -0
  18. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +16 -0
  19. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -0
  20. package/dest/contract_function_simulator/execution_tagging_index_cache.js +26 -0
  21. package/dest/contract_function_simulator/hashed_values_cache.d.ts +28 -0
  22. package/dest/contract_function_simulator/hashed_values_cache.d.ts.map +1 -0
  23. package/dest/contract_function_simulator/hashed_values_cache.js +36 -0
  24. package/dest/contract_function_simulator/index.d.ts +14 -0
  25. package/dest/contract_function_simulator/index.d.ts.map +1 -0
  26. package/dest/contract_function_simulator/index.js +12 -0
  27. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +20 -0
  28. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -0
  29. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +37 -0
  30. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +15 -0
  31. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -0
  32. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +25 -0
  33. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +17 -0
  34. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -0
  35. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +65 -0
  36. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +22 -0
  37. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -0
  38. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +42 -0
  39. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +22 -0
  40. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -0
  41. package/dest/contract_function_simulator/noir-structs/utility_context.js +33 -0
  42. package/dest/contract_function_simulator/oracle/index.d.ts +14 -0
  43. package/dest/contract_function_simulator/oracle/index.d.ts.map +1 -0
  44. package/dest/contract_function_simulator/oracle/index.js +2 -0
  45. package/dest/contract_function_simulator/oracle/interfaces.d.ts +97 -0
  46. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -0
  47. package/dest/contract_function_simulator/oracle/interfaces.js +4 -0
  48. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +19 -0
  49. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -0
  50. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +24 -0
  51. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +22 -0
  52. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -0
  53. package/dest/contract_function_simulator/oracle/note_packing_utils.js +49 -0
  54. package/dest/contract_function_simulator/oracle/oracle.d.ts +57 -0
  55. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -0
  56. package/dest/contract_function_simulator/oracle/oracle.js +328 -0
  57. package/dest/contract_function_simulator/oracle/private_execution.d.ts +48 -0
  58. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -0
  59. package/dest/contract_function_simulator/oracle/private_execution.js +123 -0
  60. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +236 -0
  61. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -0
  62. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +417 -0
  63. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +154 -0
  64. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -0
  65. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +265 -0
  66. package/dest/contract_function_simulator/pick_notes.d.ts +85 -0
  67. package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -0
  68. package/dest/contract_function_simulator/pick_notes.js +51 -0
  69. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +6 -0
  70. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -0
  71. package/dest/contract_function_simulator/proxied_contract_data_source.js +62 -0
  72. package/dest/contract_function_simulator/proxied_node.d.ts +9 -0
  73. package/dest/contract_function_simulator/proxied_node.d.ts.map +1 -0
  74. package/dest/contract_function_simulator/proxied_node.js +27 -0
  75. package/dest/contract_function_simulator/pxe_oracle_interface.d.ts +122 -0
  76. package/dest/contract_function_simulator/pxe_oracle_interface.d.ts.map +1 -0
  77. package/dest/contract_function_simulator/pxe_oracle_interface.js +701 -0
  78. package/dest/entrypoints/client/bundle/index.d.ts +4 -2
  79. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  80. package/dest/entrypoints/client/bundle/index.js +3 -2
  81. package/dest/entrypoints/client/bundle/utils.d.ts +9 -9
  82. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  83. package/dest/entrypoints/client/bundle/utils.js +18 -12
  84. package/dest/entrypoints/client/lazy/index.d.ts +4 -2
  85. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  86. package/dest/entrypoints/client/lazy/index.js +3 -2
  87. package/dest/entrypoints/client/lazy/utils.d.ts +8 -8
  88. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  89. package/dest/entrypoints/client/lazy/utils.js +17 -11
  90. package/dest/entrypoints/{client/pxe_creation_options.d.ts → pxe_creation_options.d.ts} +4 -1
  91. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -0
  92. package/dest/entrypoints/server/index.d.ts +5 -3
  93. package/dest/entrypoints/server/index.d.ts.map +1 -1
  94. package/dest/entrypoints/server/index.js +4 -3
  95. package/dest/entrypoints/server/utils.d.ts +7 -15
  96. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  97. package/dest/entrypoints/server/utils.js +34 -28
  98. package/dest/{pxe_service/error_enriching.d.ts → error_enriching.d.ts} +1 -1
  99. package/dest/error_enriching.d.ts.map +1 -0
  100. package/dest/{pxe_service/error_enriching.js → error_enriching.js} +26 -18
  101. package/dest/oracle_version.d.ts +3 -0
  102. package/dest/oracle_version.d.ts.map +1 -0
  103. package/dest/oracle_version.js +10 -0
  104. package/dest/{kernel_prover → private_kernel}/hints/build_private_kernel_reset_private_inputs.d.ts +6 -6
  105. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +1 -0
  106. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.js +271 -0
  107. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +4 -0
  108. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +1 -0
  109. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.js +41 -0
  110. package/dest/private_kernel/hints/index.d.ts +3 -0
  111. package/dest/private_kernel/hints/index.d.ts.map +1 -0
  112. package/dest/{kernel_prover → private_kernel}/hints/index.js +1 -0
  113. package/dest/private_kernel/index.d.ts +3 -0
  114. package/dest/private_kernel/index.d.ts.map +1 -0
  115. package/dest/private_kernel/index.js +2 -0
  116. package/dest/private_kernel/private_kernel_execution_prover.d.ts +44 -0
  117. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -0
  118. package/dest/private_kernel/private_kernel_execution_prover.js +285 -0
  119. package/dest/{kernel_prover/proving_data_oracle.d.ts → private_kernel/private_kernel_oracle.d.ts} +17 -28
  120. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -0
  121. package/dest/private_kernel/private_kernel_oracle.js +4 -0
  122. package/dest/{kernel_oracle/index.d.ts → private_kernel/private_kernel_oracle_impl.d.ts} +8 -8
  123. package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +1 -0
  124. package/dest/{kernel_oracle/index.js → private_kernel/private_kernel_oracle_impl.js} +19 -9
  125. package/dest/pxe.d.ts +233 -0
  126. package/dest/pxe.d.ts.map +1 -0
  127. package/dest/pxe.js +789 -0
  128. package/dest/storage/address_data_provider/address_data_provider.d.ts +1 -3
  129. package/dest/storage/address_data_provider/address_data_provider.d.ts.map +1 -1
  130. package/dest/storage/address_data_provider/address_data_provider.js +0 -3
  131. package/dest/storage/capsule_data_provider/capsule_data_provider.d.ts +14 -5
  132. package/dest/storage/capsule_data_provider/capsule_data_provider.d.ts.map +1 -1
  133. package/dest/storage/capsule_data_provider/capsule_data_provider.js +85 -24
  134. package/dest/storage/contract_data_provider/contract_data_provider.d.ts +12 -47
  135. package/dest/storage/contract_data_provider/contract_data_provider.d.ts.map +1 -1
  136. package/dest/storage/contract_data_provider/contract_data_provider.js +92 -70
  137. package/dest/storage/contract_data_provider/index.d.ts +0 -1
  138. package/dest/storage/contract_data_provider/index.d.ts.map +1 -1
  139. package/dest/storage/contract_data_provider/index.js +0 -1
  140. package/dest/storage/contract_data_provider/private_functions_tree.d.ts +2 -41
  141. package/dest/storage/contract_data_provider/private_functions_tree.d.ts.map +1 -1
  142. package/dest/storage/contract_data_provider/private_functions_tree.js +9 -61
  143. package/dest/storage/index.d.ts +2 -3
  144. package/dest/storage/index.d.ts.map +1 -1
  145. package/dest/storage/index.js +2 -3
  146. package/dest/storage/metadata.d.ts +2 -0
  147. package/dest/storage/metadata.d.ts.map +1 -0
  148. package/dest/storage/metadata.js +1 -0
  149. package/dest/storage/note_data_provider/note_dao.d.ts +16 -22
  150. package/dest/storage/note_data_provider/note_dao.d.ts.map +1 -1
  151. package/dest/storage/note_data_provider/note_dao.js +16 -20
  152. package/dest/storage/note_data_provider/note_data_provider.d.ts +71 -8
  153. package/dest/storage/note_data_provider/note_data_provider.d.ts.map +1 -1
  154. package/dest/storage/note_data_provider/note_data_provider.js +133 -74
  155. package/dest/storage/private_event_data_provider/private_event_data_provider.d.ts +43 -0
  156. package/dest/storage/private_event_data_provider/private_event_data_provider.d.ts.map +1 -0
  157. package/dest/storage/private_event_data_provider/private_event_data_provider.js +104 -0
  158. package/dest/storage/sync_data_provider/sync_data_provider.d.ts +2 -4
  159. package/dest/storage/sync_data_provider/sync_data_provider.d.ts.map +1 -1
  160. package/dest/storage/sync_data_provider/sync_data_provider.js +2 -5
  161. package/dest/storage/tagging_data_provider/tagging_data_provider.d.ts +28 -6
  162. package/dest/storage/tagging_data_provider/tagging_data_provider.d.ts.map +1 -1
  163. package/dest/storage/tagging_data_provider/tagging_data_provider.js +48 -24
  164. package/dest/synchronizer/synchronizer.d.ts +7 -9
  165. package/dest/synchronizer/synchronizer.d.ts.map +1 -1
  166. package/dest/synchronizer/synchronizer.js +17 -19
  167. package/dest/tagging/constants.d.ts +2 -0
  168. package/dest/tagging/constants.d.ts.map +1 -0
  169. package/dest/tagging/constants.js +2 -0
  170. package/dest/tagging/index.d.ts +7 -0
  171. package/dest/tagging/index.d.ts.map +1 -0
  172. package/dest/tagging/index.js +5 -0
  173. package/dest/tagging/siloed_tag.d.ts +14 -0
  174. package/dest/tagging/siloed_tag.d.ts.map +1 -0
  175. package/dest/tagging/siloed_tag.js +20 -0
  176. package/dest/tagging/tag.d.ts +12 -0
  177. package/dest/tagging/tag.d.ts.map +1 -0
  178. package/dest/tagging/tag.js +17 -0
  179. package/dest/tagging/utils.d.ts +18 -0
  180. package/dest/tagging/utils.d.ts.map +1 -0
  181. package/dest/tagging/utils.js +24 -0
  182. package/package.json +34 -32
  183. package/src/bin/check_oracle_version.ts +50 -0
  184. package/src/config/index.ts +20 -33
  185. package/src/config/package_info.ts +1 -1
  186. package/src/contract_function_simulator/contract_function_simulator.ts +548 -0
  187. package/src/contract_function_simulator/execution_data_provider.ts +343 -0
  188. package/src/contract_function_simulator/execution_note_cache.ts +222 -0
  189. package/src/contract_function_simulator/execution_tagging_index_cache.ts +32 -0
  190. package/src/contract_function_simulator/hashed_values_cache.ts +47 -0
  191. package/src/contract_function_simulator/index.ts +13 -0
  192. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +47 -0
  193. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +27 -0
  194. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +69 -0
  195. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +52 -0
  196. package/src/contract_function_simulator/noir-structs/utility_context.ts +42 -0
  197. package/src/contract_function_simulator/oracle/index.ts +16 -0
  198. package/src/contract_function_simulator/oracle/interfaces.ts +160 -0
  199. package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +23 -0
  200. package/src/contract_function_simulator/oracle/note_packing_utils.ts +52 -0
  201. package/src/contract_function_simulator/oracle/oracle.ts +575 -0
  202. package/src/contract_function_simulator/oracle/private_execution.ts +207 -0
  203. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +625 -0
  204. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +358 -0
  205. package/src/contract_function_simulator/pick_notes.ts +141 -0
  206. package/src/contract_function_simulator/proxied_contract_data_source.ts +66 -0
  207. package/src/contract_function_simulator/proxied_node.ts +33 -0
  208. package/src/contract_function_simulator/pxe_oracle_interface.ts +1019 -0
  209. package/src/entrypoints/client/bundle/index.ts +4 -2
  210. package/src/entrypoints/client/bundle/utils.ts +36 -36
  211. package/src/entrypoints/client/lazy/index.ts +4 -2
  212. package/src/entrypoints/client/lazy/utils.ts +36 -31
  213. package/src/entrypoints/{client/pxe_creation_options.ts → pxe_creation_options.ts} +4 -1
  214. package/src/entrypoints/server/index.ts +5 -3
  215. package/src/entrypoints/server/utils.ts +69 -47
  216. package/src/{pxe_service/error_enriching.ts → error_enriching.ts} +36 -27
  217. package/src/oracle_version.ts +11 -0
  218. package/src/{kernel_prover → private_kernel}/hints/build_private_kernel_reset_private_inputs.ts +158 -142
  219. package/src/private_kernel/hints/compute_tx_include_by_timestamp.ts +58 -0
  220. package/src/{kernel_prover → private_kernel}/hints/index.ts +1 -0
  221. package/src/private_kernel/index.ts +2 -0
  222. package/src/private_kernel/private_kernel_execution_prover.ts +436 -0
  223. package/src/{kernel_prover/proving_data_oracle.ts → private_kernel/private_kernel_oracle.ts} +17 -29
  224. package/src/{kernel_oracle/index.ts → private_kernel/private_kernel_oracle_impl.ts} +30 -15
  225. package/src/pxe.ts +1113 -0
  226. package/src/storage/address_data_provider/address_data_provider.ts +1 -7
  227. package/src/storage/capsule_data_provider/capsule_data_provider.ts +97 -30
  228. package/src/storage/contract_data_provider/contract_data_provider.ts +114 -81
  229. package/src/storage/contract_data_provider/index.ts +0 -1
  230. package/src/storage/contract_data_provider/private_functions_tree.ts +11 -75
  231. package/src/storage/index.ts +2 -4
  232. package/src/storage/metadata.ts +1 -0
  233. package/src/storage/note_data_provider/note_dao.ts +19 -27
  234. package/src/storage/note_data_provider/note_data_provider.ts +161 -113
  235. package/src/storage/private_event_data_provider/private_event_data_provider.ts +148 -0
  236. package/src/storage/sync_data_provider/sync_data_provider.ts +4 -10
  237. package/src/storage/tagging_data_provider/tagging_data_provider.ts +58 -30
  238. package/src/synchronizer/synchronizer.ts +21 -22
  239. package/src/tagging/constants.ts +2 -0
  240. package/src/tagging/index.ts +6 -0
  241. package/src/tagging/siloed_tag.ts +22 -0
  242. package/src/tagging/tag.ts +16 -0
  243. package/src/tagging/utils.ts +31 -0
  244. package/dest/bin/index.d.ts +0 -3
  245. package/dest/bin/index.d.ts.map +0 -1
  246. package/dest/bin/index.js +0 -28
  247. package/dest/entrypoints/client/pxe_creation_options.d.ts.map +0 -1
  248. package/dest/kernel_oracle/index.d.ts.map +0 -1
  249. package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
  250. package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.js +0 -270
  251. package/dest/kernel_prover/hints/index.d.ts +0 -2
  252. package/dest/kernel_prover/hints/index.d.ts.map +0 -1
  253. package/dest/kernel_prover/index.d.ts +0 -3
  254. package/dest/kernel_prover/index.d.ts.map +0 -1
  255. package/dest/kernel_prover/index.js +0 -2
  256. package/dest/kernel_prover/kernel_prover.d.ts +0 -38
  257. package/dest/kernel_prover/kernel_prover.d.ts.map +0 -1
  258. package/dest/kernel_prover/kernel_prover.js +0 -217
  259. package/dest/kernel_prover/proving_data_oracle.d.ts.map +0 -1
  260. package/dest/kernel_prover/proving_data_oracle.js +0 -4
  261. package/dest/note_decryption_utils/add_public_values_to_payload.d.ts +0 -11
  262. package/dest/note_decryption_utils/add_public_values_to_payload.d.ts.map +0 -1
  263. package/dest/note_decryption_utils/add_public_values_to_payload.js +0 -47
  264. package/dest/pxe_http/index.d.ts +0 -2
  265. package/dest/pxe_http/index.d.ts.map +0 -1
  266. package/dest/pxe_http/index.js +0 -1
  267. package/dest/pxe_http/pxe_http_server.d.ts +0 -16
  268. package/dest/pxe_http/pxe_http_server.d.ts.map +0 -1
  269. package/dest/pxe_http/pxe_http_server.js +0 -27
  270. package/dest/pxe_oracle_interface/index.d.ts +0 -159
  271. package/dest/pxe_oracle_interface/index.d.ts.map +0 -1
  272. package/dest/pxe_oracle_interface/index.js +0 -692
  273. package/dest/pxe_oracle_interface/tagging_utils.d.ts +0 -17
  274. package/dest/pxe_oracle_interface/tagging_utils.d.ts.map +0 -1
  275. package/dest/pxe_oracle_interface/tagging_utils.js +0 -23
  276. package/dest/pxe_service/error_enriching.d.ts.map +0 -1
  277. package/dest/pxe_service/index.d.ts +0 -3
  278. package/dest/pxe_service/index.d.ts.map +0 -1
  279. package/dest/pxe_service/index.js +0 -2
  280. package/dest/pxe_service/pxe_service.d.ts +0 -111
  281. package/dest/pxe_service/pxe_service.d.ts.map +0 -1
  282. package/dest/pxe_service/pxe_service.js +0 -664
  283. package/dest/storage/auth_witness_data_provider/auth_witness_data_provider.d.ts +0 -11
  284. package/dest/storage/auth_witness_data_provider/auth_witness_data_provider.d.ts.map +0 -1
  285. package/dest/storage/auth_witness_data_provider/auth_witness_data_provider.js +0 -20
  286. package/dest/storage/auth_witness_data_provider/index.d.ts +0 -2
  287. package/dest/storage/auth_witness_data_provider/index.d.ts.map +0 -1
  288. package/dest/storage/auth_witness_data_provider/index.js +0 -1
  289. package/dest/storage/data_provider.d.ts +0 -4
  290. package/dest/storage/data_provider.d.ts.map +0 -1
  291. package/dest/storage/data_provider.js +0 -1
  292. package/dest/test/pxe_test_suite.d.ts +0 -3
  293. package/dest/test/pxe_test_suite.d.ts.map +0 -1
  294. package/dest/test/pxe_test_suite.js +0 -97
  295. package/src/bin/index.ts +0 -38
  296. package/src/kernel_prover/index.ts +0 -2
  297. package/src/kernel_prover/kernel_prover.ts +0 -351
  298. package/src/note_decryption_utils/add_public_values_to_payload.ts +0 -64
  299. package/src/pxe_http/index.ts +0 -1
  300. package/src/pxe_http/pxe_http_server.ts +0 -29
  301. package/src/pxe_oracle_interface/index.ts +0 -925
  302. package/src/pxe_oracle_interface/tagging_utils.ts +0 -32
  303. package/src/pxe_service/index.ts +0 -2
  304. package/src/pxe_service/pxe_service.ts +0 -949
  305. package/src/storage/auth_witness_data_provider/auth_witness_data_provider.ts +0 -34
  306. package/src/storage/auth_witness_data_provider/index.ts +0 -1
  307. package/src/storage/data_provider.ts +0 -3
  308. package/src/test/pxe_test_suite.ts +0 -111
  309. /package/dest/entrypoints/{client/pxe_creation_options.js → pxe_creation_options.js} +0 -0
@@ -1,949 +0,0 @@
1
- import { L1_TO_L2_MSG_TREE_HEIGHT } from '@aztec/constants';
2
- import { Fr, type Point } from '@aztec/foundation/fields';
3
- import { type Logger, createLogger } from '@aztec/foundation/log';
4
- import { Timer } from '@aztec/foundation/timer';
5
- import type { SiblingPath } from '@aztec/foundation/trees';
6
- import { KeyStore } from '@aztec/key-store';
7
- import type { AztecAsyncKVStore } from '@aztec/kv-store';
8
- import { L2TipsStore } from '@aztec/kv-store/stores';
9
- import {
10
- ProtocolContractAddress,
11
- type ProtocolContractsProvider,
12
- protocolContractNames,
13
- } from '@aztec/protocol-contracts';
14
- import { AcirSimulator, type SimulationProvider, readCurrentClassId } from '@aztec/simulator/client';
15
- import {
16
- type AbiDecoded,
17
- type ContractArtifact,
18
- EventSelector,
19
- FunctionCall,
20
- FunctionSelector,
21
- FunctionType,
22
- decodeFunctionSignature,
23
- encodeArguments,
24
- } from '@aztec/stdlib/abi';
25
- import type { AuthWitness } from '@aztec/stdlib/auth-witness';
26
- import type { AztecAddress } from '@aztec/stdlib/aztec-address';
27
- import type { InBlock, L2Block } from '@aztec/stdlib/block';
28
- import {
29
- CompleteAddress,
30
- type ContractClassWithId,
31
- type ContractInstanceWithAddress,
32
- type NodeInfo,
33
- type PartialAddress,
34
- } from '@aztec/stdlib/contract';
35
- import { computeContractAddressFromInstance, getContractClassFromArtifact } from '@aztec/stdlib/contract';
36
- import { SimulationError } from '@aztec/stdlib/errors';
37
- import { EventMetadata, L1EventPayload } from '@aztec/stdlib/event';
38
- import type { GasFees } from '@aztec/stdlib/gas';
39
- import { siloNullifier } from '@aztec/stdlib/hash';
40
- import type {
41
- AztecNode,
42
- EventMetadataDefinition,
43
- GetContractClassLogsResponse,
44
- GetPublicLogsResponse,
45
- PXE,
46
- PXEInfo,
47
- PrivateKernelProver,
48
- } from '@aztec/stdlib/interfaces/client';
49
- import { type PrivateKernelSimulateOutput, PrivateKernelTailCircuitPublicInputs } from '@aztec/stdlib/kernel';
50
- import { computeAddressSecret } from '@aztec/stdlib/keys';
51
- import type { LogFilter } from '@aztec/stdlib/logs';
52
- import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
53
- import { type NotesFilter, UniqueNote } from '@aztec/stdlib/note';
54
- import { MerkleTreeId } from '@aztec/stdlib/trees';
55
- import {
56
- PrivateExecutionResult,
57
- PrivateSimulationResult,
58
- type PublicSimulationOutput,
59
- type Tx,
60
- type TxEffect,
61
- type TxExecutionRequest,
62
- type TxHash,
63
- TxProvingResult,
64
- type TxReceipt,
65
- TxSimulationResult,
66
- } from '@aztec/stdlib/tx';
67
-
68
- import { inspect } from 'util';
69
-
70
- import type { PXEServiceConfig } from '../config/index.js';
71
- import { getPackageInfo } from '../config/package_info.js';
72
- import { KernelOracle } from '../kernel_oracle/index.js';
73
- import { KernelProver, type ProvingConfig } from '../kernel_prover/kernel_prover.js';
74
- import { PXEOracleInterface } from '../pxe_oracle_interface/index.js';
75
- import { AddressDataProvider } from '../storage/address_data_provider/address_data_provider.js';
76
- import { AuthWitnessDataProvider } from '../storage/auth_witness_data_provider/auth_witness_data_provider.js';
77
- import { CapsuleDataProvider } from '../storage/capsule_data_provider/capsule_data_provider.js';
78
- import { ContractDataProvider } from '../storage/contract_data_provider/contract_data_provider.js';
79
- import { NoteDataProvider } from '../storage/note_data_provider/note_data_provider.js';
80
- import { SyncDataProvider } from '../storage/sync_data_provider/sync_data_provider.js';
81
- import { TaggingDataProvider } from '../storage/tagging_data_provider/tagging_data_provider.js';
82
- import { Synchronizer } from '../synchronizer/index.js';
83
- import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
84
-
85
- /**
86
- * A Private eXecution Environment (PXE) implementation.
87
- */
88
- export class PXEService implements PXE {
89
- private constructor(
90
- private node: AztecNode,
91
- private synchronizer: Synchronizer,
92
- private keyStore: KeyStore,
93
- private contractDataProvider: ContractDataProvider,
94
- private noteDataProvider: NoteDataProvider,
95
- private capsuleDataProvider: CapsuleDataProvider,
96
- private syncDataProvider: SyncDataProvider,
97
- private taggingDataProvider: TaggingDataProvider,
98
- private addressDataProvider: AddressDataProvider,
99
- private authWitnessDataProvider: AuthWitnessDataProvider,
100
- private simulator: AcirSimulator,
101
- private packageVersion: string,
102
- private proverEnabled: boolean,
103
- private proofCreator: PrivateKernelProver,
104
- private protocolContractsProvider: ProtocolContractsProvider,
105
- private log: Logger,
106
- ) {}
107
-
108
- /**
109
- * Creates an instance of a PXE Service by instantiating all the necessary data providers and services.
110
- * Also triggers the registration of the protocol contracts and makes sure the provided node
111
- * can be contacted.
112
- *
113
- * @returns A promise that resolves PXE service is ready to be used.
114
- */
115
- public static async create(
116
- node: AztecNode,
117
- store: AztecAsyncKVStore,
118
- proofCreator: PrivateKernelProver,
119
- simulationProvider: SimulationProvider,
120
- protocolContractsProvider: ProtocolContractsProvider,
121
- config: PXEServiceConfig,
122
- loggerOrSuffix?: string | Logger,
123
- ) {
124
- const log =
125
- !loggerOrSuffix || typeof loggerOrSuffix === 'string'
126
- ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
127
- : loggerOrSuffix;
128
-
129
- const packageVersion = getPackageInfo().version;
130
- const proverEnabled = !!config.proverEnabled;
131
- const addressDataProvider = new AddressDataProvider(store);
132
- const authWitnessDataProvider = new AuthWitnessDataProvider(store);
133
- const contractDataProvider = new ContractDataProvider(store);
134
- const noteDataProvider = await NoteDataProvider.create(store);
135
- const syncDataProvider = new SyncDataProvider(store);
136
- const taggingDataProvider = new TaggingDataProvider(store);
137
- const capsuleDataProvider = new CapsuleDataProvider(store);
138
- const keyStore = new KeyStore(store);
139
- const tipsStore = new L2TipsStore(store, 'pxe');
140
- const synchronizer = new Synchronizer(
141
- node,
142
- syncDataProvider,
143
- noteDataProvider,
144
- taggingDataProvider,
145
- tipsStore,
146
- config,
147
- loggerOrSuffix,
148
- );
149
- const pxeOracleInterface = new PXEOracleInterface(
150
- node,
151
- keyStore,
152
- simulationProvider,
153
- contractDataProvider,
154
- noteDataProvider,
155
- capsuleDataProvider,
156
- syncDataProvider,
157
- taggingDataProvider,
158
- addressDataProvider,
159
- authWitnessDataProvider,
160
- log,
161
- );
162
- const simulator = new AcirSimulator(pxeOracleInterface, simulationProvider);
163
- const pxeService = new PXEService(
164
- node,
165
- synchronizer,
166
- keyStore,
167
- contractDataProvider,
168
- noteDataProvider,
169
- capsuleDataProvider,
170
- syncDataProvider,
171
- taggingDataProvider,
172
- addressDataProvider,
173
- authWitnessDataProvider,
174
- simulator,
175
- packageVersion,
176
- proverEnabled,
177
- proofCreator,
178
- protocolContractsProvider,
179
- log,
180
- );
181
- await pxeService.#registerProtocolContracts();
182
- const info = await pxeService.getNodeInfo();
183
- log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.protocolVersion}`);
184
- return pxeService;
185
- }
186
-
187
- isL1ToL2MessageSynced(l1ToL2Message: Fr): Promise<boolean> {
188
- return this.node.isL1ToL2MessageSynced(l1ToL2Message);
189
- }
190
-
191
- /** Returns an estimate of the db size in bytes. */
192
- public async estimateDbSize() {
193
- const treeRootsSize = Object.keys(MerkleTreeId).length * Fr.SIZE_IN_BYTES;
194
- const dbSizes = await Promise.all([
195
- this.addressDataProvider.getSize(),
196
- this.authWitnessDataProvider.getSize(),
197
- this.capsuleDataProvider.getSize(),
198
- this.contractDataProvider.getSize(),
199
- this.noteDataProvider.getSize(),
200
- this.syncDataProvider.getSize(),
201
- this.taggingDataProvider.getSize(),
202
- ]);
203
- return [...dbSizes, treeRootsSize].reduce((sum, size) => sum + size, 0);
204
- }
205
-
206
- public addAuthWitness(witness: AuthWitness) {
207
- return this.authWitnessDataProvider.addAuthWitness(witness.requestHash, witness.witness);
208
- }
209
-
210
- public getAuthWitness(messageHash: Fr): Promise<Fr[] | undefined> {
211
- return this.authWitnessDataProvider.getAuthWitness(messageHash);
212
- }
213
-
214
- public storeCapsule(contract: AztecAddress, storageSlot: Fr, capsule: Fr[]) {
215
- return this.capsuleDataProvider.storeCapsule(contract, storageSlot, capsule);
216
- }
217
-
218
- public getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
219
- return this.contractDataProvider.getContractInstance(address);
220
- }
221
-
222
- public async getContractClassMetadata(
223
- id: Fr,
224
- includeArtifact: boolean = false,
225
- ): Promise<{
226
- contractClass: ContractClassWithId | undefined;
227
- isContractClassPubliclyRegistered: boolean;
228
- artifact: ContractArtifact | undefined;
229
- }> {
230
- let artifact;
231
- try {
232
- artifact = await this.contractDataProvider.getContractArtifact(id);
233
- } catch {
234
- this.log.warn(`No artifact found for contract class ${id.toString()} when looking for its metadata`);
235
- }
236
-
237
- return {
238
- contractClass: artifact && (await getContractClassFromArtifact(artifact)),
239
- isContractClassPubliclyRegistered: await this.#isContractClassPubliclyRegistered(id),
240
- artifact: includeArtifact ? artifact : undefined,
241
- };
242
- }
243
-
244
- public async getContractMetadata(address: AztecAddress): Promise<{
245
- contractInstance: ContractInstanceWithAddress | undefined;
246
- isContractInitialized: boolean;
247
- isContractPubliclyDeployed: boolean;
248
- }> {
249
- let instance;
250
- try {
251
- instance = await this.contractDataProvider.getContractInstance(address);
252
- } catch {
253
- this.log.warn(`No instance found for contract ${address.toString()} when looking for its metadata`);
254
- }
255
- return {
256
- contractInstance: instance,
257
- isContractInitialized: await this.#isContractInitialized(address),
258
- isContractPubliclyDeployed: await this.#isContractPubliclyDeployed(address),
259
- };
260
- }
261
-
262
- public async registerAccount(secretKey: Fr, partialAddress: PartialAddress): Promise<CompleteAddress> {
263
- const accounts = await this.keyStore.getAccounts();
264
- const accountCompleteAddress = await this.keyStore.addAccount(secretKey, partialAddress);
265
- if (accounts.includes(accountCompleteAddress.address)) {
266
- this.log.info(`Account:\n "${accountCompleteAddress.address.toString()}"\n already registered.`);
267
- return accountCompleteAddress;
268
- } else {
269
- this.log.info(`Registered account ${accountCompleteAddress.address.toString()}`);
270
- this.log.debug(`Registered account\n ${accountCompleteAddress.toReadableString()}`);
271
- }
272
-
273
- await this.addressDataProvider.addCompleteAddress(accountCompleteAddress);
274
- await this.noteDataProvider.addScope(accountCompleteAddress.address);
275
- return accountCompleteAddress;
276
- }
277
-
278
- public async registerSender(address: AztecAddress): Promise<AztecAddress> {
279
- const accounts = await this.keyStore.getAccounts();
280
- if (accounts.includes(address)) {
281
- this.log.info(`Sender:\n "${address.toString()}"\n already registered.`);
282
- return address;
283
- }
284
-
285
- const wasAdded = await this.taggingDataProvider.addSenderAddress(address);
286
-
287
- if (wasAdded) {
288
- this.log.info(`Added sender:\n ${address.toString()}`);
289
- } else {
290
- this.log.info(`Sender:\n "${address.toString()}"\n already registered.`);
291
- }
292
-
293
- return address;
294
- }
295
-
296
- public getSenders(): Promise<AztecAddress[]> {
297
- const senders = this.taggingDataProvider.getSenderAddresses();
298
-
299
- return Promise.resolve(senders);
300
- }
301
-
302
- public async removeSender(address: AztecAddress): Promise<void> {
303
- const wasRemoved = await this.taggingDataProvider.removeSenderAddress(address);
304
-
305
- if (wasRemoved) {
306
- this.log.info(`Removed sender:\n ${address.toString()}`);
307
- } else {
308
- this.log.info(`Sender:\n "${address.toString()}"\n not in address book.`);
309
- }
310
-
311
- return Promise.resolve();
312
- }
313
-
314
- public async getRegisteredAccounts(): Promise<CompleteAddress[]> {
315
- // Get complete addresses of both the recipients and the accounts
316
- const completeAddresses = await this.addressDataProvider.getCompleteAddresses();
317
- // Filter out the addresses not corresponding to accounts
318
- const accounts = await this.keyStore.getAccounts();
319
- return completeAddresses.filter(completeAddress =>
320
- accounts.find(address => address.equals(completeAddress.address)),
321
- );
322
- }
323
-
324
- public async registerContractClass(artifact: ContractArtifact): Promise<void> {
325
- const { id: contractClassId } = await getContractClassFromArtifact(artifact);
326
- await this.contractDataProvider.addContractArtifact(contractClassId, artifact);
327
- this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
328
- }
329
-
330
- public async registerContract(contract: { instance: ContractInstanceWithAddress; artifact?: ContractArtifact }) {
331
- const { instance } = contract;
332
- let { artifact } = contract;
333
-
334
- if (artifact) {
335
- // If the user provides an artifact, validate it against the expected class id and register it
336
- const contractClass = await getContractClassFromArtifact(artifact);
337
- const contractClassId = contractClass.id;
338
- if (!contractClassId.equals(instance.currentContractClassId)) {
339
- throw new Error(
340
- `Artifact does not match expected class id (computed ${contractClassId} but instance refers to ${instance.currentContractClassId})`,
341
- );
342
- }
343
- const computedAddress = await computeContractAddressFromInstance(instance);
344
- if (!computedAddress.equals(instance.address)) {
345
- throw new Error('Added a contract in which the address does not match the contract instance.');
346
- }
347
- await this.contractDataProvider.addContractArtifact(contractClass.id, artifact);
348
-
349
- const publicFunctionSignatures = artifact.functions
350
- .filter(fn => fn.functionType === FunctionType.PUBLIC)
351
- .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
352
- await this.node.registerContractFunctionSignatures(instance.address, publicFunctionSignatures);
353
-
354
- // TODO(#10007): Node should get public contract class from the registration event, not from PXE registration
355
- await this.node.addContractClass({ ...contractClass, privateFunctions: [], unconstrainedFunctions: [] });
356
- } else {
357
- // Otherwise, make sure there is an artifact already registered for that class id
358
- artifact = await this.contractDataProvider.getContractArtifact(instance.currentContractClassId);
359
- }
360
-
361
- await this.contractDataProvider.addContractInstance(instance);
362
- this.log.info(
363
- `Added contract ${artifact.name} at ${instance.address.toString()} with class ${instance.currentContractClassId}`,
364
- );
365
- }
366
-
367
- public async updateContract(contractAddress: AztecAddress, artifact: ContractArtifact): Promise<void> {
368
- const currentInstance = await this.contractDataProvider.getContractInstance(contractAddress);
369
- const contractClass = await getContractClassFromArtifact(artifact);
370
- await this.synchronizer.sync();
371
-
372
- const header = await this.syncDataProvider.getBlockHeader();
373
-
374
- const currentClassId = await readCurrentClassId(
375
- contractAddress,
376
- currentInstance,
377
- this.node,
378
- header.globalVariables.blockNumber.toNumber(),
379
- );
380
- if (!contractClass.id.equals(currentClassId)) {
381
- throw new Error('Could not update contract to a class different from the current one.');
382
- }
383
-
384
- await this.contractDataProvider.addContractArtifact(contractClass.id, artifact);
385
-
386
- const publicFunctionSignatures = artifact.functions
387
- .filter(fn => fn.functionType === FunctionType.PUBLIC)
388
- .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
389
- await this.node.registerContractFunctionSignatures(contractAddress, publicFunctionSignatures);
390
-
391
- // TODO(#10007): Node should get public contract class from the registration event, not from PXE registration
392
- await this.node.addContractClass({ ...contractClass, privateFunctions: [], unconstrainedFunctions: [] });
393
- currentInstance.currentContractClassId = contractClass.id;
394
- await this.contractDataProvider.addContractInstance(currentInstance);
395
- this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
396
- }
397
-
398
- public getContracts(): Promise<AztecAddress[]> {
399
- return this.contractDataProvider.getContractsAddresses();
400
- }
401
-
402
- public async getPublicStorageAt(contract: AztecAddress, slot: Fr) {
403
- return await this.node.getPublicStorageAt('latest', contract, slot);
404
- }
405
-
406
- public async getNotes(filter: NotesFilter): Promise<UniqueNote[]> {
407
- const noteDaos = await this.noteDataProvider.getNotes(filter);
408
-
409
- const extendedNotes = noteDaos.map(async dao => {
410
- let owner = filter.owner;
411
- if (owner === undefined) {
412
- const completeAddresses = await this.addressDataProvider.getCompleteAddresses();
413
- const completeAddressIndex = (
414
- await Promise.all(completeAddresses.map(completeAddresses => completeAddresses.address.toAddressPoint()))
415
- ).findIndex(addressPoint => addressPoint.equals(dao.addressPoint));
416
- const completeAddress = completeAddresses[completeAddressIndex];
417
- if (completeAddress === undefined) {
418
- throw new Error(`Cannot find complete address for addressPoint ${dao.addressPoint.toString()}`);
419
- }
420
- owner = completeAddress.address;
421
- }
422
- return new UniqueNote(
423
- dao.note,
424
- owner,
425
- dao.contractAddress,
426
- dao.storageSlot,
427
- dao.noteTypeId,
428
- dao.txHash,
429
- dao.nonce,
430
- );
431
- });
432
- return Promise.all(extendedNotes);
433
- }
434
-
435
- public async getL1ToL2MembershipWitness(
436
- contractAddress: AztecAddress,
437
- messageHash: Fr,
438
- secret: Fr,
439
- ): Promise<[bigint, SiblingPath<typeof L1_TO_L2_MSG_TREE_HEIGHT>]> {
440
- return await getNonNullifiedL1ToL2MessageWitness(this.node, contractAddress, messageHash, secret);
441
- }
442
-
443
- public getL2ToL1MembershipWitness(blockNumber: number, l2Tol1Message: Fr): Promise<[bigint, SiblingPath<number>]> {
444
- return this.node.getL2ToL1MessageMembershipWitness(blockNumber, l2Tol1Message);
445
- }
446
-
447
- public async getBlock(blockNumber: number): Promise<L2Block | undefined> {
448
- // If a negative block number is provided the current block number is fetched.
449
- if (blockNumber < 0) {
450
- blockNumber = await this.node.getBlockNumber();
451
- }
452
- return await this.node.getBlock(blockNumber);
453
- }
454
-
455
- public async getCurrentBaseFees(): Promise<GasFees> {
456
- return await this.node.getCurrentBaseFees();
457
- }
458
-
459
- public async proveTx(
460
- txRequest: TxExecutionRequest,
461
- privateExecutionResult: PrivateExecutionResult,
462
- ): Promise<TxProvingResult> {
463
- try {
464
- const { publicInputs, clientIvcProof } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
465
- simulate: false,
466
- skipFeeEnforcement: false,
467
- profile: false,
468
- });
469
- return new TxProvingResult(privateExecutionResult, publicInputs, clientIvcProof!);
470
- } catch (err: any) {
471
- throw this.contextualizeError(err, inspect(txRequest), inspect(privateExecutionResult));
472
- }
473
- }
474
-
475
- // TODO(#7456) Prevent msgSender being defined here for the first call
476
- public async simulateTx(
477
- txRequest: TxExecutionRequest,
478
- simulatePublic: boolean,
479
- msgSender: AztecAddress | undefined = undefined,
480
- skipTxValidation: boolean = false,
481
- skipFeeEnforcement: boolean = false,
482
- profile: boolean = false,
483
- scopes?: AztecAddress[],
484
- ): Promise<TxSimulationResult> {
485
- try {
486
- const txInfo = {
487
- origin: txRequest.origin,
488
- functionSelector: txRequest.functionSelector,
489
- simulatePublic,
490
- msgSender,
491
- chainId: txRequest.txContext.chainId,
492
- version: txRequest.txContext.version,
493
- authWitnesses: txRequest.authWitnesses.map(w => w.requestHash),
494
- };
495
- this.log.info(
496
- `Simulating transaction execution request to ${txRequest.functionSelector} at ${txRequest.origin}`,
497
- txInfo,
498
- );
499
- const timer = new Timer();
500
- await this.synchronizer.sync();
501
- const privateExecutionResult = await this.#executePrivate(txRequest, msgSender, scopes);
502
-
503
- const { publicInputs, profileResult } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
504
- simulate: !profile,
505
- skipFeeEnforcement,
506
- profile,
507
- });
508
-
509
- const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
510
- const simulatedTx = privateSimulationResult.toSimulatedTx();
511
- let publicOutput: PublicSimulationOutput | undefined;
512
- if (simulatePublic && publicInputs.forPublic) {
513
- publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
514
- }
515
-
516
- if (!skipTxValidation) {
517
- const validationResult = await this.node.isValidTx(simulatedTx, { isSimulation: true, skipFeeEnforcement });
518
- if (validationResult.result === 'invalid') {
519
- throw new Error('The simulated transaction is unable to be added to state and is invalid.');
520
- }
521
- }
522
-
523
- const txHash = await simulatedTx.getTxHash();
524
- this.log.info(`Simulation completed for ${txHash.toString()} in ${timer.ms()}ms`, {
525
- txHash,
526
- ...txInfo,
527
- ...(profileResult ? { gateCounts: profileResult.gateCounts } : {}),
528
- ...(publicOutput
529
- ? {
530
- gasUsed: publicOutput.gasUsed,
531
- revertCode: publicOutput.txEffect.revertCode.getCode(),
532
- revertReason: publicOutput.revertReason,
533
- }
534
- : {}),
535
- });
536
-
537
- return TxSimulationResult.fromPrivateSimulationResultAndPublicOutput(
538
- privateSimulationResult,
539
- publicOutput,
540
- profileResult,
541
- );
542
- } catch (err: any) {
543
- throw this.contextualizeError(
544
- err,
545
- inspect(txRequest),
546
- `simulatePublic=${simulatePublic}`,
547
- `msgSender=${msgSender?.toString() ?? 'undefined'}`,
548
- `skipTxValidation=${skipTxValidation}`,
549
- `profile=${profile}`,
550
- `scopes=${scopes?.map(s => s.toString()).join(', ') ?? 'undefined'}`,
551
- );
552
- }
553
- }
554
-
555
- public async sendTx(tx: Tx): Promise<TxHash> {
556
- const txHash = await tx.getTxHash();
557
- if (await this.node.getTxEffect(txHash)) {
558
- throw new Error(`A settled tx with equal hash ${txHash.toString()} exists.`);
559
- }
560
- this.log.debug(`Sending transaction ${txHash}`);
561
- await this.node.sendTx(tx).catch(err => {
562
- throw this.contextualizeError(err, inspect(tx));
563
- });
564
- this.log.info(`Sent transaction ${txHash}`);
565
- return txHash;
566
- }
567
-
568
- public async simulateUnconstrained(
569
- functionName: string,
570
- args: any[],
571
- to: AztecAddress,
572
- _from?: AztecAddress,
573
- scopes?: AztecAddress[],
574
- ): Promise<AbiDecoded> {
575
- try {
576
- await this.synchronizer.sync();
577
- // TODO - Should check if `from` has the permission to call the view function.
578
- const functionCall = await this.#getFunctionCall(functionName, args, to);
579
- const executionResult = await this.#simulateUnconstrained(functionCall, scopes);
580
-
581
- // TODO - Return typed result based on the function artifact.
582
- return executionResult;
583
- } catch (err: any) {
584
- const stringifiedArgs = args.map(arg => arg.toString()).join(', ');
585
- throw this.contextualizeError(
586
- err,
587
- `simulateUnconstrained ${to}:${functionName}(${stringifiedArgs})`,
588
- `scopes=${scopes?.map(s => s.toString()).join(', ') ?? 'undefined'}`,
589
- );
590
- }
591
- }
592
-
593
- public getTxReceipt(txHash: TxHash): Promise<TxReceipt> {
594
- return this.node.getTxReceipt(txHash);
595
- }
596
-
597
- public getTxEffect(txHash: TxHash): Promise<InBlock<TxEffect> | undefined> {
598
- return this.node.getTxEffect(txHash);
599
- }
600
-
601
- public async getBlockNumber(): Promise<number> {
602
- return await this.node.getBlockNumber();
603
- }
604
-
605
- public async getProvenBlockNumber(): Promise<number> {
606
- return await this.node.getProvenBlockNumber();
607
- }
608
-
609
- /**
610
- * Gets public logs based on the provided filter.
611
- * @param filter - The filter to apply to the logs.
612
- * @returns The requested logs.
613
- */
614
- public getPublicLogs(filter: LogFilter): Promise<GetPublicLogsResponse> {
615
- return this.node.getPublicLogs(filter);
616
- }
617
-
618
- /**
619
- * Gets contract class logs based on the provided filter.
620
- * @param filter - The filter to apply to the logs.
621
- * @returns The requested logs.
622
- */
623
- public getContractClassLogs(filter: LogFilter): Promise<GetContractClassLogsResponse> {
624
- return this.node.getContractClassLogs(filter);
625
- }
626
-
627
- async #getFunctionCall(functionName: string, args: any[], to: AztecAddress): Promise<FunctionCall> {
628
- const contract = await this.contractDataProvider.getContract(to);
629
- if (!contract) {
630
- throw new Error(
631
- `Unknown contract ${to}: add it to PXE Service by calling server.addContracts(...).\nSee docs for context: https://docs.aztec.network/developers/reference/debugging/aztecnr-errors#unknown-contract-0x0-add-it-to-pxe-by-calling-serveraddcontracts`,
632
- );
633
- }
634
-
635
- const functionDao = contract.functions.find(f => f.name === functionName);
636
- if (!functionDao) {
637
- throw new Error(`Unknown function ${functionName} in contract ${contract.name}.`);
638
- }
639
-
640
- return {
641
- name: functionDao.name,
642
- args: encodeArguments(functionDao, args),
643
- selector: await FunctionSelector.fromNameAndParameters(functionDao.name, functionDao.parameters),
644
- type: functionDao.functionType,
645
- to,
646
- isStatic: functionDao.isStatic,
647
- returnTypes: functionDao.returnTypes,
648
- };
649
- }
650
-
651
- public async getNodeInfo(): Promise<NodeInfo> {
652
- const [nodeVersion, protocolVersion, chainId, enr, contractAddresses, protocolContractAddresses] =
653
- await Promise.all([
654
- this.node.getNodeVersion(),
655
- this.node.getVersion(),
656
- this.node.getChainId(),
657
- this.node.getEncodedEnr(),
658
- this.node.getL1ContractAddresses(),
659
- this.node.getProtocolContractAddresses(),
660
- ]);
661
-
662
- const nodeInfo: NodeInfo = {
663
- nodeVersion,
664
- l1ChainId: chainId,
665
- protocolVersion,
666
- enr,
667
- l1ContractAddresses: contractAddresses,
668
- protocolContractAddresses: protocolContractAddresses,
669
- };
670
-
671
- return nodeInfo;
672
- }
673
-
674
- public getPXEInfo(): Promise<PXEInfo> {
675
- return Promise.resolve({
676
- pxeVersion: this.packageVersion,
677
- protocolContractAddresses: {
678
- classRegisterer: ProtocolContractAddress.ContractClassRegisterer,
679
- feeJuice: ProtocolContractAddress.FeeJuice,
680
- instanceDeployer: ProtocolContractAddress.ContractInstanceDeployer,
681
- multiCallEntrypoint: ProtocolContractAddress.MultiCallEntrypoint,
682
- },
683
- });
684
- }
685
-
686
- async #registerProtocolContracts() {
687
- const registered: Record<string, string> = {};
688
- for (const name of protocolContractNames) {
689
- const { address, contractClass, instance, artifact } =
690
- await this.protocolContractsProvider.getProtocolContractArtifact(name);
691
- await this.contractDataProvider.addContractArtifact(contractClass.id, artifact);
692
- await this.contractDataProvider.addContractInstance(instance);
693
- registered[name] = address.toString();
694
- }
695
- this.log.verbose(`Registered protocol contracts in pxe`, registered);
696
- }
697
-
698
- /**
699
- * Retrieves the simulation parameters required to run an ACIR simulation.
700
- * This includes the contract address, function artifact, and historical tree roots.
701
- *
702
- * @param execRequest - The transaction request object containing details of the contract call.
703
- * @returns An object containing the contract address, function artifact, and historical tree roots.
704
- */
705
- #getSimulationParameters(execRequest: FunctionCall | TxExecutionRequest) {
706
- const contractAddress = (execRequest as FunctionCall).to ?? (execRequest as TxExecutionRequest).origin;
707
- const functionSelector =
708
- (execRequest as FunctionCall).selector ?? (execRequest as TxExecutionRequest).functionSelector;
709
-
710
- return {
711
- contractAddress,
712
- functionSelector,
713
- };
714
- }
715
-
716
- async #executePrivate(
717
- txRequest: TxExecutionRequest,
718
- msgSender?: AztecAddress,
719
- scopes?: AztecAddress[],
720
- ): Promise<PrivateExecutionResult> {
721
- // TODO - Pause syncing while simulating.
722
- const { contractAddress, functionSelector } = this.#getSimulationParameters(txRequest);
723
-
724
- try {
725
- const result = await this.simulator.run(txRequest, contractAddress, functionSelector, msgSender, scopes);
726
- this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
727
- return result;
728
- } catch (err) {
729
- if (err instanceof SimulationError) {
730
- await enrichSimulationError(err, this.contractDataProvider, this.log);
731
- }
732
- throw err;
733
- }
734
- }
735
-
736
- /**
737
- * Simulate an unconstrained transaction on the given contract, without considering constraints set by ACIR.
738
- * The simulation parameters are fetched using ContractDataProvider and executed using AcirSimulator.
739
- * Returns the simulation result containing the outputs of the unconstrained function.
740
- *
741
- * @param execRequest - The transaction request object containing the target contract and function data.
742
- * @param scopes - The accounts whose notes we can access in this call. Currently optional and will default to all.
743
- * @returns The simulation result containing the outputs of the unconstrained function.
744
- */
745
- async #simulateUnconstrained(execRequest: FunctionCall, scopes?: AztecAddress[]) {
746
- const { contractAddress, functionSelector } = this.#getSimulationParameters(execRequest);
747
-
748
- this.log.debug('Executing unconstrained simulator...');
749
- try {
750
- const result = await this.simulator.runUnconstrained(execRequest, contractAddress, functionSelector, scopes);
751
- this.log.verbose(`Unconstrained simulation for ${contractAddress}.${functionSelector} completed`);
752
-
753
- return result;
754
- } catch (err) {
755
- if (err instanceof SimulationError) {
756
- await enrichSimulationError(err, this.contractDataProvider, this.log);
757
- }
758
- throw err;
759
- }
760
- }
761
-
762
- /**
763
- * Simulate the public part of a transaction.
764
- * This allows to catch public execution errors before submitting the transaction.
765
- * It can also be used for estimating gas in the future.
766
- * @param tx - The transaction to be simulated.
767
- */
768
- async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean) {
769
- // Simulating public calls can throw if the TX fails in a phase that doesn't allow reverts (setup)
770
- // Or return as reverted if it fails in a phase that allows reverts (app logic, teardown)
771
- try {
772
- const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement);
773
- if (result.revertReason) {
774
- throw result.revertReason;
775
- }
776
- return result;
777
- } catch (err) {
778
- if (err instanceof SimulationError) {
779
- try {
780
- await enrichPublicSimulationError(err, this.contractDataProvider, this.log);
781
- } catch (enrichErr) {
782
- this.log.error(`Failed to enrich public simulation error: ${enrichErr}`);
783
- }
784
- }
785
- throw err;
786
- }
787
- }
788
-
789
- /**
790
- * Generate a kernel proof, and create a private kernel output.
791
- * The function takes in a transaction execution request, and the result of private execution
792
- * and then generates a kernel proof.
793
- *
794
- * @param txExecutionRequest - The transaction request to be simulated and proved.
795
- * @param proofCreator - The proof creator to use for proving the execution.
796
- * @param privateExecutionResult - The result of the private execution
797
- * @returns An object that contains the output of the kernel execution, including the ClientIvcProof if proving is enabled.
798
- */
799
- async #prove(
800
- txExecutionRequest: TxExecutionRequest,
801
- proofCreator: PrivateKernelProver,
802
- privateExecutionResult: PrivateExecutionResult,
803
- { simulate, skipFeeEnforcement, profile }: ProvingConfig,
804
- ): Promise<PrivateKernelSimulateOutput<PrivateKernelTailCircuitPublicInputs>> {
805
- // use the block the tx was simulated against
806
- const block =
807
- privateExecutionResult.entrypoint.publicInputs.historicalHeader.globalVariables.blockNumber.toNumber();
808
- const kernelOracle = new KernelOracle(this.contractDataProvider, this.keyStore, this.node, block);
809
- const kernelProver = new KernelProver(kernelOracle, proofCreator, !this.proverEnabled);
810
- this.log.debug(`Executing kernel prover (simulate: ${simulate}, profile: ${profile})...`);
811
- return await kernelProver.prove(txExecutionRequest.toTxRequest(), privateExecutionResult, {
812
- simulate,
813
- skipFeeEnforcement,
814
- profile,
815
- });
816
- }
817
-
818
- async #isContractClassPubliclyRegistered(id: Fr): Promise<boolean> {
819
- return !!(await this.node.getContractClass(id));
820
- }
821
-
822
- async #isContractPubliclyDeployed(address: AztecAddress): Promise<boolean> {
823
- return !!(await this.node.getContract(address));
824
- }
825
-
826
- async #isContractInitialized(address: AztecAddress): Promise<boolean> {
827
- const initNullifier = await siloNullifier(address, address.toField());
828
- return !!(await this.node.getNullifierMembershipWitness('latest', initNullifier));
829
- }
830
-
831
- public async getPrivateEvents<T>(
832
- eventMetadataDef: EventMetadataDefinition,
833
- from: number,
834
- limit: number,
835
- // TODO (#9272): Make this better, we should be able to only pass an address now
836
- vpks: Point[],
837
- ): Promise<T[]> {
838
- const eventMetadata = new EventMetadata<T>(eventMetadataDef);
839
- if (vpks.length === 0) {
840
- throw new Error('Tried to get encrypted events without supplying any viewing public keys');
841
- }
842
-
843
- const blocks = await this.node.getBlocks(from, limit);
844
-
845
- const txEffects = blocks.flatMap(block => block.body.txEffects);
846
- const privateLogs = txEffects.flatMap(txEffect => txEffect.privateLogs);
847
-
848
- const vsks = await Promise.all(
849
- vpks.map(async vpk => {
850
- const [keyPrefix, account] = await this.keyStore.getKeyPrefixAndAccount(vpk);
851
- let secretKey = await this.keyStore.getMasterSecretKey(vpk);
852
- if (keyPrefix === 'iv') {
853
- const registeredAccount = (await this.getRegisteredAccounts()).find(completeAddress =>
854
- completeAddress.address.equals(account),
855
- );
856
- if (!registeredAccount) {
857
- throw new Error('No registered account');
858
- }
859
-
860
- const preaddress = await registeredAccount.getPreaddress();
861
-
862
- secretKey = await computeAddressSecret(preaddress, secretKey);
863
- }
864
-
865
- return secretKey;
866
- }),
867
- );
868
-
869
- const visibleEvents = (
870
- await Promise.all(
871
- privateLogs.map(async log => {
872
- for (const sk of vsks) {
873
- // TODO: Verify that the first field of the log is the tag siloed with contract address.
874
- // Or use tags to query logs, like we do with notes.
875
- const decryptedEvent = await L1EventPayload.decryptAsIncoming(log, sk);
876
- if (decryptedEvent !== undefined) {
877
- return [decryptedEvent];
878
- }
879
- }
880
-
881
- return [];
882
- }),
883
- )
884
- ).flat();
885
-
886
- const decodedEvents = visibleEvents
887
- .map(visibleEvent => {
888
- if (visibleEvent === undefined) {
889
- return undefined;
890
- }
891
- if (!visibleEvent.eventTypeId.equals(eventMetadata.eventSelector)) {
892
- return undefined;
893
- }
894
-
895
- return eventMetadata.decode(visibleEvent);
896
- })
897
- .filter(visibleEvent => visibleEvent !== undefined) as T[];
898
-
899
- return decodedEvents;
900
- }
901
-
902
- async getPublicEvents<T>(eventMetadataDef: EventMetadataDefinition, from: number, limit: number): Promise<T[]> {
903
- const eventMetadata = new EventMetadata<T>(eventMetadataDef);
904
- const { logs } = await this.node.getPublicLogs({
905
- fromBlock: from,
906
- toBlock: from + limit,
907
- });
908
-
909
- const decodedEvents = logs
910
- .map(log => {
911
- // +1 for the event selector
912
- const expectedLength = eventMetadata.fieldNames.length + 1;
913
- const logFields = log.log.log.slice(0, expectedLength);
914
- // We are assuming here that event logs are the last 4 bytes of the event. This is not enshrined but is a function of aztec.nr raw log emission.
915
- if (!EventSelector.fromField(logFields[logFields.length - 1]).equals(eventMetadata.eventSelector)) {
916
- return undefined;
917
- }
918
- // If any of the remaining fields, are non-zero, the payload does match expected:
919
- if (log.log.log.slice(expectedLength + 1).find(f => !f.isZero())) {
920
- throw new Error(
921
- 'Something is weird here, we have matching EventSelectors, but the actual payload has mismatched length',
922
- );
923
- }
924
-
925
- return eventMetadata.decode(log.log);
926
- })
927
- .filter(log => log !== undefined) as T[];
928
-
929
- return decodedEvents;
930
- }
931
-
932
- async resetNoteSyncData() {
933
- return await this.taggingDataProvider.resetNoteSyncData();
934
- }
935
-
936
- private contextualizeError(err: Error, ...context: string[]): Error {
937
- let contextStr = '';
938
- if (context.length > 0) {
939
- contextStr = `\nContext:\n${context.join('\n')}`;
940
- }
941
- if (err instanceof SimulationError) {
942
- err.setAztecContext(contextStr);
943
- } else {
944
- this.log.error(err.name, err);
945
- this.log.debug(contextStr);
946
- }
947
- return err;
948
- }
949
- }