@aztec/foundation 0.76.4 → 0.77.0-testnet-ignition.21

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 (459) hide show
  1. package/dest/array/array.d.ts +1 -1
  2. package/dest/array/array.d.ts.map +1 -1
  3. package/dest/array/array.js +19 -26
  4. package/dest/array/index.js +0 -1
  5. package/dest/async-map/index.js +2 -4
  6. package/dest/async-pool/index.js +6 -9
  7. package/dest/bigint-buffer/index.js +6 -13
  8. package/dest/buffer/buffer32.d.ts +1 -1
  9. package/dest/buffer/buffer32.d.ts.map +1 -1
  10. package/dest/buffer/buffer32.js +53 -66
  11. package/dest/buffer/index.js +0 -1
  12. package/dest/collection/array.d.ts +1 -1
  13. package/dest/collection/array.d.ts.map +1 -1
  14. package/dest/collection/array.js +47 -59
  15. package/dest/collection/index.js +0 -1
  16. package/dest/collection/object.js +9 -9
  17. package/dest/committable/committable.js +15 -20
  18. package/dest/committable/index.js +0 -1
  19. package/dest/config/env_var.d.ts +1 -1
  20. package/dest/config/env_var.d.ts.map +1 -1
  21. package/dest/config/env_var.js +1 -2
  22. package/dest/config/index.d.ts +1 -1
  23. package/dest/config/index.d.ts.map +1 -1
  24. package/dest/config/index.js +31 -36
  25. package/dest/crypto/aes128/index.d.ts +34 -0
  26. package/dest/crypto/aes128/index.d.ts.map +1 -0
  27. package/dest/crypto/aes128/index.js +49 -0
  28. package/dest/crypto/ecdsa/index.d.ts +39 -0
  29. package/dest/crypto/ecdsa/index.d.ts.map +1 -0
  30. package/dest/crypto/ecdsa/index.js +88 -0
  31. package/dest/crypto/ecdsa/signature.d.ts +71 -0
  32. package/dest/crypto/ecdsa/signature.d.ts.map +1 -0
  33. package/dest/crypto/ecdsa/signature.js +92 -0
  34. package/dest/crypto/grumpkin/index.d.ts +47 -0
  35. package/dest/crypto/grumpkin/index.d.ts.map +1 -0
  36. package/dest/crypto/grumpkin/index.js +154 -0
  37. package/dest/crypto/index.d.ts +6 -0
  38. package/dest/crypto/index.d.ts.map +1 -1
  39. package/dest/crypto/index.js +6 -1
  40. package/dest/crypto/keccak/index.js +60 -69
  41. package/dest/crypto/keys/index.js +2 -3
  42. package/dest/crypto/pedersen/index.js +0 -1
  43. package/dest/crypto/pedersen/pedersen.elliptic.js +153 -146
  44. package/dest/crypto/pedersen/pedersen.noble.js +140 -142
  45. package/dest/crypto/pedersen/pedersen.wasm.js +17 -16
  46. package/dest/crypto/poseidon/index.js +15 -19
  47. package/dest/crypto/random/index.js +7 -12
  48. package/dest/crypto/random/randomness_singleton.js +12 -12
  49. package/dest/crypto/schnorr/index.d.ts +30 -0
  50. package/dest/crypto/schnorr/index.d.ts.map +1 -0
  51. package/dest/crypto/schnorr/index.js +68 -0
  52. package/dest/crypto/schnorr/signature.d.ts +70 -0
  53. package/dest/crypto/schnorr/signature.d.ts.map +1 -0
  54. package/dest/crypto/schnorr/signature.js +93 -0
  55. package/dest/crypto/secp256k1/index.d.ts +32 -0
  56. package/dest/crypto/secp256k1/index.d.ts.map +1 -0
  57. package/dest/crypto/secp256k1/index.js +116 -0
  58. package/dest/crypto/secp256k1-signer/index.js +0 -1
  59. package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts +2 -2
  60. package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts.map +1 -1
  61. package/dest/crypto/secp256k1-signer/secp256k1_signer.js +8 -9
  62. package/dest/crypto/secp256k1-signer/utils.js +11 -16
  63. package/dest/crypto/serialize.d.ts +53 -0
  64. package/dest/crypto/serialize.d.ts.map +1 -0
  65. package/dest/crypto/serialize.js +68 -0
  66. package/dest/crypto/sha256/index.js +80 -30
  67. package/dest/crypto/sha512/index.js +2 -4
  68. package/dest/crypto/signature/index.d.ts +19 -0
  69. package/dest/crypto/signature/index.d.ts.map +1 -0
  70. package/dest/crypto/signature/index.js +3 -0
  71. package/dest/crypto/sync/index.js +1 -2
  72. package/dest/crypto/sync/pedersen/index.js +14 -13
  73. package/dest/crypto/sync/poseidon/index.js +10 -14
  74. package/dest/decorators/index.js +0 -1
  75. package/dest/decorators/memoize.js +1 -2
  76. package/dest/error/index.js +6 -19
  77. package/dest/eth-address/index.js +92 -113
  78. package/dest/eth-signature/eth_signature.js +21 -27
  79. package/dest/eth-signature/index.js +0 -1
  80. package/dest/fields/coordinate.d.ts +1 -1
  81. package/dest/fields/coordinate.d.ts.map +1 -1
  82. package/dest/fields/coordinate.js +47 -46
  83. package/dest/fields/fields.d.ts.map +1 -1
  84. package/dest/fields/fields.js +112 -126
  85. package/dest/fields/index.js +0 -1
  86. package/dest/fields/point.js +119 -129
  87. package/dest/fs/index.js +0 -1
  88. package/dest/fs/run_in_dir.d.ts +1 -1
  89. package/dest/fs/run_in_dir.d.ts.map +1 -1
  90. package/dest/fs/run_in_dir.js +16 -7
  91. package/dest/index.d.ts +0 -2
  92. package/dest/index.d.ts.map +1 -1
  93. package/dest/index.js +0 -3
  94. package/dest/iterable/all.js +3 -4
  95. package/dest/iterable/filter.js +10 -11
  96. package/dest/iterable/index.js +0 -1
  97. package/dest/iterable/isAsyncIt.js +1 -3
  98. package/dest/iterable/map.js +10 -11
  99. package/dest/iterable/peek.js +14 -14
  100. package/dest/iterable/sort.js +4 -5
  101. package/dest/iterable/take.js +6 -7
  102. package/dest/iterable/toArray.js +1 -2
  103. package/dest/jest/setup.js +7 -0
  104. package/dest/json-rpc/client/fetch.js +25 -20
  105. package/dest/json-rpc/client/index.js +0 -1
  106. package/dest/json-rpc/client/safe_json_rpc_client.js +20 -9
  107. package/dest/json-rpc/client/undici.d.ts +1 -1
  108. package/dest/json-rpc/client/undici.d.ts.map +1 -1
  109. package/dest/json-rpc/client/undici.js +16 -17
  110. package/dest/json-rpc/convert.d.ts +1 -1
  111. package/dest/json-rpc/convert.d.ts.map +1 -1
  112. package/dest/json-rpc/convert.js +10 -20
  113. package/dest/json-rpc/fixtures/class_a.js +8 -5
  114. package/dest/json-rpc/fixtures/class_b.js +8 -5
  115. package/dest/json-rpc/fixtures/test_state.js +53 -40
  116. package/dest/json-rpc/index.js +0 -1
  117. package/dest/json-rpc/js_utils.js +2 -5
  118. package/dest/json-rpc/server/index.js +0 -1
  119. package/dest/json-rpc/server/safe_json_rpc_server.js +145 -101
  120. package/dest/json-rpc/server/telemetry.js +0 -2
  121. package/dest/json-rpc/test/index.js +0 -1
  122. package/dest/json-rpc/test/integration.d.ts +1 -1
  123. package/dest/json-rpc/test/integration.d.ts.map +1 -1
  124. package/dest/json-rpc/test/integration.js +11 -5
  125. package/dest/log/console.d.ts +1 -1
  126. package/dest/log/console.d.ts.map +1 -1
  127. package/dest/log/console.js +14 -16
  128. package/dest/log/debug.d.ts +1 -1
  129. package/dest/log/debug.d.ts.map +1 -1
  130. package/dest/log/debug.js +9 -18
  131. package/dest/log/gcloud-logger-config.js +17 -15
  132. package/dest/log/index.d.ts +1 -0
  133. package/dest/log/index.d.ts.map +1 -1
  134. package/dest/log/index.js +1 -1
  135. package/dest/log/libp2p_logger.d.ts +7 -0
  136. package/dest/log/libp2p_logger.d.ts.map +1 -0
  137. package/dest/log/libp2p_logger.js +55 -0
  138. package/dest/log/log-filters.js +14 -13
  139. package/dest/log/log-levels.js +10 -2
  140. package/dest/log/log_fn.js +1 -2
  141. package/dest/log/log_history.js +21 -25
  142. package/dest/log/pino-logger.d.ts +8 -4
  143. package/dest/log/pino-logger.d.ts.map +1 -1
  144. package/dest/log/pino-logger.js +92 -74
  145. package/dest/message/index.js +7 -3
  146. package/dest/mutex/index.d.ts +1 -1
  147. package/dest/mutex/index.d.ts.map +1 -1
  148. package/dest/mutex/index.js +34 -32
  149. package/dest/mutex/mutex_database.js +4 -2
  150. package/dest/noir/index.js +0 -1
  151. package/dest/noir/noir_package_config.js +13 -8
  152. package/dest/promise/index.js +0 -1
  153. package/dest/promise/running-promise.d.ts +8 -2
  154. package/dest/promise/running-promise.d.ts.map +1 -1
  155. package/dest/promise/running-promise.js +44 -31
  156. package/dest/promise/utils.js +3 -5
  157. package/dest/queue/base_memory_queue.js +51 -59
  158. package/dest/queue/batch_queue.js +34 -27
  159. package/dest/queue/bounded_serial_queue.js +41 -51
  160. package/dest/queue/fifo_memory_queue.d.ts +1 -1
  161. package/dest/queue/fifo_memory_queue.d.ts.map +1 -1
  162. package/dest/queue/fifo_memory_queue.js +4 -8
  163. package/dest/queue/index.js +0 -1
  164. package/dest/queue/priority_memory_queue.js +3 -4
  165. package/dest/queue/priority_queue.js +5 -5
  166. package/dest/queue/semaphore.js +15 -19
  167. package/dest/queue/serial_queue.js +37 -47
  168. package/dest/retry/index.js +21 -18
  169. package/dest/running-promise/index.js +0 -1
  170. package/dest/schemas/api.d.ts +2 -2
  171. package/dest/schemas/api.d.ts.map +1 -1
  172. package/dest/schemas/api.js +2 -7
  173. package/dest/schemas/index.d.ts +1 -1
  174. package/dest/schemas/index.d.ts.map +1 -1
  175. package/dest/schemas/index.js +1 -2
  176. package/dest/schemas/parse.js +4 -8
  177. package/dest/schemas/schemas.d.ts +1 -16
  178. package/dest/schemas/schemas.d.ts.map +1 -1
  179. package/dest/schemas/schemas.js +28 -56
  180. package/dest/schemas/types.d.ts +1 -1
  181. package/dest/schemas/types.d.ts.map +1 -1
  182. package/dest/schemas/types.js +1 -2
  183. package/dest/schemas/utils.d.ts +1 -1
  184. package/dest/schemas/utils.d.ts.map +1 -1
  185. package/dest/schemas/utils.js +18 -31
  186. package/dest/serialize/buffer_reader.d.ts +1 -1
  187. package/dest/serialize/buffer_reader.d.ts.map +1 -1
  188. package/dest/serialize/buffer_reader.js +164 -188
  189. package/dest/serialize/field_reader.d.ts +1 -1
  190. package/dest/serialize/field_reader.d.ts.map +1 -1
  191. package/dest/serialize/field_reader.js +70 -79
  192. package/dest/serialize/free_funcs.d.ts +1 -1
  193. package/dest/serialize/free_funcs.d.ts.map +1 -1
  194. package/dest/serialize/free_funcs.js +40 -37
  195. package/dest/serialize/index.js +0 -1
  196. package/dest/serialize/serialize.js +72 -83
  197. package/dest/serialize/type_registry.js +10 -14
  198. package/dest/serialize/types.js +4 -5
  199. package/dest/sleep/index.js +25 -29
  200. package/dest/string/index.js +0 -1
  201. package/dest/testing/files/index.js +3 -7
  202. package/dest/testing/index.js +0 -1
  203. package/dest/testing/port_allocator.js +7 -10
  204. package/dest/testing/snapshot_serializer.d.ts +1 -1
  205. package/dest/testing/snapshot_serializer.d.ts.map +1 -1
  206. package/dest/testing/snapshot_serializer.js +14 -9
  207. package/dest/testing/test_data.js +7 -8
  208. package/dest/timer/date.js +9 -7
  209. package/dest/timer/elapsed.js +10 -7
  210. package/dest/timer/index.js +0 -1
  211. package/dest/timer/timeout.js +34 -34
  212. package/dest/timer/timer.js +17 -21
  213. package/dest/transport/browser/index.js +0 -1
  214. package/dest/transport/browser/message_port_socket.d.ts +1 -1
  215. package/dest/transport/browser/message_port_socket.d.ts.map +1 -1
  216. package/dest/transport/browser/message_port_socket.js +26 -30
  217. package/dest/transport/browser/shared_worker_connector.d.ts +1 -1
  218. package/dest/transport/browser/shared_worker_connector.d.ts.map +1 -1
  219. package/dest/transport/browser/shared_worker_connector.js +8 -10
  220. package/dest/transport/browser/shared_worker_listener.d.ts +1 -1
  221. package/dest/transport/browser/shared_worker_listener.d.ts.map +1 -1
  222. package/dest/transport/browser/shared_worker_listener.js +13 -17
  223. package/dest/transport/browser/worker_connector.d.ts +1 -1
  224. package/dest/transport/browser/worker_connector.d.ts.map +1 -1
  225. package/dest/transport/browser/worker_connector.js +12 -12
  226. package/dest/transport/browser/worker_listener.d.ts +1 -1
  227. package/dest/transport/browser/worker_listener.d.ts.map +1 -1
  228. package/dest/transport/browser/worker_listener.js +13 -17
  229. package/dest/transport/dispatch/create_dispatch_fn.js +2 -4
  230. package/dest/transport/dispatch/create_dispatch_proxy.d.ts +2 -2
  231. package/dest/transport/dispatch/create_dispatch_proxy.d.ts.map +1 -1
  232. package/dest/transport/dispatch/create_dispatch_proxy.js +16 -13
  233. package/dest/transport/dispatch/messages.js +4 -3
  234. package/dest/transport/index.js +0 -1
  235. package/dest/transport/interface/connector.d.ts +1 -1
  236. package/dest/transport/interface/connector.d.ts.map +1 -1
  237. package/dest/transport/interface/connector.js +3 -2
  238. package/dest/transport/interface/listener.d.ts +1 -1
  239. package/dest/transport/interface/listener.d.ts.map +1 -1
  240. package/dest/transport/interface/listener.js +4 -2
  241. package/dest/transport/interface/socket.js +7 -2
  242. package/dest/transport/interface/transferable.js +7 -9
  243. package/dest/transport/node/index.js +0 -1
  244. package/dest/transport/node/node_connector.d.ts +2 -2
  245. package/dest/transport/node/node_connector.d.ts.map +1 -1
  246. package/dest/transport/node/node_connector.js +9 -11
  247. package/dest/transport/node/node_connector_socket.d.ts +2 -2
  248. package/dest/transport/node/node_connector_socket.d.ts.map +1 -1
  249. package/dest/transport/node/node_connector_socket.js +21 -25
  250. package/dest/transport/node/node_listener.d.ts +1 -1
  251. package/dest/transport/node/node_listener.d.ts.map +1 -1
  252. package/dest/transport/node/node_listener.js +11 -15
  253. package/dest/transport/node/node_listener_socket.d.ts +2 -2
  254. package/dest/transport/node/node_listener_socket.d.ts.map +1 -1
  255. package/dest/transport/node/node_listener_socket.js +23 -27
  256. package/dest/transport/transport_client.d.ts +1 -1
  257. package/dest/transport/transport_client.d.ts.map +1 -1
  258. package/dest/transport/transport_client.js +47 -46
  259. package/dest/transport/transport_server.d.ts +1 -1
  260. package/dest/transport/transport_server.d.ts.map +1 -1
  261. package/dest/transport/transport_server.js +68 -55
  262. package/dest/trees/hasher.d.ts +39 -0
  263. package/dest/trees/hasher.d.ts.map +1 -0
  264. package/dest/trees/hasher.js +5 -0
  265. package/dest/trees/index.d.ts +8 -56
  266. package/dest/trees/index.d.ts.map +1 -1
  267. package/dest/trees/index.js +8 -1
  268. package/dest/trees/indexed_merkle_tree.d.ts +13 -0
  269. package/dest/trees/indexed_merkle_tree.d.ts.map +1 -0
  270. package/dest/trees/indexed_merkle_tree.js +27 -0
  271. package/dest/trees/indexed_merkle_tree_calculator.d.ts +23 -0
  272. package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -0
  273. package/dest/trees/indexed_merkle_tree_calculator.js +83 -0
  274. package/dest/trees/indexed_tree_leaf.d.ts +57 -0
  275. package/dest/trees/indexed_tree_leaf.d.ts.map +1 -0
  276. package/dest/trees/indexed_tree_leaf.js +5 -0
  277. package/dest/trees/membership_witness.d.ts +62 -0
  278. package/dest/trees/membership_witness.d.ts.map +1 -0
  279. package/dest/trees/membership_witness.js +70 -0
  280. package/dest/trees/merkle_tree.d.ts +18 -0
  281. package/dest/trees/merkle_tree.d.ts.map +1 -0
  282. package/dest/trees/merkle_tree.js +58 -0
  283. package/dest/trees/merkle_tree_calculator.d.ts +16 -0
  284. package/dest/trees/merkle_tree_calculator.d.ts.map +1 -0
  285. package/dest/trees/merkle_tree_calculator.js +61 -0
  286. package/dest/trees/sibling_path.d.ts +132 -0
  287. package/dest/trees/sibling_path.d.ts.map +1 -0
  288. package/dest/trees/sibling_path.js +144 -0
  289. package/dest/trees/unbalanced_merkle_tree.d.ts +1 -1
  290. package/dest/trees/unbalanced_merkle_tree.d.ts.map +1 -1
  291. package/dest/trees/unbalanced_merkle_tree.js +28 -18
  292. package/dest/trees/unbalanced_tree_store.js +43 -29
  293. package/dest/types/index.js +1 -3
  294. package/dest/url/index.js +4 -8
  295. package/dest/validation/index.js +2 -5
  296. package/dest/wasm/empty_wasi_sdk.js +142 -160
  297. package/dest/wasm/index.d.ts +1 -1
  298. package/dest/wasm/index.d.ts.map +1 -1
  299. package/dest/wasm/index.js +0 -1
  300. package/dest/wasm/wasm_module.js +80 -90
  301. package/dest/worker/browser/index.js +0 -1
  302. package/dest/worker/browser/start_web_module.d.ts +1 -1
  303. package/dest/worker/browser/start_web_module.d.ts.map +1 -1
  304. package/dest/worker/browser/start_web_module.js +9 -5
  305. package/dest/worker/browser/web_data_store.d.ts +1 -1
  306. package/dest/worker/browser/web_data_store.d.ts.map +1 -1
  307. package/dest/worker/browser/web_data_store.js +12 -15
  308. package/dest/worker/browser/web_worker.d.ts +1 -1
  309. package/dest/worker/browser/web_worker.d.ts.map +1 -1
  310. package/dest/worker/browser/web_worker.js +6 -5
  311. package/dest/worker/data_store.js +3 -2
  312. package/dest/worker/index.d.ts +1 -1
  313. package/dest/worker/index.d.ts.map +1 -1
  314. package/dest/worker/index.js +0 -1
  315. package/dest/worker/node/index.js +0 -1
  316. package/dest/worker/node/node_data_store.d.ts +1 -1
  317. package/dest/worker/node/node_data_store.d.ts.map +1 -1
  318. package/dest/worker/node/node_data_store.js +4 -5
  319. package/dest/worker/node/node_worker.d.ts +1 -1
  320. package/dest/worker/node/node_worker.d.ts.map +1 -1
  321. package/dest/worker/node/node_worker.js +6 -5
  322. package/dest/worker/node/start_node_module.d.ts +1 -1
  323. package/dest/worker/node/start_node_module.d.ts.map +1 -1
  324. package/dest/worker/node/start_node_module.js +9 -5
  325. package/dest/worker/wasm_worker.d.ts +2 -2
  326. package/dest/worker/wasm_worker.d.ts.map +1 -1
  327. package/dest/worker/wasm_worker.js +3 -2
  328. package/dest/worker/worker_pool.d.ts +1 -1
  329. package/dest/worker/worker_pool.d.ts.map +1 -1
  330. package/dest/worker/worker_pool.js +32 -43
  331. package/package.json +5 -5
  332. package/src/array/array.ts +1 -1
  333. package/src/buffer/buffer32.ts +1 -1
  334. package/src/collection/array.ts +1 -1
  335. package/src/config/env_var.ts +7 -5
  336. package/src/config/index.ts +1 -1
  337. package/src/crypto/aes128/index.ts +59 -0
  338. package/src/crypto/ecdsa/index.ts +70 -0
  339. package/src/crypto/ecdsa/signature.ts +100 -0
  340. package/src/crypto/grumpkin/index.ts +97 -0
  341. package/src/crypto/index.ts +6 -0
  342. package/src/crypto/keys/index.ts +1 -1
  343. package/src/crypto/pedersen/pedersen.wasm.ts +3 -3
  344. package/src/crypto/poseidon/index.ts +5 -5
  345. package/src/crypto/schnorr/index.ts +55 -0
  346. package/src/crypto/schnorr/signature.ts +116 -0
  347. package/src/crypto/secp256k1/index.ts +57 -0
  348. package/src/crypto/secp256k1-signer/secp256k1_signer.ts +2 -2
  349. package/src/crypto/serialize.ts +85 -0
  350. package/src/crypto/signature/index.ts +17 -0
  351. package/src/crypto/sync/index.ts +1 -1
  352. package/src/fields/coordinate.ts +1 -1
  353. package/src/fields/fields.ts +2 -1
  354. package/src/fs/run_in_dir.ts +8 -1
  355. package/src/index.ts +0 -2
  356. package/src/json-rpc/client/undici.ts +1 -1
  357. package/src/json-rpc/convert.ts +1 -1
  358. package/src/json-rpc/server/safe_json_rpc_server.ts +1 -1
  359. package/src/json-rpc/test/integration.ts +1 -1
  360. package/src/log/console.ts +1 -1
  361. package/src/log/debug.ts +1 -1
  362. package/src/log/gcloud-logger-config.ts +1 -1
  363. package/src/log/index.ts +1 -0
  364. package/src/log/libp2p_logger.ts +67 -0
  365. package/src/log/pino-logger.ts +16 -16
  366. package/src/mutex/index.ts +1 -1
  367. package/src/promise/running-promise.ts +24 -5
  368. package/src/queue/fifo_memory_queue.ts +1 -1
  369. package/src/schemas/api.ts +2 -2
  370. package/src/schemas/index.ts +1 -1
  371. package/src/schemas/schemas.ts +2 -26
  372. package/src/schemas/types.ts +1 -1
  373. package/src/schemas/utils.ts +1 -1
  374. package/src/serialize/buffer_reader.ts +1 -1
  375. package/src/serialize/field_reader.ts +1 -1
  376. package/src/serialize/free_funcs.ts +1 -1
  377. package/src/testing/snapshot_serializer.ts +1 -1
  378. package/src/transport/browser/message_port_socket.ts +1 -1
  379. package/src/transport/browser/shared_worker_connector.ts +1 -1
  380. package/src/transport/browser/shared_worker_listener.ts +1 -1
  381. package/src/transport/browser/worker_connector.ts +1 -1
  382. package/src/transport/browser/worker_listener.ts +1 -1
  383. package/src/transport/dispatch/create_dispatch_proxy.ts +2 -2
  384. package/src/transport/interface/connector.ts +1 -1
  385. package/src/transport/interface/listener.ts +1 -1
  386. package/src/transport/node/node_connector.ts +2 -2
  387. package/src/transport/node/node_connector_socket.ts +2 -2
  388. package/src/transport/node/node_listener.ts +1 -1
  389. package/src/transport/node/node_listener_socket.ts +2 -2
  390. package/src/transport/transport_client.ts +2 -2
  391. package/src/transport/transport_server.ts +3 -3
  392. package/src/trees/hasher.ts +39 -0
  393. package/src/trees/index.ts +8 -57
  394. package/src/trees/indexed_merkle_tree.ts +36 -0
  395. package/src/trees/indexed_merkle_tree_calculator.ts +94 -0
  396. package/src/trees/indexed_tree_leaf.ts +56 -0
  397. package/src/trees/membership_witness.ts +99 -0
  398. package/src/trees/merkle_tree.ts +72 -0
  399. package/src/trees/merkle_tree_calculator.ts +67 -0
  400. package/src/trees/sibling_path.ts +183 -0
  401. package/src/trees/unbalanced_merkle_tree.ts +2 -2
  402. package/src/wasm/index.ts +1 -1
  403. package/src/worker/browser/start_web_module.ts +1 -1
  404. package/src/worker/browser/web_data_store.ts +1 -1
  405. package/src/worker/browser/web_worker.ts +1 -1
  406. package/src/worker/index.ts +1 -1
  407. package/src/worker/node/node_data_store.ts +1 -1
  408. package/src/worker/node/node_worker.ts +1 -1
  409. package/src/worker/node/start_node_module.ts +1 -1
  410. package/src/worker/wasm_worker.ts +2 -2
  411. package/src/worker/worker_pool.ts +1 -1
  412. package/dest/abi/abi.d.ts +0 -853
  413. package/dest/abi/abi.d.ts.map +0 -1
  414. package/dest/abi/abi.js +0 -214
  415. package/dest/abi/buffer.d.ts +0 -18
  416. package/dest/abi/buffer.d.ts.map +0 -1
  417. package/dest/abi/buffer.js +0 -34
  418. package/dest/abi/decoder.d.ts +0 -58
  419. package/dest/abi/decoder.d.ts.map +0 -1
  420. package/dest/abi/decoder.js +0 -180
  421. package/dest/abi/encoder.d.ts +0 -16
  422. package/dest/abi/encoder.d.ts.map +0 -1
  423. package/dest/abi/encoder.js +0 -174
  424. package/dest/abi/event_selector.d.ts +0 -52
  425. package/dest/abi/event_selector.d.ts.map +0 -1
  426. package/dest/abi/event_selector.js +0 -76
  427. package/dest/abi/function_selector.d.ts +0 -65
  428. package/dest/abi/function_selector.d.ts.map +0 -1
  429. package/dest/abi/function_selector.js +0 -92
  430. package/dest/abi/index.d.ts +0 -10
  431. package/dest/abi/index.d.ts.map +0 -1
  432. package/dest/abi/index.js +0 -10
  433. package/dest/abi/note_selector.d.ts +0 -42
  434. package/dest/abi/note_selector.d.ts.map +0 -1
  435. package/dest/abi/note_selector.js +0 -63
  436. package/dest/abi/selector.d.ts +0 -42
  437. package/dest/abi/selector.d.ts.map +0 -1
  438. package/dest/abi/selector.js +0 -57
  439. package/dest/abi/u128.d.ts +0 -13
  440. package/dest/abi/u128.d.ts.map +0 -1
  441. package/dest/abi/u128.js +0 -58
  442. package/dest/abi/utils.d.ts +0 -44
  443. package/dest/abi/utils.d.ts.map +0 -1
  444. package/dest/abi/utils.js +0 -72
  445. package/dest/aztec-address/index.d.ts +0 -57
  446. package/dest/aztec-address/index.d.ts.map +0 -1
  447. package/dest/aztec-address/index.js +0 -114
  448. package/src/abi/abi.ts +0 -504
  449. package/src/abi/buffer.ts +0 -36
  450. package/src/abi/decoder.ts +0 -195
  451. package/src/abi/encoder.ts +0 -170
  452. package/src/abi/event_selector.ts +0 -92
  453. package/src/abi/function_selector.ts +0 -124
  454. package/src/abi/index.ts +0 -9
  455. package/src/abi/note_selector.ts +0 -78
  456. package/src/abi/selector.ts +0 -64
  457. package/src/abi/u128.ts +0 -71
  458. package/src/abi/utils.ts +0 -86
  459. package/src/aztec-address/index.ts +0 -146
@@ -0,0 +1,70 @@
1
+ import { assertMemberLength } from '../array/array.js';
2
+ import { toBigIntBE, toBufferBE } from '../bigint-buffer/index.js';
3
+ import { Fr } from '../fields/fields.js';
4
+ import { BufferReader, serializeToBuffer } from '../serialize/index.js';
5
+ /**
6
+ * Contains information which can be used to prove that a leaf is a member of a Merkle tree.
7
+ */ export class MembershipWitness {
8
+ leafIndex;
9
+ siblingPath;
10
+ constructor(/**
11
+ * Size of the sibling path (number of fields it contains).
12
+ */ pathSize, /**
13
+ * Index of a leaf in the Merkle tree.
14
+ */ leafIndex, /**
15
+ * Sibling path of the leaf in the Merkle tree.
16
+ */ siblingPath){
17
+ this.leafIndex = leafIndex;
18
+ this.siblingPath = siblingPath;
19
+ assertMemberLength(this, 'siblingPath', pathSize);
20
+ }
21
+ toBuffer() {
22
+ return serializeToBuffer(toBufferBE(this.leafIndex, 32), ...this.siblingPath);
23
+ }
24
+ /**
25
+ * Creates a random membership witness. Used for testing purposes.
26
+ * @param pathSize - Number of fields in the sibling path.
27
+ * @returns Random membership witness.
28
+ */ static random(pathSize) {
29
+ return new MembershipWitness(pathSize, 0n, Array(pathSize).fill(0).map(()=>Fr.random()));
30
+ }
31
+ /**
32
+ * Creates a membership witness whose sibling path is full of zero fields.
33
+ * @param pathSize - Number of fields in the sibling path.
34
+ * @param leafIndex - Index of the leaf in the Merkle tree.
35
+ * @returns Membership witness with zero sibling path.
36
+ */ static empty(pathSize, leafIndex = 0n) {
37
+ const arr = Array(pathSize).fill(0).map(()=>Fr.ZERO);
38
+ return new MembershipWitness(pathSize, leafIndex, arr);
39
+ }
40
+ static fromBufferArray(leafIndex, siblingPath) {
41
+ return new MembershipWitness(siblingPath.length, leafIndex, siblingPath.map((x)=>Fr.fromBuffer(x)));
42
+ }
43
+ /**
44
+ * Deserializes from a buffer or reader, corresponding to a write in cpp.
45
+ * @param buffer - Buffer or reader to read from.
46
+ * @returns The deserialized `MembershipWitness`.
47
+ */ static fromBuffer(buffer, size) {
48
+ const reader = BufferReader.asReader(buffer);
49
+ const leafIndex = toBigIntBE(reader.readBytes(32));
50
+ const siblingPath = reader.readArray(size, Fr);
51
+ return new MembershipWitness(size, leafIndex, siblingPath);
52
+ }
53
+ /**
54
+ * Creates a deserializer object for a MembershipWitness with a given size.
55
+ * @param size - Expected size of the witness.
56
+ * @returns A deserializer object.
57
+ */ static deserializer(size) {
58
+ return {
59
+ fromBuffer: (buffer)=>{
60
+ const reader = BufferReader.asReader(buffer);
61
+ const leafIndex = toBigIntBE(reader.readBytes(32));
62
+ const siblingPath = reader.readArray(size, Fr);
63
+ return new MembershipWitness(size, leafIndex, siblingPath);
64
+ }
65
+ };
66
+ }
67
+ static fromSiblingPath(leafIndex, siblingPath) {
68
+ return new MembershipWitness(siblingPath.pathSize, leafIndex, siblingPath.toFields());
69
+ }
70
+ }
@@ -0,0 +1,18 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ /** A simple immutable Merkle tree container. Use a MerkleTreeCalculator to create a new instance from a set of leaves. */
4
+ export declare class MerkleTree {
5
+ readonly height: number;
6
+ readonly nodes: Buffer[];
7
+ constructor(height: number, nodes: Buffer[]);
8
+ get root(): Buffer;
9
+ get leaves(): Buffer[];
10
+ /** Returns a sibling path to the given element or to the element in the given index. */
11
+ getSiblingPath(leafIndex: number): Buffer[];
12
+ getSiblingPath(leaf: Buffer): Buffer[];
13
+ /** Returns the leaf index for a given element. */
14
+ getIndex(element: Buffer): number;
15
+ /** Returns a nice string representation of the tree, useful for debugging purposes. */
16
+ drawTree(elemSize?: number): string;
17
+ }
18
+ //# sourceMappingURL=merkle_tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merkle_tree.d.ts","sourceRoot":"","sources":["../../src/trees/merkle_tree.ts"],"names":[],"mappings":";;AAAA,0HAA0H;AAC1H,qBAAa,UAAU;aACO,MAAM,EAAE,MAAM;aAAkB,KAAK,EAAE,MAAM,EAAE;gBAA/C,MAAM,EAAE,MAAM,EAAkB,KAAK,EAAE,MAAM,EAAE;IAO3E,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,MAAM,IAAI,MAAM,EAAE,CAErB;IAED,wFAAwF;IACjF,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAC3C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAwB7C,kDAAkD;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B,uFAAuF;IAChF,QAAQ,CAAC,QAAQ,SAAI;CAsB7B"}
@@ -0,0 +1,58 @@
1
+ /** A simple immutable Merkle tree container. Use a MerkleTreeCalculator to create a new instance from a set of leaves. */ export class MerkleTree {
2
+ height;
3
+ nodes;
4
+ constructor(height, nodes){
5
+ this.height = height;
6
+ this.nodes = nodes;
7
+ const expectedNodeCount = 2 ** (height + 1) - 1;
8
+ if (nodes.length !== expectedNodeCount) {
9
+ throw new Error(`Invalid node count for Merkle tree: got ${nodes.length} but expected ${expectedNodeCount}`);
10
+ }
11
+ }
12
+ get root() {
13
+ return this.nodes[this.nodes.length - 1];
14
+ }
15
+ get leaves() {
16
+ return this.nodes.slice(0, 2 ** this.height);
17
+ }
18
+ getSiblingPath(leafIndexOrLeaf) {
19
+ if (Buffer.isBuffer(leafIndexOrLeaf)) {
20
+ return this.getSiblingPath(this.getIndex(leafIndexOrLeaf));
21
+ }
22
+ const leafIndex = leafIndexOrLeaf;
23
+ if (leafIndex < 0 || leafIndex >= 2 ** this.height) {
24
+ throw new Error(`Invalid leaf index: got ${leafIndex} but leaves count is ${2 ** this.height}`);
25
+ }
26
+ const tree = this.nodes;
27
+ let rowSize = Math.ceil(tree.length / 2);
28
+ let rowOffset = 0;
29
+ let index = leafIndex;
30
+ const siblingPath = [];
31
+ while(rowSize > 1){
32
+ const isRight = index & 1;
33
+ siblingPath.push(tree[rowOffset + index + (isRight ? -1 : 1)]);
34
+ rowOffset += rowSize;
35
+ rowSize >>= 1;
36
+ index >>= 1;
37
+ }
38
+ return siblingPath;
39
+ }
40
+ /** Returns the leaf index for a given element. */ getIndex(element) {
41
+ return this.leaves.findIndex((leaf)=>leaf.equals(element));
42
+ }
43
+ /** Returns a nice string representation of the tree, useful for debugging purposes. */ drawTree(elemSize = 8) {
44
+ const levels = [];
45
+ const tree = this.nodes;
46
+ const maxRowSize = Math.ceil(tree.length / 2);
47
+ let paddingSize = 1;
48
+ let rowSize = maxRowSize;
49
+ let rowOffset = 0;
50
+ while(rowSize > 0){
51
+ levels.push(tree.slice(rowOffset, rowOffset + rowSize).map((n)=>n.toString('hex').slice(0, elemSize) + ' '.repeat((paddingSize - 1) * (elemSize + 1))));
52
+ rowOffset += rowSize;
53
+ paddingSize <<= 1;
54
+ rowSize >>= 1;
55
+ }
56
+ return levels.reverse().map((row)=>row.join(' ')).join('\n');
57
+ }
58
+ }
@@ -0,0 +1,16 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ import { MerkleTree } from './merkle_tree.js';
4
+ /**
5
+ * Merkle tree calculator.
6
+ */
7
+ export declare class MerkleTreeCalculator {
8
+ private height;
9
+ private zeroHashes;
10
+ private hasher;
11
+ private constructor();
12
+ static create(height: number, zeroLeaf?: Buffer, hasher?: (left: Buffer, right: Buffer) => Promise<Buffer>): Promise<MerkleTreeCalculator>;
13
+ computeTree(leaves?: Buffer[]): Promise<MerkleTree>;
14
+ computeTreeRoot(leaves?: Buffer[]): Promise<Buffer>;
15
+ }
16
+ //# sourceMappingURL=merkle_tree_calculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merkle_tree_calculator.d.ts","sourceRoot":"","sources":["../../src/trees/merkle_tree_calculator.ts"],"names":[],"mappings":";;AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;GAEG;AACH,qBAAa,oBAAoB;IACX,OAAO,CAAC,MAAM;IAAU,OAAO,CAAC,UAAU;IAAY,OAAO,CAAC,MAAM;IAAxF,OAAO;WAIM,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,SAAmB,EAC3B,MAAM,UAAgB,MAAM,SAAS,MAAM,oBAAmD;IAS1F,WAAW,CAAC,MAAM,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAsBvD,eAAe,CAAC,MAAM,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC;CAmB9D"}
@@ -0,0 +1,61 @@
1
+ import { pedersenHash } from '@aztec/foundation/crypto';
2
+ import { MerkleTree } from './merkle_tree.js';
3
+ /**
4
+ * Merkle tree calculator.
5
+ */ export class MerkleTreeCalculator {
6
+ height;
7
+ zeroHashes;
8
+ hasher;
9
+ constructor(height, zeroHashes, hasher){
10
+ this.height = height;
11
+ this.zeroHashes = zeroHashes;
12
+ this.hasher = hasher;
13
+ this.hasher = hasher;
14
+ }
15
+ static async create(height, zeroLeaf = Buffer.alloc(32), hasher = async (left, right)=>(await pedersenHash([
16
+ left,
17
+ right
18
+ ])).toBuffer()) {
19
+ const zeroHashes = [
20
+ zeroLeaf
21
+ ];
22
+ for(let i = 0; i < height; i++){
23
+ zeroHashes.push(await hasher(zeroHashes[i], zeroHashes[i]));
24
+ }
25
+ return new MerkleTreeCalculator(height, zeroHashes, hasher);
26
+ }
27
+ async computeTree(leaves = []) {
28
+ if (leaves.length === 0) {
29
+ leaves = new Array(2 ** this.height).fill(this.zeroHashes[0]);
30
+ }
31
+ let result = leaves.slice();
32
+ for(let i = 0; i < this.height; ++i){
33
+ const numLeaves = 2 ** (this.height - i);
34
+ const newLeaves = [];
35
+ for(let j = 0; j < leaves.length / 2; ++j){
36
+ const l = leaves[j * 2];
37
+ const r = leaves[j * 2 + 1] || this.zeroHashes[i];
38
+ newLeaves[j] = await this.hasher(l, r);
39
+ }
40
+ result = result.concat(new Array(numLeaves - leaves.length).fill(this.zeroHashes[i]), newLeaves);
41
+ leaves = newLeaves;
42
+ }
43
+ return new MerkleTree(this.height, result);
44
+ }
45
+ async computeTreeRoot(leaves = []) {
46
+ if (leaves.length === 0) {
47
+ return this.zeroHashes[this.zeroHashes.length - 1];
48
+ }
49
+ leaves = leaves.slice();
50
+ for(let i = 0; i < this.height; ++i){
51
+ let j = 0;
52
+ for(; j < leaves.length / 2; ++j){
53
+ const l = leaves[j * 2];
54
+ const r = leaves[j * 2 + 1] || this.zeroHashes[i];
55
+ leaves[j] = await this.hasher(l, r);
56
+ }
57
+ leaves = leaves.slice(0, j);
58
+ }
59
+ return leaves[0];
60
+ }
61
+ }
@@ -0,0 +1,132 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ import { Fr } from '../fields/index.js';
4
+ import { type Tuple } from '../serialize/index.js';
5
+ import type { Hasher } from './hasher.js';
6
+ /**
7
+ * Contains functionality to compute and serialize/deserialize a sibling path.
8
+ * E.g. Sibling path for a leaf at index 3 in a tree of depth 3 consists of:
9
+ * d0: [ root ]
10
+ * d1: [ ] [*]
11
+ * d2: [*] [ ] [ ] [ ]
12
+ * d3: [ ] [ ] [*] [ ] [ ] [ ] [ ] [ ].
13
+ *
14
+ * And the elements would be ordered as: [ leaf_at_index_2, node_at_level_2_index_0, node_at_level_1_index_1 ].
15
+ */
16
+ export declare class SiblingPath<N extends number> {
17
+ /** Size of the sibling path (number of fields it contains). */
18
+ pathSize: N;
19
+ private data;
20
+ /**
21
+ * Constructor.
22
+ * @param pathSize - The size of the sibling path.
23
+ * @param path - The sibling path data.
24
+ */
25
+ constructor(
26
+ /** Size of the sibling path (number of fields it contains). */
27
+ pathSize: N,
28
+ /** The sibling path data. */
29
+ path: Buffer[]);
30
+ static get schema(): import("zod").ZodEffects<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, Buffer, string>, import("zod").ZodEffects<import("zod").ZodObject<{
31
+ type: import("zod").ZodLiteral<"Buffer">;
32
+ data: import("zod").ZodArray<import("zod").ZodNumber, "many">;
33
+ }, "strip", import("zod").ZodTypeAny, {
34
+ type: "Buffer";
35
+ data: number[];
36
+ }, {
37
+ type: "Buffer";
38
+ data: number[];
39
+ }>, Buffer, {
40
+ type: "Buffer";
41
+ data: number[];
42
+ }>]>, SiblingPath<number>, string | {
43
+ type: "Buffer";
44
+ data: number[];
45
+ }>;
46
+ static schemaFor<N extends number>(size: N): import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodUnion<[import("zod").ZodEffects<import("zod").ZodEffects<import("zod").ZodString, string, string>, Buffer, string>, import("zod").ZodEffects<import("zod").ZodObject<{
47
+ type: import("zod").ZodLiteral<"Buffer">;
48
+ data: import("zod").ZodArray<import("zod").ZodNumber, "many">;
49
+ }, "strip", import("zod").ZodTypeAny, {
50
+ type: "Buffer";
51
+ data: number[];
52
+ }, {
53
+ type: "Buffer";
54
+ data: number[];
55
+ }>, Buffer, {
56
+ type: "Buffer";
57
+ data: number[];
58
+ }>]>, SiblingPath<N>, string | {
59
+ type: "Buffer";
60
+ data: number[];
61
+ }>, SiblingPath<N>, string | {
62
+ type: "Buffer";
63
+ data: number[];
64
+ }>;
65
+ toJSON(): Buffer;
66
+ /**
67
+ * Returns sibling path hashed up from the a element.
68
+ * @param size - The number of elements in a given path.
69
+ * @param zeroElement - Value of the zero element.
70
+ * @param hasher - Implementation of a hasher interface.
71
+ * @returns A sibling path hashed up from a zero element.
72
+ */
73
+ static ZERO<N extends number>(size: N, zeroElement: Buffer, hasher: Hasher): SiblingPath<N>;
74
+ static random<N extends number>(number: N): SiblingPath<N>;
75
+ /**
76
+ * Serializes this SiblingPath object to a buffer.
77
+ * @returns The buffer representation of this object.
78
+ */
79
+ toBuffer(): Buffer;
80
+ /**
81
+ * Returns the path buffer underlying the sibling path.
82
+ * @returns The Buffer array representation of this object.
83
+ */
84
+ toBufferArray(): Buffer[];
85
+ /**
86
+ * Convert the Sibling Path object into an array of field elements.
87
+ * @returns The field array representation of this object.
88
+ */
89
+ toFields(): Fr[];
90
+ /**
91
+ * Convert Sibling Path object into a tuple of field elements.
92
+ * @returns A tuple representation of the sibling path.
93
+ */
94
+ toTuple(): Tuple<Fr, N>;
95
+ /**
96
+ * Deserializes a SiblingPath from a buffer.
97
+ * @param buf - A buffer containing the buffer representation of SiblingPath.
98
+ * @param offset - An offset to start deserializing from.
99
+ * @returns A SiblingPath object.
100
+ */
101
+ static fromBuffer<N extends number>(buf: Buffer, offset?: number): SiblingPath<N>;
102
+ /**
103
+ * Deserializes a SiblingPath object from a slice of a part of a buffer and returns the amount of bytes advanced.
104
+ * @param buf - A buffer representation of the sibling path.
105
+ * @param offset - An offset to start deserializing from.
106
+ * @returns The deserialized sibling path and the number of bytes advanced.
107
+ */
108
+ static deserialize<N extends number>(buf: Buffer, offset?: number): {
109
+ elem: SiblingPath<N>;
110
+ adv: number;
111
+ };
112
+ /**
113
+ * Serializes this SiblingPath object to a hex string representation.
114
+ * @returns A hex string representation of the sibling path.
115
+ */
116
+ toString(): string;
117
+ /**
118
+ * Deserializes a SiblingPath object from a hex string representation.
119
+ * @param repr - A hex string representation of the sibling path.
120
+ * @returns A SiblingPath object.
121
+ */
122
+ static fromString<N extends number>(repr: string): SiblingPath<N>;
123
+ /**
124
+ * Generate a subtree path from the current sibling path.
125
+ * @param subtreeHeight - The size of the subtree that we are getting the path for.
126
+ * @returns A new sibling path that is the for the requested subtree.
127
+ */
128
+ getSubtreeSiblingPath<SubtreeHeight extends number, SubtreeSiblingPathHeight extends number>(subtreeHeight: SubtreeHeight): SiblingPath<SubtreeSiblingPathHeight>;
129
+ }
130
+ /** Computes the expected root of a merkle tree given a leaf and its sibling path. */
131
+ export declare function computeRootFromSiblingPath(leaf: Buffer, siblingPath: Buffer[], index: number, hasher?: (left: Buffer, right: Buffer) => Promise<Buffer>): Promise<Buffer>;
132
+ //# sourceMappingURL=sibling_path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sibling_path.d.ts","sourceRoot":"","sources":["../../src/trees/sibling_path.ts"],"names":[],"mappings":";;AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,OAAO,EACL,KAAK,KAAK,EAIX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;;;;GASG;AACH,qBAAa,WAAW,CAAC,CAAC,SAAS,MAAM;IASrC,+DAA+D;IACxD,QAAQ,EAAE,CAAC;IATpB,OAAO,CAAC,IAAI,CAAmB;IAE/B;;;;OAIG;;IAED,+DAA+D;IACxD,QAAQ,EAAE,CAAC;IAClB,6BAA6B;IAC7B,IAAI,EAAE,MAAM,EAAE;IAKhB,MAAM,KAAK,MAAM;;;;;;;;;;;;;;;OAEhB;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC;;;;;;;;;;;;;;;;;;;IAO1C,MAAM;IAIN;;;;;;OAMG;WACW,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;IAUlG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC;IAKzC;;;OAGG;IACI,QAAQ,IAAI,MAAM;IAIzB;;;OAGG;IACI,aAAa,IAAI,MAAM,EAAE;IAIhC;;;OAGG;IACI,QAAQ,IAAI,EAAE,EAAE;IAIvB;;;OAGG;IACI,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAK9B;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,WAAW,CAAC,CAAC,CAAC;IAK5E;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI;;;;IAU5D;;;OAGG;IACI,QAAQ,IAAI,MAAM;IAIzB;;;;OAIG;WACW,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;IAIxE;;;;OAIG;IACI,qBAAqB,CAAC,aAAa,SAAS,MAAM,EAAE,wBAAwB,SAAS,MAAM,EAChG,aAAa,EAAE,aAAa,GAC3B,WAAW,CAAC,wBAAwB,CAAC;CAMzC;AAED,qFAAqF;AACrF,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,UAAgB,MAAM,SAAS,MAAM,oBAAmD,mBAQ/F"}
@@ -0,0 +1,144 @@
1
+ import { makeTuple } from '../array/array.js';
2
+ import { pedersenHash } from '../crypto/index.js';
3
+ import { Fr } from '../fields/index.js';
4
+ import { schemas } from '../schemas/index.js';
5
+ import { assertLength, deserializeArrayFromVector, serializeArrayOfBufferableToVector } from '../serialize/index.js';
6
+ import { bufferToHex, hexToBuffer } from '../string/index.js';
7
+ /**
8
+ * Contains functionality to compute and serialize/deserialize a sibling path.
9
+ * E.g. Sibling path for a leaf at index 3 in a tree of depth 3 consists of:
10
+ * d0: [ root ]
11
+ * d1: [ ] [*]
12
+ * d2: [*] [ ] [ ] [ ]
13
+ * d3: [ ] [ ] [*] [ ] [ ] [ ] [ ] [ ].
14
+ *
15
+ * And the elements would be ordered as: [ leaf_at_index_2, node_at_level_2_index_0, node_at_level_1_index_1 ].
16
+ */ export class SiblingPath {
17
+ pathSize;
18
+ data;
19
+ /**
20
+ * Constructor.
21
+ * @param pathSize - The size of the sibling path.
22
+ * @param path - The sibling path data.
23
+ */ constructor(/** Size of the sibling path (number of fields it contains). */ pathSize, /** The sibling path data. */ path){
24
+ this.pathSize = pathSize;
25
+ this.data = assertLength(path, pathSize);
26
+ }
27
+ static get schema() {
28
+ return schemas.Buffer.transform((b)=>SiblingPath.fromBuffer(b));
29
+ }
30
+ static schemaFor(size) {
31
+ return schemas.Buffer.transform((b)=>SiblingPath.fromBuffer(b)).refine((path)=>path.pathSize === size, (path)=>({
32
+ message: `Expected sibling path size ${size} but got ${path.pathSize}`
33
+ }));
34
+ }
35
+ toJSON() {
36
+ return this.toBuffer();
37
+ }
38
+ /**
39
+ * Returns sibling path hashed up from the a element.
40
+ * @param size - The number of elements in a given path.
41
+ * @param zeroElement - Value of the zero element.
42
+ * @param hasher - Implementation of a hasher interface.
43
+ * @returns A sibling path hashed up from a zero element.
44
+ */ static ZERO(size, zeroElement, hasher) {
45
+ const bufs = [];
46
+ let current = zeroElement;
47
+ for(let i = 0; i < size; ++i){
48
+ bufs.push(current);
49
+ current = hasher.hash(current, current);
50
+ }
51
+ return new SiblingPath(size, bufs);
52
+ }
53
+ static random(number) {
54
+ const data = Array.from({
55
+ length: number
56
+ }, ()=>Fr.random().toBuffer());
57
+ return new SiblingPath(number, data);
58
+ }
59
+ /**
60
+ * Serializes this SiblingPath object to a buffer.
61
+ * @returns The buffer representation of this object.
62
+ */ toBuffer() {
63
+ return serializeArrayOfBufferableToVector(this.data);
64
+ }
65
+ /**
66
+ * Returns the path buffer underlying the sibling path.
67
+ * @returns The Buffer array representation of this object.
68
+ */ toBufferArray() {
69
+ return this.data;
70
+ }
71
+ /**
72
+ * Convert the Sibling Path object into an array of field elements.
73
+ * @returns The field array representation of this object.
74
+ */ toFields() {
75
+ return this.data.map((buf)=>Fr.fromBuffer(buf));
76
+ }
77
+ /**
78
+ * Convert Sibling Path object into a tuple of field elements.
79
+ * @returns A tuple representation of the sibling path.
80
+ */ toTuple() {
81
+ const array = this.toFields();
82
+ return makeTuple(array.length, (i)=>array[i], 0);
83
+ }
84
+ /**
85
+ * Deserializes a SiblingPath from a buffer.
86
+ * @param buf - A buffer containing the buffer representation of SiblingPath.
87
+ * @param offset - An offset to start deserializing from.
88
+ * @returns A SiblingPath object.
89
+ */ static fromBuffer(buf, offset = 0) {
90
+ const { elem } = SiblingPath.deserialize(buf, offset);
91
+ return elem;
92
+ }
93
+ /**
94
+ * Deserializes a SiblingPath object from a slice of a part of a buffer and returns the amount of bytes advanced.
95
+ * @param buf - A buffer representation of the sibling path.
96
+ * @param offset - An offset to start deserializing from.
97
+ * @returns The deserialized sibling path and the number of bytes advanced.
98
+ */ static deserialize(buf, offset = 0) {
99
+ const deserializePath = (buf, offset)=>({
100
+ elem: buf.slice(offset, offset + 32),
101
+ adv: 32
102
+ });
103
+ const { elem, adv } = deserializeArrayFromVector(deserializePath, buf, offset);
104
+ const size = elem.length;
105
+ return {
106
+ elem: new SiblingPath(size, elem),
107
+ adv
108
+ };
109
+ }
110
+ /**
111
+ * Serializes this SiblingPath object to a hex string representation.
112
+ * @returns A hex string representation of the sibling path.
113
+ */ toString() {
114
+ return bufferToHex(this.toBuffer());
115
+ }
116
+ /**
117
+ * Deserializes a SiblingPath object from a hex string representation.
118
+ * @param repr - A hex string representation of the sibling path.
119
+ * @returns A SiblingPath object.
120
+ */ static fromString(repr) {
121
+ return SiblingPath.fromBuffer(hexToBuffer(repr));
122
+ }
123
+ /**
124
+ * Generate a subtree path from the current sibling path.
125
+ * @param subtreeHeight - The size of the subtree that we are getting the path for.
126
+ * @returns A new sibling path that is the for the requested subtree.
127
+ */ getSubtreeSiblingPath(subtreeHeight) {
128
+ // Drop the size of the subtree from the path, and return the rest.
129
+ const subtreeData = this.data.slice(subtreeHeight);
130
+ const subtreePathSize = this.pathSize - subtreeHeight;
131
+ return new SiblingPath(subtreePathSize, subtreeData);
132
+ }
133
+ }
134
+ /** Computes the expected root of a merkle tree given a leaf and its sibling path. */ export async function computeRootFromSiblingPath(leaf, siblingPath, index, hasher = async (left, right)=>(await pedersenHash([
135
+ left,
136
+ right
137
+ ])).toBuffer()) {
138
+ let result = leaf;
139
+ for (const sibling of siblingPath){
140
+ result = index & 1 ? await hasher(sibling, result) : await hasher(result, sibling);
141
+ index >>= 1;
142
+ }
143
+ return result;
144
+ }
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
2
  /// <reference types="node" resolution-mode="require"/>
3
- import { sha256Trunc } from '@aztec/foundation/crypto';
3
+ import { sha256Trunc } from '../crypto/sha256/index.js';
4
4
  /**
5
5
  * Computes the merkle root for an unbalanced tree.
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"unbalanced_merkle_tree.d.ts","sourceRoot":"","sources":["../../src/trees/unbalanced_merkle_tree.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,qBAAc,GAAG,MAAM,CAwC9G;AAgDD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;EAGzE"}
1
+ {"version":3,"file":"unbalanced_merkle_tree.d.ts","sourceRoot":"","sources":["../../src/trees/unbalanced_merkle_tree.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,qBAAc,GAAG,MAAM,CAwC9G;AAgDD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;EAGzE"}
@@ -1,5 +1,5 @@
1
- import { padArrayEnd } from '@aztec/foundation/collection';
2
- import { sha256Trunc } from '@aztec/foundation/crypto';
1
+ import { padArrayEnd } from '../collection/array.js';
2
+ import { sha256Trunc } from '../crypto/sha256/index.js';
3
3
  /**
4
4
  * Computes the merkle root for an unbalanced tree.
5
5
  *
@@ -7,26 +7,33 @@ import { sha256Trunc } from '@aztec/foundation/crypto';
7
7
  * Calculates the tree upwards layer by layer until we reach the root.
8
8
  * The L1 calculation instead computes the tree from right to left (slightly cheaper gas).
9
9
  * TODO: A more thorough investigation of which method is cheaper, then use that method everywhere.
10
- */
11
- export function computeUnbalancedMerkleRoot(leaves, emptyLeaf, hasher = sha256Trunc) {
10
+ */ export function computeUnbalancedMerkleRoot(leaves, emptyLeaf, hasher = sha256Trunc) {
12
11
  // Pad leaves to 2
13
12
  if (leaves.length < 2) {
14
13
  if (emptyLeaf === undefined) {
15
14
  throw new Error('Cannot compute a Merkle root with less than 2 leaves');
16
- }
17
- else {
15
+ } else {
18
16
  leaves = padArrayEnd(leaves, emptyLeaf, 2);
19
17
  }
20
18
  }
21
19
  const depth = Math.ceil(Math.log2(leaves.length));
22
- let [layerWidth, nodeToShift] = leaves.length & 1 ? [leaves.length - 1, leaves[leaves.length - 1]] : [leaves.length, Buffer.alloc(0)];
20
+ let [layerWidth, nodeToShift] = leaves.length & 1 ? [
21
+ leaves.length - 1,
22
+ leaves[leaves.length - 1]
23
+ ] : [
24
+ leaves.length,
25
+ Buffer.alloc(0)
26
+ ];
23
27
  // Allocate this layer's leaves and init the next layer up
24
28
  let thisLayer = leaves.slice(0, layerWidth);
25
29
  let nextLayer = [];
26
- for (let i = 0; i < depth; i++) {
27
- for (let j = 0; j < layerWidth; j += 2) {
30
+ for(let i = 0; i < depth; i++){
31
+ for(let j = 0; j < layerWidth; j += 2){
28
32
  // Store the hash of each pair one layer up
29
- nextLayer[j / 2] = hasher(Buffer.concat([thisLayer[j], thisLayer[j + 1]]));
33
+ nextLayer[j / 2] = hasher(Buffer.concat([
34
+ thisLayer[j],
35
+ thisLayer[j + 1]
36
+ ]));
30
37
  }
31
38
  layerWidth /= 2;
32
39
  if (layerWidth & 1) {
@@ -35,8 +42,7 @@ export function computeUnbalancedMerkleRoot(leaves, emptyLeaf, hasher = sha256Tr
35
42
  nextLayer.push(nodeToShift);
36
43
  layerWidth += 1;
37
44
  nodeToShift = Buffer.alloc(0);
38
- }
39
- else {
45
+ } else {
40
46
  // If we don't have a node waiting to be shifted, store the next layer's final node to be shifted
41
47
  layerWidth -= 1;
42
48
  nodeToShift = nextLayer[layerWidth];
@@ -58,7 +64,10 @@ function getMaxUnbalancedTreeDepth(numLeaves) {
58
64
  function findPosition(rootLevel, leafLevel, numLeaves, indexOffset, targetIndex) {
59
65
  if (numLeaves <= 1) {
60
66
  // Single leaf.
61
- return { level: rootLevel, indexAtLevel: indexOffset };
67
+ return {
68
+ level: rootLevel,
69
+ indexAtLevel: indexOffset
70
+ };
62
71
  }
63
72
  // The largest balanced tree that can be created with the given number of leaves.
64
73
  const maxBalancedTreeDepth = getMaxBalancedTreeDepth(numLeaves);
@@ -71,14 +80,16 @@ function findPosition(rootLevel, leafLevel, numLeaves, indexOffset, targetIndex)
71
80
  // And the balanced tree will be the left child of the root.
72
81
  // There will be an extra level between the root of the balanced tree and the current root.
73
82
  const extraLevel = numRemainingLeaves ? 1 : 0;
74
- return { level: rootLevel + maxBalancedTreeDepth + extraLevel, indexAtLevel: indexOffset + targetIndex };
75
- }
76
- else {
83
+ return {
84
+ level: rootLevel + maxBalancedTreeDepth + extraLevel,
85
+ indexAtLevel: indexOffset + targetIndex
86
+ };
87
+ } else {
77
88
  // Target is in the right branch.
78
89
  const rightBranchMaxLevel = getMaxUnbalancedTreeDepth(numRemainingLeaves);
79
90
  const shiftedUp = leafLevel - rootLevel - rightBranchMaxLevel - 1;
80
91
  const nextLeafLevel = leafLevel - shiftedUp;
81
- const newIndexOffset = (indexOffset + numBalancedLeaves) >> shiftedUp;
92
+ const newIndexOffset = indexOffset + numBalancedLeaves >> shiftedUp;
82
93
  const shiftedTargetIndex = targetIndex - numBalancedLeaves;
83
94
  return findPosition(rootLevel + 1, nextLeafLevel, numRemainingLeaves, newIndexOffset, shiftedTargetIndex);
84
95
  }
@@ -87,4 +98,3 @@ export function findLeafLevelAndIndex(numLeaves, leafIndex) {
87
98
  const maxLevel = getMaxUnbalancedTreeDepth(numLeaves);
88
99
  return findPosition(0, maxLevel, numLeaves, 0, leafIndex);
89
100
  }
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iYWxhbmNlZF9tZXJrbGVfdHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmVlcy91bmJhbGFuY2VkX21lcmtsZV90cmVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxNQUFnQixFQUFFLFNBQWtCLEVBQUUsTUFBTSxHQUFHLFdBQVc7SUFDcEcsa0JBQWtCO0lBQ2xCLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QixJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDMUUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FDM0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RywwREFBMEQ7SUFDMUQs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