@aztec/foundation 0.0.1-commit.b655e406 → 0.0.1-commit.c0b82b2

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 (508) hide show
  1. package/dest/array/array.d.ts +1 -9
  2. package/dest/array/array.d.ts.map +1 -1
  3. package/dest/array/array.js +0 -11
  4. package/dest/array/index.d.ts +2 -1
  5. package/dest/array/index.d.ts.map +1 -1
  6. package/dest/array/index.js +1 -0
  7. package/dest/array/sorted_array.d.ts +15 -0
  8. package/dest/array/sorted_array.d.ts.map +1 -0
  9. package/dest/array/sorted_array.js +109 -0
  10. package/dest/async-map/index.d.ts +1 -1
  11. package/dest/async-pool/index.d.ts +1 -1
  12. package/dest/bigint/index.d.ts +1 -1
  13. package/dest/bigint-buffer/index.d.ts +1 -1
  14. package/dest/branded-types/block_number.d.ts +56 -0
  15. package/dest/branded-types/block_number.d.ts.map +1 -0
  16. package/dest/branded-types/block_number.js +78 -0
  17. package/dest/branded-types/checkpoint_number.d.ts +54 -0
  18. package/dest/branded-types/checkpoint_number.d.ts.map +1 -0
  19. package/dest/branded-types/checkpoint_number.js +77 -0
  20. package/dest/branded-types/epoch.d.ts +42 -0
  21. package/dest/branded-types/epoch.d.ts.map +1 -0
  22. package/dest/branded-types/epoch.js +59 -0
  23. package/dest/branded-types/index.d.ts +7 -0
  24. package/dest/branded-types/index.d.ts.map +1 -0
  25. package/dest/branded-types/index.js +5 -0
  26. package/dest/branded-types/index_within_checkpoint.d.ts +42 -0
  27. package/dest/branded-types/index_within_checkpoint.d.ts.map +1 -0
  28. package/dest/branded-types/index_within_checkpoint.js +59 -0
  29. package/dest/branded-types/slot.d.ts +42 -0
  30. package/dest/branded-types/slot.d.ts.map +1 -0
  31. package/dest/branded-types/slot.js +59 -0
  32. package/dest/branded-types/types.d.ts +5 -0
  33. package/dest/branded-types/types.d.ts.map +1 -0
  34. package/dest/branded-types/types.js +1 -0
  35. package/dest/buffer/buffer16.d.ts +2 -2
  36. package/dest/buffer/buffer16.d.ts.map +1 -1
  37. package/dest/buffer/buffer16.js +4 -2
  38. package/dest/buffer/buffer32.d.ts +2 -2
  39. package/dest/buffer/buffer32.d.ts.map +1 -1
  40. package/dest/buffer/buffer32.js +4 -2
  41. package/dest/buffer/index.d.ts +1 -1
  42. package/dest/collection/array.d.ts +12 -1
  43. package/dest/collection/array.d.ts.map +1 -1
  44. package/dest/collection/array.js +51 -0
  45. package/dest/collection/index.d.ts +1 -1
  46. package/dest/collection/object.d.ts +1 -1
  47. package/dest/committable/committable.d.ts +1 -1
  48. package/dest/committable/committable.d.ts.map +1 -1
  49. package/dest/committable/index.d.ts +1 -1
  50. package/dest/config/env_var.d.ts +2 -2
  51. package/dest/config/env_var.d.ts.map +1 -1
  52. package/dest/config/index.d.ts +15 -4
  53. package/dest/config/index.d.ts.map +1 -1
  54. package/dest/config/index.js +32 -9
  55. package/dest/config/network_config.d.ts +13 -1
  56. package/dest/config/network_config.d.ts.map +1 -1
  57. package/dest/config/network_config.js +3 -1
  58. package/dest/config/network_name.d.ts +2 -2
  59. package/dest/config/network_name.d.ts.map +1 -1
  60. package/dest/config/network_name.js +2 -0
  61. package/dest/config/parse-env.d.ts +3 -0
  62. package/dest/config/parse-env.d.ts.map +1 -0
  63. package/dest/config/parse-env.js +7 -0
  64. package/dest/config/secret_value.d.ts +1 -1
  65. package/dest/config/secret_value.d.ts.map +1 -1
  66. package/dest/config/secret_value.js +3 -1
  67. package/dest/crypto/aes128/index.d.ts +1 -1
  68. package/dest/crypto/aes128/index.d.ts.map +1 -1
  69. package/dest/crypto/aes128/index.js +2 -6
  70. package/dest/crypto/bls/bn254_keystore.d.ts +15 -15
  71. package/dest/crypto/bls/bn254_keystore.d.ts.map +1 -1
  72. package/dest/crypto/bls/bn254_keystore.js +1 -1
  73. package/dest/crypto/bls/index.d.ts +1 -1
  74. package/dest/crypto/bls/index.js +1 -1
  75. package/dest/crypto/bn254/index.d.ts +35 -51
  76. package/dest/crypto/bn254/index.d.ts.map +1 -1
  77. package/dest/crypto/bn254/index.js +51 -137
  78. package/dest/crypto/ecdsa/index.d.ts +1 -1
  79. package/dest/crypto/ecdsa/index.d.ts.map +1 -1
  80. package/dest/crypto/ecdsa/index.js +4 -12
  81. package/dest/crypto/ecdsa/signature.d.ts +2 -2
  82. package/dest/crypto/ecdsa/signature.d.ts.map +1 -1
  83. package/dest/crypto/ecdsa/signature.js +2 -2
  84. package/dest/crypto/grumpkin/index.d.ts +4 -2
  85. package/dest/crypto/grumpkin/index.d.ts.map +1 -1
  86. package/dest/crypto/grumpkin/index.js +7 -16
  87. package/dest/crypto/keccak/index.d.ts +1 -1
  88. package/dest/crypto/keys/index.d.ts +2 -2
  89. package/dest/crypto/keys/index.d.ts.map +1 -1
  90. package/dest/crypto/keys/index.js +2 -4
  91. package/dest/crypto/pedersen/index.d.ts +1 -1
  92. package/dest/crypto/pedersen/pedersen.noble.d.ts +1 -1
  93. package/dest/crypto/pedersen/pedersen.wasm.d.ts +2 -2
  94. package/dest/crypto/pedersen/pedersen.wasm.d.ts.map +1 -1
  95. package/dest/crypto/pedersen/pedersen.wasm.js +4 -10
  96. package/dest/crypto/poseidon/index.d.ts +2 -3
  97. package/dest/crypto/poseidon/index.d.ts.map +1 -1
  98. package/dest/crypto/poseidon/index.js +14 -33
  99. package/dest/crypto/random/index.d.ts +1 -1
  100. package/dest/crypto/random/index.d.ts.map +1 -1
  101. package/dest/crypto/random/randomness_singleton.d.ts +4 -3
  102. package/dest/crypto/random/randomness_singleton.d.ts.map +1 -1
  103. package/dest/crypto/random/randomness_singleton.js +5 -5
  104. package/dest/crypto/schnorr/index.d.ts +3 -2
  105. package/dest/crypto/schnorr/index.d.ts.map +1 -1
  106. package/dest/crypto/schnorr/index.js +4 -10
  107. package/dest/crypto/schnorr/signature.d.ts +2 -2
  108. package/dest/crypto/schnorr/signature.d.ts.map +1 -1
  109. package/dest/crypto/schnorr/signature.js +2 -2
  110. package/dest/crypto/secp256k1/index.d.ts +1 -1
  111. package/dest/crypto/secp256k1/index.d.ts.map +1 -1
  112. package/dest/crypto/secp256k1/index.js +3 -9
  113. package/dest/crypto/secp256k1-signer/index.d.ts +1 -1
  114. package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts +1 -1
  115. package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts.map +1 -1
  116. package/dest/crypto/secp256k1-signer/utils.d.ts +1 -1
  117. package/dest/crypto/secp256k1-signer/utils.d.ts.map +1 -1
  118. package/dest/crypto/serialize.d.ts +1 -1
  119. package/dest/crypto/sha256/index.d.ts +2 -2
  120. package/dest/crypto/sha256/index.d.ts.map +1 -1
  121. package/dest/crypto/sha256/index.js +1 -1
  122. package/dest/crypto/sha512/index.d.ts +3 -3
  123. package/dest/crypto/sha512/index.d.ts.map +1 -1
  124. package/dest/crypto/sha512/index.js +1 -1
  125. package/dest/crypto/signature/index.d.ts +2 -2
  126. package/dest/crypto/signature/index.d.ts.map +1 -1
  127. package/dest/crypto/sync/index.d.ts +1 -1
  128. package/dest/crypto/sync/index.js +1 -3
  129. package/dest/crypto/sync/pedersen/index.d.ts +2 -2
  130. package/dest/crypto/sync/pedersen/index.d.ts.map +1 -1
  131. package/dest/crypto/sync/pedersen/index.js +1 -1
  132. package/dest/crypto/sync/poseidon/index.d.ts +2 -3
  133. package/dest/crypto/sync/poseidon/index.d.ts.map +1 -1
  134. package/dest/crypto/sync/poseidon/index.js +1 -9
  135. package/dest/{fields/bls12_fields.d.ts → curves/bls12/field.d.ts} +3 -3
  136. package/dest/curves/bls12/field.d.ts.map +1 -0
  137. package/dest/{fields/bls12_fields.js → curves/bls12/field.js} +12 -9
  138. package/dest/curves/bls12/index.d.ts +3 -0
  139. package/dest/curves/bls12/index.d.ts.map +1 -0
  140. package/dest/curves/bls12/index.js +2 -0
  141. package/dest/{fields/bls12_point.d.ts → curves/bls12/point.d.ts} +4 -4
  142. package/dest/curves/bls12/point.d.ts.map +1 -0
  143. package/dest/{fields/bls12_point.js → curves/bls12/point.js} +10 -8
  144. package/dest/curves/bn254/field.d.ts +181 -0
  145. package/dest/curves/bn254/field.d.ts.map +1 -0
  146. package/dest/{fields/fields.js → curves/bn254/field.js} +52 -49
  147. package/dest/curves/bn254/index.d.ts +3 -0
  148. package/dest/curves/bn254/index.d.ts.map +1 -0
  149. package/dest/curves/bn254/index.js +2 -0
  150. package/dest/curves/bn254/point.d.ts +54 -0
  151. package/dest/curves/bn254/point.d.ts.map +1 -0
  152. package/dest/curves/bn254/point.js +143 -0
  153. package/dest/curves/grumpkin/index.d.ts +10 -0
  154. package/dest/curves/grumpkin/index.d.ts.map +1 -0
  155. package/dest/curves/grumpkin/index.js +3 -0
  156. package/dest/{fields → curves/grumpkin}/point.d.ts +12 -3
  157. package/dest/curves/grumpkin/point.d.ts.map +1 -0
  158. package/dest/{fields → curves/grumpkin}/point.js +24 -7
  159. package/dest/decorators/index.d.ts +1 -1
  160. package/dest/decorators/memoize.d.ts +1 -1
  161. package/dest/decorators/memoize.d.ts.map +1 -1
  162. package/dest/error/index.d.ts +1 -1
  163. package/dest/eth-address/index.d.ts +12 -2
  164. package/dest/eth-address/index.d.ts.map +1 -1
  165. package/dest/eth-address/index.js +27 -3
  166. package/dest/eth-signature/eth_signature.d.ts +1 -1
  167. package/dest/eth-signature/eth_signature.d.ts.map +1 -1
  168. package/dest/eth-signature/index.d.ts +1 -1
  169. package/dest/fs/index.d.ts +1 -1
  170. package/dest/fs/run_in_dir.d.ts +1 -1
  171. package/dest/fs/try_rm_dir.d.ts +1 -1
  172. package/dest/iterable/all.d.ts +1 -1
  173. package/dest/iterable/filter.d.ts +1 -1
  174. package/dest/iterable/index.d.ts +1 -1
  175. package/dest/iterable/isAsyncIt.d.ts +1 -1
  176. package/dest/iterable/map.d.ts +1 -1
  177. package/dest/iterable/peek.d.ts +1 -1
  178. package/dest/iterable/sort.d.ts +1 -1
  179. package/dest/iterable/take.d.ts +1 -1
  180. package/dest/iterable/toArray.d.ts +1 -1
  181. package/dest/iterator/filter.d.ts +3 -0
  182. package/dest/iterator/filter.d.ts.map +1 -0
  183. package/dest/iterator/filter.js +7 -0
  184. package/dest/iterator/index.d.ts +2 -0
  185. package/dest/iterator/index.d.ts.map +1 -0
  186. package/dest/iterator/index.js +1 -0
  187. package/dest/jest/setup.js +28 -1
  188. package/dest/json-rpc/client/fetch.d.ts +1 -1
  189. package/dest/json-rpc/client/index.d.ts +1 -1
  190. package/dest/json-rpc/client/safe_json_rpc_client.d.ts +2 -1
  191. package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -1
  192. package/dest/json-rpc/client/safe_json_rpc_client.js +1 -1
  193. package/dest/json-rpc/client/undici.d.ts +1 -1
  194. package/dest/json-rpc/client/undici.d.ts.map +1 -1
  195. package/dest/json-rpc/client/undici.js +21 -4
  196. package/dest/json-rpc/convert.d.ts +1 -1
  197. package/dest/json-rpc/errors.d.ts +1 -1
  198. package/dest/json-rpc/errors.d.ts.map +1 -1
  199. package/dest/json-rpc/fixtures/class_a.d.ts +1 -1
  200. package/dest/json-rpc/fixtures/class_a.d.ts.map +1 -1
  201. package/dest/json-rpc/fixtures/class_b.d.ts +1 -1
  202. package/dest/json-rpc/fixtures/class_b.d.ts.map +1 -1
  203. package/dest/json-rpc/fixtures/test_state.d.ts +1 -1
  204. package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -1
  205. package/dest/json-rpc/index.d.ts +1 -1
  206. package/dest/json-rpc/js_utils.d.ts +1 -1
  207. package/dest/json-rpc/js_utils.d.ts.map +1 -1
  208. package/dest/json-rpc/server/api_key_auth.d.ts +19 -0
  209. package/dest/json-rpc/server/api_key_auth.d.ts.map +1 -0
  210. package/dest/json-rpc/server/api_key_auth.js +57 -0
  211. package/dest/json-rpc/server/index.d.ts +2 -1
  212. package/dest/json-rpc/server/index.d.ts.map +1 -1
  213. package/dest/json-rpc/server/index.js +1 -0
  214. package/dest/json-rpc/server/safe_json_rpc_server.d.ts +1 -1
  215. package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -1
  216. package/dest/json-rpc/server/safe_json_rpc_server.js +1 -1
  217. package/dest/json-rpc/test/index.d.ts +1 -1
  218. package/dest/json-rpc/test/integration.d.ts +1 -1
  219. package/dest/log/bigint-utils.d.ts +5 -0
  220. package/dest/log/bigint-utils.d.ts.map +1 -0
  221. package/dest/log/bigint-utils.js +18 -0
  222. package/dest/log/console.d.ts +1 -1
  223. package/dest/log/gcloud-logger-config.d.ts +1 -1
  224. package/dest/log/gcloud-logger-config.d.ts.map +1 -1
  225. package/dest/log/gcloud-logger-config.js +3 -0
  226. package/dest/log/index.d.ts +1 -1
  227. package/dest/log/libp2p_logger.d.ts +5 -2
  228. package/dest/log/libp2p_logger.d.ts.map +1 -1
  229. package/dest/log/libp2p_logger.js +14 -4
  230. package/dest/log/log-filters.d.ts +17 -4
  231. package/dest/log/log-filters.d.ts.map +1 -1
  232. package/dest/log/log-filters.js +26 -12
  233. package/dest/log/log-levels.d.ts +1 -1
  234. package/dest/log/log_fn.d.ts +1 -1
  235. package/dest/log/noir_debug_log_util.d.ts +1 -1
  236. package/dest/log/pino-logger-server.d.ts +9 -0
  237. package/dest/log/pino-logger-server.d.ts.map +1 -0
  238. package/dest/log/pino-logger-server.js +18 -0
  239. package/dest/log/pino-logger.d.ts +38 -9
  240. package/dest/log/pino-logger.d.ts.map +1 -1
  241. package/dest/log/pino-logger.js +122 -29
  242. package/dest/message/index.d.ts +1 -1
  243. package/dest/message/index.d.ts.map +1 -1
  244. package/dest/mutex/index.d.ts +1 -1
  245. package/dest/mutex/index.d.ts.map +1 -1
  246. package/dest/mutex/mutex_database.d.ts +1 -1
  247. package/dest/noir/index.d.ts +1 -1
  248. package/dest/noir/noir_package_config.d.ts +9 -9
  249. package/dest/number/index.d.ts +1 -1
  250. package/dest/profiler/index.d.ts +1 -1
  251. package/dest/profiler/profiler.d.ts +1 -1
  252. package/dest/promise/index.d.ts +1 -1
  253. package/dest/promise/running-promise.d.ts +1 -1
  254. package/dest/promise/running-promise.d.ts.map +1 -1
  255. package/dest/promise/utils.d.ts +1 -1
  256. package/dest/queue/base_memory_queue.d.ts +2 -2
  257. package/dest/queue/base_memory_queue.d.ts.map +1 -1
  258. package/dest/queue/batch_queue.d.ts +1 -1
  259. package/dest/queue/batch_queue.d.ts.map +1 -1
  260. package/dest/queue/bounded_serial_queue.d.ts +1 -1
  261. package/dest/queue/bounded_serial_queue.d.ts.map +1 -1
  262. package/dest/queue/fifo_memory_queue.d.ts +1 -1
  263. package/dest/queue/fifo_memory_queue.d.ts.map +1 -1
  264. package/dest/queue/index.d.ts +1 -1
  265. package/dest/queue/priority_memory_queue.d.ts +1 -1
  266. package/dest/queue/priority_memory_queue.d.ts.map +1 -1
  267. package/dest/queue/priority_queue.d.ts +1 -1
  268. package/dest/queue/priority_queue.d.ts.map +1 -1
  269. package/dest/queue/semaphore.d.ts +5 -1
  270. package/dest/queue/semaphore.d.ts.map +1 -1
  271. package/dest/queue/serial_queue.d.ts +1 -1
  272. package/dest/queue/serial_queue.d.ts.map +1 -1
  273. package/dest/retry/index.d.ts +11 -1
  274. package/dest/retry/index.d.ts.map +1 -1
  275. package/dest/retry/index.js +11 -0
  276. package/dest/running-promise/index.d.ts +1 -1
  277. package/dest/schemas/api.d.ts +1 -1
  278. package/dest/schemas/index.d.ts +1 -1
  279. package/dest/schemas/parse.d.ts +1 -1
  280. package/dest/schemas/schemas.d.ts +15 -17
  281. package/dest/schemas/schemas.d.ts.map +1 -1
  282. package/dest/schemas/schemas.js +14 -10
  283. package/dest/schemas/types.d.ts +31 -1
  284. package/dest/schemas/types.d.ts.map +1 -1
  285. package/dest/schemas/types.js +25 -1
  286. package/dest/schemas/utils.d.ts +4 -4
  287. package/dest/schemas/utils.d.ts.map +1 -1
  288. package/dest/schemas/utils.js +15 -5
  289. package/dest/serialize/buffer_reader.d.ts +14 -4
  290. package/dest/serialize/buffer_reader.d.ts.map +1 -1
  291. package/dest/serialize/buffer_reader.js +26 -4
  292. package/dest/serialize/field_reader.d.ts +2 -2
  293. package/dest/serialize/field_reader.d.ts.map +1 -1
  294. package/dest/serialize/field_reader.js +1 -1
  295. package/dest/serialize/free_funcs.d.ts +2 -2
  296. package/dest/serialize/free_funcs.d.ts.map +1 -1
  297. package/dest/serialize/free_funcs.js +1 -1
  298. package/dest/serialize/index.d.ts +1 -1
  299. package/dest/serialize/serialize.d.ts +20 -2
  300. package/dest/serialize/serialize.d.ts.map +1 -1
  301. package/dest/serialize/serialize.js +32 -1
  302. package/dest/serialize/type_registry.d.ts +1 -1
  303. package/dest/serialize/type_registry.d.ts.map +1 -1
  304. package/dest/serialize/types.d.ts +1 -1
  305. package/dest/sleep/index.d.ts +4 -1
  306. package/dest/sleep/index.d.ts.map +1 -1
  307. package/dest/sleep/index.js +14 -1
  308. package/dest/string/index.d.ts +1 -1
  309. package/dest/testing/files/index.d.ts +2 -1
  310. package/dest/testing/files/index.d.ts.map +1 -1
  311. package/dest/testing/files/index.js +1 -1
  312. package/dest/testing/formatting.d.ts +1 -1
  313. package/dest/testing/index.d.ts +1 -1
  314. package/dest/testing/port_allocator.d.ts +1 -1
  315. package/dest/testing/snapshot_serializer.d.ts +1 -1
  316. package/dest/testing/test_data.d.ts +1 -1
  317. package/dest/timer/date.d.ts +26 -1
  318. package/dest/timer/date.d.ts.map +1 -1
  319. package/dest/timer/date.js +36 -0
  320. package/dest/timer/elapsed.d.ts +1 -1
  321. package/dest/timer/index.d.ts +1 -1
  322. package/dest/timer/timeout.d.ts +1 -1
  323. package/dest/timer/timeout.d.ts.map +1 -1
  324. package/dest/timer/timer.d.ts +1 -1
  325. package/dest/timer/timer.d.ts.map +1 -1
  326. package/dest/transport/dispatch/create_dispatch_fn.d.ts +1 -1
  327. package/dest/transport/dispatch/create_dispatch_fn.d.ts.map +1 -1
  328. package/dest/transport/dispatch/create_dispatch_proxy.d.ts +1 -1
  329. package/dest/transport/dispatch/messages.d.ts +1 -1
  330. package/dest/transport/index.d.ts +1 -1
  331. package/dest/transport/interface/connector.d.ts +1 -1
  332. package/dest/transport/interface/listener.d.ts +1 -1
  333. package/dest/transport/interface/socket.d.ts +1 -1
  334. package/dest/transport/interface/transferable.d.ts +1 -1
  335. package/dest/transport/node/index.d.ts +1 -1
  336. package/dest/transport/node/node_connector.d.ts +1 -1
  337. package/dest/transport/node/node_connector.d.ts.map +1 -1
  338. package/dest/transport/node/node_connector_socket.d.ts +1 -1
  339. package/dest/transport/node/node_connector_socket.d.ts.map +1 -1
  340. package/dest/transport/node/node_listener.d.ts +1 -1
  341. package/dest/transport/node/node_listener.d.ts.map +1 -1
  342. package/dest/transport/node/node_listener_socket.d.ts +1 -1
  343. package/dest/transport/node/node_listener_socket.d.ts.map +1 -1
  344. package/dest/transport/transport_client.d.ts +1 -1
  345. package/dest/transport/transport_client.d.ts.map +1 -1
  346. package/dest/transport/transport_client.js +2 -2
  347. package/dest/transport/transport_server.d.ts +1 -10
  348. package/dest/transport/transport_server.d.ts.map +1 -1
  349. package/dest/trees/balanced_merkle_tree_root.d.ts +17 -0
  350. package/dest/trees/balanced_merkle_tree_root.d.ts.map +1 -0
  351. package/dest/trees/balanced_merkle_tree_root.js +51 -0
  352. package/dest/trees/hasher.d.ts +3 -1
  353. package/dest/trees/hasher.d.ts.map +1 -1
  354. package/dest/trees/hasher.js +10 -5
  355. package/dest/trees/index.d.ts +4 -3
  356. package/dest/trees/index.d.ts.map +1 -1
  357. package/dest/trees/index.js +3 -2
  358. package/dest/trees/indexed_merkle_tree.d.ts +1 -1
  359. package/dest/trees/indexed_merkle_tree.d.ts.map +1 -1
  360. package/dest/trees/indexed_merkle_tree.js +1 -1
  361. package/dest/trees/indexed_merkle_tree_calculator.d.ts +1 -1
  362. package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -1
  363. package/dest/trees/indexed_tree_leaf.d.ts +1 -1
  364. package/dest/trees/membership_witness.d.ts +7 -18
  365. package/dest/trees/membership_witness.d.ts.map +1 -1
  366. package/dest/trees/membership_witness.js +10 -1
  367. package/dest/trees/merkle_tree.d.ts +1 -1
  368. package/dest/trees/merkle_tree.d.ts.map +1 -1
  369. package/dest/trees/merkle_tree_calculator.d.ts +2 -12
  370. package/dest/trees/merkle_tree_calculator.d.ts.map +1 -1
  371. package/dest/trees/merkle_tree_calculator.js +2 -32
  372. package/dest/trees/sibling_path.d.ts +5 -38
  373. package/dest/trees/sibling_path.d.ts.map +1 -1
  374. package/dest/trees/sibling_path.js +3 -3
  375. package/dest/trees/unbalanced_merkle_tree_calculator.d.ts +6 -6
  376. package/dest/trees/unbalanced_merkle_tree_calculator.d.ts.map +1 -1
  377. package/dest/trees/unbalanced_merkle_tree_calculator.js +34 -42
  378. package/dest/trees/unbalanced_merkle_tree_root.d.ts +28 -0
  379. package/dest/trees/unbalanced_merkle_tree_root.d.ts.map +1 -0
  380. package/dest/trees/unbalanced_merkle_tree_root.js +84 -0
  381. package/dest/trees/unbalanced_tree_store.d.ts +5 -1
  382. package/dest/trees/unbalanced_tree_store.d.ts.map +1 -1
  383. package/dest/trees/unbalanced_tree_store.js +49 -1
  384. package/dest/types/index.d.ts +6 -2
  385. package/dest/types/index.d.ts.map +1 -1
  386. package/dest/types/index.js +6 -0
  387. package/dest/url/index.d.ts +1 -1
  388. package/dest/validation/index.d.ts +1 -1
  389. package/package.json +50 -9
  390. package/src/array/array.ts +0 -16
  391. package/src/array/index.ts +1 -0
  392. package/src/array/sorted_array.ts +138 -0
  393. package/src/branded-types/block_number.ts +117 -0
  394. package/src/branded-types/checkpoint_number.ts +115 -0
  395. package/src/branded-types/epoch.ts +88 -0
  396. package/src/branded-types/index.ts +7 -0
  397. package/src/branded-types/index_within_checkpoint.ts +88 -0
  398. package/src/branded-types/slot.ts +88 -0
  399. package/src/branded-types/types.ts +2 -0
  400. package/src/buffer/buffer16.ts +2 -2
  401. package/src/buffer/buffer32.ts +2 -2
  402. package/src/collection/array.ts +52 -0
  403. package/src/config/env_var.ts +82 -15
  404. package/src/config/index.ts +39 -6
  405. package/src/config/network_config.ts +2 -0
  406. package/src/config/network_name.ts +4 -1
  407. package/src/config/parse-env.ts +4 -0
  408. package/src/crypto/aes128/index.ts +2 -2
  409. package/src/crypto/bls/bn254_keystore.ts +1 -1
  410. package/src/crypto/bls/index.ts +1 -1
  411. package/src/crypto/bn254/index.ts +50 -156
  412. package/src/crypto/ecdsa/index.ts +4 -4
  413. package/src/crypto/ecdsa/signature.ts +2 -2
  414. package/src/crypto/grumpkin/index.ts +8 -6
  415. package/src/crypto/keys/index.ts +2 -2
  416. package/src/crypto/pedersen/pedersen.wasm.ts +4 -4
  417. package/src/crypto/poseidon/index.ts +14 -24
  418. package/src/crypto/random/randomness_singleton.ts +6 -4
  419. package/src/crypto/schnorr/index.ts +5 -4
  420. package/src/crypto/schnorr/signature.ts +2 -2
  421. package/src/crypto/secp256k1/index.ts +3 -3
  422. package/src/crypto/sha256/index.ts +1 -1
  423. package/src/crypto/sha512/index.ts +1 -1
  424. package/src/crypto/signature/index.ts +1 -1
  425. package/src/crypto/sync/index.ts +1 -1
  426. package/src/crypto/sync/pedersen/index.ts +1 -1
  427. package/src/crypto/sync/poseidon/index.ts +1 -10
  428. package/src/{fields/bls12_fields.ts → curves/bls12/field.ts} +6 -6
  429. package/src/curves/bls12/index.ts +2 -0
  430. package/src/{fields/bls12_point.ts → curves/bls12/point.ts} +7 -7
  431. package/src/{fields/fields.ts → curves/bn254/field.ts} +53 -56
  432. package/src/curves/bn254/index.ts +2 -0
  433. package/src/curves/bn254/point.ts +170 -0
  434. package/src/curves/grumpkin/index.ts +11 -0
  435. package/src/{fields → curves/grumpkin}/point.ts +26 -7
  436. package/src/eth-address/index.ts +27 -2
  437. package/src/iterator/filter.ts +11 -0
  438. package/src/iterator/index.ts +1 -0
  439. package/src/jest/setup.mjs +31 -1
  440. package/src/json-rpc/client/safe_json_rpc_client.ts +2 -0
  441. package/src/json-rpc/client/undici.ts +21 -3
  442. package/src/json-rpc/server/api_key_auth.ts +63 -0
  443. package/src/json-rpc/server/index.ts +1 -0
  444. package/src/json-rpc/server/safe_json_rpc_server.ts +1 -1
  445. package/src/log/bigint-utils.ts +22 -0
  446. package/src/log/gcloud-logger-config.ts +5 -0
  447. package/src/log/libp2p_logger.ts +12 -5
  448. package/src/log/log-filters.ts +29 -11
  449. package/src/log/pino-logger-server.ts +25 -0
  450. package/src/log/pino-logger.ts +144 -39
  451. package/src/queue/base_memory_queue.ts +1 -1
  452. package/src/queue/semaphore.ts +5 -0
  453. package/src/retry/index.ts +18 -0
  454. package/src/schemas/schemas.ts +24 -13
  455. package/src/schemas/types.ts +33 -0
  456. package/src/schemas/utils.ts +21 -8
  457. package/src/serialize/buffer_reader.ts +36 -9
  458. package/src/serialize/field_reader.ts +1 -1
  459. package/src/serialize/free_funcs.ts +1 -1
  460. package/src/serialize/serialize.ts +33 -1
  461. package/src/sleep/index.ts +16 -1
  462. package/src/testing/files/index.ts +1 -1
  463. package/src/timer/date.ts +52 -0
  464. package/src/transport/transport_client.ts +2 -2
  465. package/src/trees/balanced_merkle_tree_root.ts +68 -0
  466. package/src/trees/hasher.ts +9 -0
  467. package/src/trees/index.ts +3 -2
  468. package/src/trees/indexed_merkle_tree.ts +1 -1
  469. package/src/trees/membership_witness.ts +9 -1
  470. package/src/trees/merkle_tree_calculator.ts +2 -35
  471. package/src/trees/sibling_path.ts +3 -3
  472. package/src/trees/unbalanced_merkle_tree_calculator.ts +32 -50
  473. package/src/trees/unbalanced_merkle_tree_root.ts +115 -0
  474. package/src/trees/unbalanced_tree_store.ts +57 -2
  475. package/src/types/index.ts +11 -1
  476. package/dest/crypto/bn254/bn254_utils.d.ts +0 -39
  477. package/dest/crypto/bn254/bn254_utils.d.ts.map +0 -1
  478. package/dest/crypto/bn254/bn254_utils.js +0 -56
  479. package/dest/crypto/index.d.ts +0 -17
  480. package/dest/crypto/index.d.ts.map +0 -1
  481. package/dest/crypto/index.js +0 -16
  482. package/dest/fields/bls12_fields.d.ts.map +0 -1
  483. package/dest/fields/bls12_point.d.ts.map +0 -1
  484. package/dest/fields/coordinate.d.ts +0 -66
  485. package/dest/fields/coordinate.d.ts.map +0 -1
  486. package/dest/fields/coordinate.js +0 -96
  487. package/dest/fields/fields.d.ts +0 -179
  488. package/dest/fields/fields.d.ts.map +0 -1
  489. package/dest/fields/index.d.ts +0 -6
  490. package/dest/fields/index.d.ts.map +0 -1
  491. package/dest/fields/index.js +0 -5
  492. package/dest/fields/point.d.ts.map +0 -1
  493. package/dest/index.d.ts +0 -30
  494. package/dest/index.d.ts.map +0 -1
  495. package/dest/index.js +0 -30
  496. package/dest/json-rpc/server/telemetry.d.ts +0 -2
  497. package/dest/json-rpc/server/telemetry.d.ts.map +0 -1
  498. package/dest/json-rpc/server/telemetry.js +0 -0
  499. package/dest/trees/unbalanced_merkle_tree.d.ts +0 -28
  500. package/dest/trees/unbalanced_merkle_tree.d.ts.map +0 -1
  501. package/dest/trees/unbalanced_merkle_tree.js +0 -99
  502. package/src/crypto/bn254/bn254_utils.ts +0 -64
  503. package/src/crypto/index.ts +0 -16
  504. package/src/fields/coordinate.ts +0 -104
  505. package/src/fields/index.ts +0 -5
  506. package/src/index.ts +0 -30
  507. package/src/json-rpc/server/telemetry.ts +0 -0
  508. package/src/trees/unbalanced_merkle_tree.ts +0 -111
package/src/timer/date.ts CHANGED
@@ -9,6 +9,10 @@ export class DateProvider {
9
9
  public nowInSeconds(): number {
10
10
  return Math.floor(this.now() / 1000);
11
11
  }
12
+
13
+ public nowAsDate(): Date {
14
+ return new Date(this.now());
15
+ }
12
16
  }
13
17
 
14
18
  /** Returns current datetime and allows to override it. */
@@ -27,4 +31,52 @@ export class TestDateProvider extends DateProvider {
27
31
  this.offset = timeMs - Date.now();
28
32
  this.logger.warn(`Time set to ${new Date(timeMs).toISOString()}`, { offset: this.offset, timeMs });
29
33
  }
34
+
35
+ /** Resets the time back to real time (offset = 0). */
36
+ public reset() {
37
+ this.offset = 0;
38
+ this.logger.warn('Time reset to real time');
39
+ }
40
+
41
+ /** Advances the time by the given number of seconds. */
42
+ public advanceTime(seconds: number) {
43
+ this.offset += seconds * 1000;
44
+ }
45
+ }
46
+
47
+ /**
48
+ * A date provider for tests that only advances time via explicit advanceTime() calls.
49
+ * Unlike TestDateProvider, this does NOT track real time progression - time is completely
50
+ * frozen until explicitly advanced. This eliminates flakiness from tests taking
51
+ * varying amounts of real time to execute.
52
+ */
53
+ export class ManualDateProvider extends DateProvider {
54
+ private currentTimeMs: number;
55
+
56
+ /**
57
+ * @param initialTimeMs - Initial time in milliseconds. Defaults to a round timestamp for easy visualization.
58
+ */
59
+ constructor(initialTimeMs: number = Date.UTC(2025, 0, 1, 0, 0, 0)) {
60
+ super();
61
+ this.currentTimeMs = initialTimeMs;
62
+ }
63
+
64
+ public override now(): number {
65
+ return this.currentTimeMs;
66
+ }
67
+
68
+ /** Sets the current time to the given timestamp in milliseconds. */
69
+ public setTime(timeMs: number) {
70
+ this.currentTimeMs = timeMs;
71
+ }
72
+
73
+ /** Advances the time by the given number of seconds. */
74
+ public advanceTime(seconds: number) {
75
+ this.currentTimeMs += seconds * 1000;
76
+ }
77
+
78
+ /** Advances the time by the given number of milliseconds. */
79
+ public advanceTimeMs(ms: number) {
80
+ this.currentTimeMs += ms;
81
+ }
30
82
  }
@@ -91,7 +91,7 @@ export class TransportClient<Payload> extends EventEmitter {
91
91
  }
92
92
  const msgId = this.msgId++;
93
93
  const msg = { msgId, payload };
94
- log.debug(format(`->`, msg));
94
+ log.trace(format(`->`, msg));
95
95
  return new Promise<any>((resolve, reject) => {
96
96
  this.pendingRequests.push({ resolve, reject, msgId });
97
97
  this.socket!.send(msg, transfer).catch(reject);
@@ -111,7 +111,7 @@ export class TransportClient<Payload> extends EventEmitter {
111
111
  this.close();
112
112
  return;
113
113
  }
114
- log.debug(format(`<-`, msg));
114
+ log.trace(format(`<-`, msg));
115
115
  if (isEventMessage(msg)) {
116
116
  this.emit('event_msg', msg.payload);
117
117
  return;
@@ -0,0 +1,68 @@
1
+ import { poseidonMerkleHash, shaMerkleHash } from './hasher.js';
2
+
3
+ export const computeBalancedShaRoot = (leaves: Buffer[]) => computeBalancedMerkleTreeRoot(leaves);
4
+
5
+ export const computeBalancedPoseidonRoot = async (leaves: Buffer[]) =>
6
+ await computeBalancedMerkleTreeRootAsync(leaves, poseidonMerkleHash);
7
+
8
+ /**
9
+ * Computes the Merkle root with the provided leaves **synchronously**.
10
+ * This method uses a synchronous hash function (defaults to `sha256Trunc`).
11
+ *
12
+ * @throws If the number of leaves is not a power of two.
13
+ */
14
+ export function computeBalancedMerkleTreeRoot(leaves: Buffer[], hasher = shaMerkleHash): Buffer {
15
+ const height = getTreeHeight(leaves);
16
+ let nodes = leaves.slice();
17
+
18
+ for (let i = 0; i < height; ++i) {
19
+ let j = 0;
20
+ for (; j < nodes.length / 2; ++j) {
21
+ const l = nodes[j * 2];
22
+ const r = nodes[j * 2 + 1];
23
+ nodes[j] = hasher(l, r);
24
+ }
25
+ nodes = nodes.slice(0, j);
26
+ }
27
+
28
+ return nodes[0];
29
+ }
30
+
31
+ /**
32
+ * Computes the Merkle root with the provided leaves **asynchronously**.
33
+ * This method uses an asynchronous hash function (defaults to `poseidon2Hash`).
34
+ *
35
+ * @throws If the number of leaves is not a power of two.
36
+ */
37
+ export async function computeBalancedMerkleTreeRootAsync(
38
+ leaves: Buffer[],
39
+ hasher = poseidonMerkleHash,
40
+ ): Promise<Buffer> {
41
+ const height = getTreeHeight(leaves);
42
+ let nodes = leaves.slice();
43
+
44
+ for (let i = 0; i < height; ++i) {
45
+ let j = 0;
46
+ for (; j < nodes.length / 2; ++j) {
47
+ const l = nodes[j * 2];
48
+ const r = nodes[j * 2 + 1];
49
+ nodes[j] = await hasher(l, r);
50
+ }
51
+ nodes = nodes.slice(0, j);
52
+ }
53
+
54
+ return nodes[0];
55
+ }
56
+
57
+ function getTreeHeight(leaves: Buffer[]) {
58
+ if (leaves.length === 0) {
59
+ throw new Error('Cannot compute a Merkle root with no leaves');
60
+ }
61
+
62
+ const height = Math.log2(leaves.length);
63
+ if (!Number.isInteger(height)) {
64
+ throw new Error('Cannot compute a Merkle root with a non-power-of-two number of leaves');
65
+ }
66
+
67
+ return height;
68
+ }
@@ -1,3 +1,6 @@
1
+ import { poseidon2Hash } from '../crypto/poseidon/index.js';
2
+ import { sha256Trunc } from '../crypto/sha256/index.js';
3
+
1
4
  /**
2
5
  * Defines hasher interface used by Merkle trees.
3
6
  */
@@ -37,3 +40,9 @@ export interface AsyncHasher {
37
40
  */
38
41
  hashInputs(inputs: Buffer[]): Promise<Buffer<ArrayBuffer>>;
39
42
  }
43
+
44
+ export const shaMerkleHash: Hasher['hash'] = (left: Buffer, right: Buffer) =>
45
+ sha256Trunc(Buffer.concat([left, right])) as Buffer<ArrayBuffer>;
46
+
47
+ export const poseidonMerkleHash: AsyncHasher['hash'] = async (left: Buffer, right: Buffer) =>
48
+ (await poseidon2Hash([left, right])).toBuffer() as Buffer<ArrayBuffer>;
@@ -1,5 +1,4 @@
1
- export * from './unbalanced_merkle_tree.js';
2
- export * from './unbalanced_tree_store.js';
1
+ export * from './balanced_merkle_tree_root.js';
3
2
  export * from './merkle_tree_calculator.js';
4
3
  export * from './merkle_tree.js';
5
4
  export * from './indexed_merkle_tree_calculator.js';
@@ -9,3 +8,5 @@ export * from './membership_witness.js';
9
8
  export * from './hasher.js';
10
9
  export * from './indexed_tree_leaf.js';
11
10
  export * from './unbalanced_merkle_tree_calculator.js';
11
+ export * from './unbalanced_merkle_tree_root.js';
12
+ export * from './unbalanced_tree_store.js';
@@ -1,4 +1,4 @@
1
- import { Fr } from '../fields/index.js';
1
+ import { Fr } from '../curves/bn254/index.js';
2
2
  import { assertLength } from '../serialize/index.js';
3
3
  import type { IndexedTreeLeafPreimage } from './indexed_tree_leaf.js';
4
4
  import { MembershipWitness } from './membership_witness.js';
@@ -1,6 +1,6 @@
1
1
  import { assertMemberLength } from '../array/array.js';
2
2
  import { toBigIntBE, toBufferBE } from '../bigint-buffer/index.js';
3
- import { Fr } from '../fields/fields.js';
3
+ import { Fr } from '../curves/bn254/field.js';
4
4
  import { schemas } from '../schemas/schemas.js';
5
5
  import { BufferReader, type Tuple, serializeToBuffer } from '../serialize/index.js';
6
6
  import type { SiblingPath } from './sibling_path.js';
@@ -38,6 +38,14 @@ export class MembershipWitness<N extends number> {
38
38
  return [new Fr(this.leafIndex), ...this.siblingPath];
39
39
  }
40
40
 
41
+ /**
42
+ * Returns a representation of the membership witness as expected by intrinsic Noir deserialization.
43
+ */
44
+ public toNoirRepresentation(): (string | string[])[] {
45
+ // TODO(#12874): remove the stupid as string conversion by modifying ForeignCallOutput type in acvm.js
46
+ return [new Fr(this.leafIndex).toString() as string, this.siblingPath.map(fr => fr.toString()) as string[]];
47
+ }
48
+
41
49
  static schemaFor<N extends number>(size: N) {
42
50
  return schemas.Buffer.transform(b => MembershipWitness.fromBuffer(b, size));
43
51
  }
@@ -1,4 +1,4 @@
1
- import { pedersenHash, sha256Trunc } from '@aztec/foundation/crypto';
1
+ import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
2
2
 
3
3
  import type { AsyncHasher } from './hasher.js';
4
4
  import { MerkleTree } from './merkle_tree.js';
@@ -19,7 +19,7 @@ export class MerkleTreeCalculator {
19
19
  height: number,
20
20
  zeroLeaf: Buffer = Buffer.alloc(32),
21
21
  hasher = async (left: Buffer, right: Buffer) =>
22
- (await pedersenHash([left, right])).toBuffer() as Buffer<ArrayBuffer>,
22
+ (await poseidon2Hash([left, right])).toBuffer() as Buffer<ArrayBuffer>,
23
23
  ) {
24
24
  const zeroHashes = [zeroLeaf];
25
25
  for (let i = 0; i < height; i++) {
@@ -69,37 +69,4 @@ export class MerkleTreeCalculator {
69
69
 
70
70
  return leaves[0];
71
71
  }
72
-
73
- /**
74
- * Computes the Merkle root with the provided leaves **synchronously**.
75
- *
76
- * This method uses a synchronous hash function (defaults to `sha256Trunc`) and **does not** allow for padding.
77
- * If the number of leaves is not a power of two, it throws an error.
78
- * This contrasts with the above non-static async method `computeTreeRoot`, which can handle any number of leaves by
79
- * padding with zero hashes.
80
- */
81
- static computeTreeRootSync(leaves: Buffer[], hasher = sha256Trunc): Buffer {
82
- if (leaves.length === 0) {
83
- throw new Error('Cannot compute a Merkle root with no leaves');
84
- }
85
-
86
- const height = Math.log2(leaves.length);
87
- if (!Number.isInteger(height)) {
88
- throw new Error('Cannot compute a Merkle root with a non-power-of-two number of leaves');
89
- }
90
-
91
- let nodes = leaves.slice();
92
-
93
- for (let i = 0; i < height; ++i) {
94
- let j = 0;
95
- for (; j < nodes.length / 2; ++j) {
96
- const l = nodes[j * 2];
97
- const r = nodes[j * 2 + 1];
98
- nodes[j] = hasher(Buffer.concat([l, r]));
99
- }
100
- nodes = nodes.slice(0, j);
101
- }
102
-
103
- return nodes[0];
104
- }
105
72
  }
@@ -1,6 +1,6 @@
1
1
  import { makeTuple } from '../array/array.js';
2
- import { pedersenHash } from '../crypto/index.js';
3
- import { Fr } from '../fields/index.js';
2
+ import { poseidon2Hash } from '../crypto/poseidon/index.js';
3
+ import { Fr } from '../curves/bn254/index.js';
4
4
  import { schemas } from '../schemas/index.js';
5
5
  import {
6
6
  type Tuple,
@@ -172,7 +172,7 @@ export async function computeRootFromSiblingPath(
172
172
  leaf: Buffer,
173
173
  siblingPath: Buffer[],
174
174
  index: number,
175
- hasher = async (left: Buffer, right: Buffer) => (await pedersenHash([left, right])).toBuffer(),
175
+ hasher = async (left: Buffer, right: Buffer) => (await poseidon2Hash([left, right])).toBuffer(),
176
176
  ) {
177
177
  let result = leaf;
178
178
  for (const sibling of siblingPath) {
@@ -1,17 +1,7 @@
1
- import { sha256Trunc } from '../crypto/index.js';
2
- import type { Hasher } from './hasher.js';
1
+ import { type Hasher, shaMerkleHash } from './hasher.js';
3
2
  import { SiblingPath } from './sibling_path.js';
4
3
  import { type TreeNodeLocation, UnbalancedTreeStore } from './unbalanced_tree_store.js';
5
4
 
6
- export function computeCompressedUnbalancedMerkleTreeRoot(
7
- leaves: Buffer[],
8
- valueToCompress = Buffer.alloc(32),
9
- hasher?: Hasher['hash'],
10
- ): Buffer {
11
- const calculator = UnbalancedMerkleTreeCalculator.create(leaves, valueToCompress, hasher);
12
- return calculator.getRoot();
13
- }
14
-
15
5
  interface TreeNode {
16
6
  value: Buffer;
17
7
  leafIndex?: number;
@@ -32,12 +22,9 @@ export class UnbalancedMerkleTreeCalculator {
32
22
  public constructor(
33
23
  private readonly leaves: Buffer[],
34
24
  private readonly valueToCompress: Buffer,
25
+ private readonly emptyRoot: Buffer,
35
26
  private readonly hasher: Hasher['hash'],
36
27
  ) {
37
- if (leaves.length === 0) {
38
- throw Error('Cannot create a compressed unbalanced tree with 0 leaves.');
39
- }
40
-
41
28
  this.store = new UnbalancedTreeStore(leaves.length);
42
29
  this.buildTree();
43
30
  }
@@ -45,9 +32,10 @@ export class UnbalancedMerkleTreeCalculator {
45
32
  static create(
46
33
  leaves: Buffer[],
47
34
  valueToCompress = Buffer.alloc(0),
48
- hasher = (left: Buffer, right: Buffer) => sha256Trunc(Buffer.concat([left, right])) as Buffer<ArrayBuffer>,
35
+ emptyRoot = Buffer.alloc(32),
36
+ hasher = shaMerkleHash,
49
37
  ) {
50
- return new UnbalancedMerkleTreeCalculator(leaves, valueToCompress, hasher);
38
+ return new UnbalancedMerkleTreeCalculator(leaves, valueToCompress, emptyRoot, hasher);
51
39
  }
52
40
 
53
41
  /**
@@ -113,8 +101,8 @@ export class UnbalancedMerkleTreeCalculator {
113
101
  // Start with the leaves that are not compressed.
114
102
  let toProcess = this.leafLocations.filter((_, i) => !this.leaves[i].equals(this.valueToCompress));
115
103
  if (!toProcess.length) {
116
- // All leaves are compressed. Set 0 to the root.
117
- this.store.setNode({ level: 0, index: 0 }, { value: Buffer.alloc(32) });
104
+ // All leaves are compressed. Set empty root to the root.
105
+ this.store.setNode({ level: 0, index: 0 }, { value: this.emptyRoot });
118
106
  return;
119
107
  }
120
108
 
@@ -138,10 +126,7 @@ export class UnbalancedMerkleTreeCalculator {
138
126
  const shouldShiftUp = !sibling || sibling.value.equals(this.valueToCompress);
139
127
  if (shouldShiftUp) {
140
128
  // The node becomes the parent if the sibling is a compressed leaf.
141
- const isLeaf = this.shiftNodeUp(location, parentLocation);
142
- if (!isLeaf) {
143
- this.shiftChildrenUp(location);
144
- }
129
+ this.shiftNodeUp(location, parentLocation);
145
130
  } else {
146
131
  // Hash the value with the (right) sibling and update the parent node.
147
132
  const node = this.store.getNode(location)!;
@@ -157,38 +142,35 @@ export class UnbalancedMerkleTreeCalculator {
157
142
  }
158
143
  }
159
144
 
160
- private shiftNodeUp(fromLocation: TreeNodeLocation, toLocation: TreeNodeLocation): boolean {
161
- const node = this.store.getNode(fromLocation)!;
162
-
163
- this.store.setNode(toLocation, node);
164
-
165
- const isLeaf = node.leafIndex !== undefined;
166
- if (isLeaf) {
167
- // Update the location if the node is a leaf.
168
- this.leafLocations[node.leafIndex!] = toLocation;
145
+ private shiftNodeUp(from: TreeNodeLocation, to: TreeNodeLocation) {
146
+ // Collect all nodes that need to shift.
147
+ const nodesToShift = this.collectNodesToShift(from, to);
148
+ // Move all nodes to their new locations.
149
+ for (const { node, newLocation } of nodesToShift) {
150
+ this.store.setNode(newLocation, node);
151
+ if (node.leafIndex !== undefined) {
152
+ this.leafLocations[node.leafIndex] = newLocation;
153
+ }
169
154
  }
170
-
171
- return isLeaf;
172
155
  }
173
156
 
174
- private shiftChildrenUp(parent: TreeNodeLocation) {
175
- const [left, right] = this.store.getChildLocations(parent);
176
-
177
- const level = parent.level;
178
- const groupSize = 2 ** level;
179
- const computeNewLocation = (index: number) => ({
180
- level,
181
- index: Math.floor(index / (groupSize * 2)) * groupSize + (index % groupSize),
182
- });
157
+ private collectNodesToShift(from: TreeNodeLocation, to: TreeNodeLocation) {
158
+ const node = this.store.getNode(from);
159
+ if (!node) {
160
+ return [];
161
+ }
183
162
 
184
- const isLeftLeaf = this.shiftNodeUp(left, computeNewLocation(left.index));
185
- const isRightLeaf = this.shiftNodeUp(right, computeNewLocation(right.index));
163
+ let result = [{ node, newLocation: to }];
186
164
 
187
- if (!isLeftLeaf) {
188
- this.shiftChildrenUp(left);
189
- }
190
- if (!isRightLeaf) {
191
- this.shiftChildrenUp(right);
165
+ // If not a leaf, collect its children.
166
+ if (node.leafIndex === undefined) {
167
+ const [leftChild, rightChild] = this.store.getChildLocations(from);
168
+ const [leftChildNew, rightChildNew] = this.store.getChildLocations(to);
169
+ result = result
170
+ .concat(this.collectNodesToShift(leftChild, leftChildNew))
171
+ .concat(this.collectNodesToShift(rightChild, rightChildNew));
192
172
  }
173
+
174
+ return result;
193
175
  }
194
176
  }
@@ -0,0 +1,115 @@
1
+ import { computeBalancedMerkleTreeRoot, computeBalancedMerkleTreeRootAsync } from './balanced_merkle_tree_root.js';
2
+ import { poseidonMerkleHash, shaMerkleHash } from './hasher.js';
3
+ import { UnbalancedMerkleTreeCalculator } from './unbalanced_merkle_tree_calculator.js';
4
+
5
+ export const computeUnbalancedShaRoot = (leaves: Buffer[]) => computeUnbalancedMerkleTreeRoot(leaves, shaMerkleHash);
6
+
7
+ export const computeUnbalancedPoseidonRoot = async (leaves: Buffer[]) =>
8
+ await computeUnbalancedMerkleTreeRootAsync(leaves, poseidonMerkleHash);
9
+
10
+ export const computeWonkyShaRoot = (leaves: Buffer[]) => computeWonkyMerkleTreeRoot(leaves);
11
+
12
+ /**
13
+ * Computes the Merkle root of an unbalanced tree.
14
+ *
15
+ * Unlike a balanced Merkle tree, which requires the number of leaves to be a power of two, an unbalanced tree can have
16
+ * any number of leaves.
17
+ *
18
+ * The tree is constructed by iteratively extracting the smallest power-of-two-sized subtrees from **right to left**.
19
+ * For each such subtree, it computes the subtree root and then combines all subtree roots (again from right to left)
20
+ * into a single root using the provided hash function.
21
+ *
22
+ * Note: We need the final tree to be as shallow as possible, to minimize the size of the sibling path required to prove
23
+ * membership of a leaf. Therefor, the computation proceeds from right to left - smaller subtrees must always be
24
+ * combined before being merged with a larger sibling on their left.
25
+ *
26
+ * For example, consider an unbalanced tree made of three subtrees of sizes 2, 4, and 8. If we combine the size-2 and
27
+ * size-4 subtrees first (producing a subtree of depth 3), and then merge it with the size-8 subtree (also depth 3), the
28
+ * resulting tree has a maximum depth of 4.
29
+ *
30
+ * But if we instead combine the size-4 and size-8 subtrees first (depth 4), and then merge with the size-2 subtree
31
+ * (depth 1), the final tree has a depth of 5.
32
+ */
33
+ export function computeUnbalancedMerkleTreeRoot(
34
+ leaves: Buffer[],
35
+ hasher = shaMerkleHash,
36
+ emptyRoot = Buffer.alloc(32),
37
+ ): Buffer {
38
+ if (!leaves.length) {
39
+ return emptyRoot;
40
+ }
41
+
42
+ if (leaves.length === 1) {
43
+ return leaves[0];
44
+ }
45
+
46
+ let numRemainingLeaves = leaves.length;
47
+ let subtreeSize = 1;
48
+ let root: Buffer | undefined;
49
+ while (numRemainingLeaves > 1) {
50
+ if ((numRemainingLeaves & subtreeSize) !== 0) {
51
+ const subtreeLeaves = leaves.slice(numRemainingLeaves - subtreeSize, numRemainingLeaves);
52
+ const subtreeRoot = computeBalancedMerkleTreeRoot(subtreeLeaves, hasher);
53
+ if (!root) {
54
+ root = subtreeRoot;
55
+ } else {
56
+ root = hasher(subtreeRoot, root);
57
+ }
58
+
59
+ numRemainingLeaves -= subtreeSize;
60
+ }
61
+
62
+ subtreeSize *= 2;
63
+ }
64
+
65
+ return root!;
66
+ }
67
+
68
+ export async function computeUnbalancedMerkleTreeRootAsync(
69
+ leaves: Buffer[],
70
+ hasher = poseidonMerkleHash,
71
+ emptyRoot = Buffer.alloc(32),
72
+ ): Promise<Buffer> {
73
+ if (!leaves.length) {
74
+ return emptyRoot;
75
+ }
76
+
77
+ if (leaves.length === 1) {
78
+ return leaves[0];
79
+ }
80
+
81
+ let numRemainingLeaves = leaves.length;
82
+ let subtreeSize = 1;
83
+ let root: Buffer | undefined;
84
+ while (numRemainingLeaves > 1) {
85
+ if ((numRemainingLeaves & subtreeSize) !== 0) {
86
+ const subtreeLeaves = leaves.slice(numRemainingLeaves - subtreeSize, numRemainingLeaves);
87
+ const subtreeRoot = await computeBalancedMerkleTreeRootAsync(subtreeLeaves, hasher);
88
+ if (!root) {
89
+ root = subtreeRoot;
90
+ } else {
91
+ root = await hasher(subtreeRoot, root);
92
+ }
93
+
94
+ numRemainingLeaves -= subtreeSize;
95
+ }
96
+
97
+ subtreeSize *= 2;
98
+ }
99
+
100
+ return root!;
101
+ }
102
+
103
+ // A **wonky** tree is a "compressed" unbalanced Merkle tree.
104
+ // It is constructed in the same way as an unbalanced tree: by first creating the largest possible left subtree, with
105
+ // the remaining leaves forming a right subtree that follows the same process recursively.
106
+ // During construction, leaves equal to `valueToCompress` are skipped (compressed) and do not contribute to the tree.
107
+ export function computeWonkyMerkleTreeRoot(
108
+ leaves: Buffer[],
109
+ valueToCompress = Buffer.alloc(32),
110
+ emptyRoot = Buffer.alloc(32),
111
+ hasher = shaMerkleHash,
112
+ ): Buffer {
113
+ const calculator = UnbalancedMerkleTreeCalculator.create(leaves, valueToCompress, emptyRoot, hasher);
114
+ return calculator.getRoot();
115
+ }
@@ -1,5 +1,3 @@
1
- import { findLeafLevelAndIndex } from './unbalanced_merkle_tree.js';
2
-
3
1
  export interface TreeNodeLocation {
4
2
  level: number;
5
3
  index: number;
@@ -104,3 +102,60 @@ export class UnbalancedTreeStore<T> {
104
102
  return `${location.level}-${location.index}`;
105
103
  }
106
104
  }
105
+
106
+ /// Get the depth of the maximum balanced tree that can be created with the given number of leaves. The subtree will be
107
+ /// the left most subtree of the unbalanced tree with a total of `numLeaves` leaves.
108
+ ///
109
+ /// Note: All the leaves may not be used to form the tree. For example, if there are 5 leaves, the maximum depth is 2,
110
+ /// only 4 leaves are used to form a balanced tree.
111
+ function getMaxBalancedSubtreeDepth(numLeaves: number) {
112
+ return Math.floor(Math.log2(numLeaves));
113
+ }
114
+
115
+ /// Get the maximum depth of an unbalanced tree that can be created with the given number of leaves.
116
+ function getMaxUnbalancedTreeDepth(numLeaves: number) {
117
+ return Math.ceil(Math.log2(numLeaves));
118
+ }
119
+
120
+ function findPosition(
121
+ rootLevel: number,
122
+ leafLevel: number,
123
+ numLeaves: number,
124
+ indexOffset: number,
125
+ targetIndex: number,
126
+ ): { level: number; indexAtLevel: number } {
127
+ if (numLeaves <= 1) {
128
+ // Single leaf.
129
+ return { level: rootLevel, indexAtLevel: indexOffset };
130
+ }
131
+
132
+ // The largest balanced tree that can be created with the given number of leaves.
133
+ const maxBalancedTreeDepth = getMaxBalancedSubtreeDepth(numLeaves);
134
+ const numBalancedLeaves = 2 ** maxBalancedTreeDepth;
135
+ const numRemainingLeaves = numLeaves - numBalancedLeaves;
136
+
137
+ if (targetIndex < numBalancedLeaves) {
138
+ // Target is in the balanced tree.
139
+
140
+ // - If numRemainingLeaves is 0: this balanced tree is grown from the current root.
141
+ // - If numRemainingLeaves is not 0: the remaining leaves will form another tree, which will become the right child of the root.
142
+ // And the balanced tree will be the left child of the root.
143
+ // There will be an extra level between the root of the balanced tree and the current root.
144
+ const extraLevel = numRemainingLeaves ? 1 : 0;
145
+
146
+ return { level: rootLevel + maxBalancedTreeDepth + extraLevel, indexAtLevel: indexOffset + targetIndex };
147
+ } else {
148
+ // Target is in the right branch.
149
+ const rightBranchMaxLevel = getMaxUnbalancedTreeDepth(numRemainingLeaves);
150
+ const shiftedUp = leafLevel - rootLevel - rightBranchMaxLevel - 1;
151
+ const nextLeafLevel = leafLevel - shiftedUp;
152
+ const newIndexOffset = (indexOffset + numBalancedLeaves) >> shiftedUp;
153
+ const shiftedTargetIndex = targetIndex - numBalancedLeaves;
154
+ return findPosition(rootLevel + 1, nextLeafLevel, numRemainingLeaves, newIndexOffset, shiftedTargetIndex);
155
+ }
156
+ }
157
+
158
+ export function findLeafLevelAndIndex(numLeaves: number, leafIndex: number) {
159
+ const maxLevel = getMaxUnbalancedTreeDepth(numLeaves);
160
+ return findPosition(0, maxLevel, numLeaves, 0, leafIndex);
161
+ }
@@ -19,6 +19,16 @@ export function unfreeze<T>(obj: T): Writeable<T> {
19
19
  return obj as Writeable<T>;
20
20
  }
21
21
 
22
+ /** Is defined type guard */
23
+ export function isDefined<T>(value: T | undefined): value is T {
24
+ return value !== undefined;
25
+ }
26
+
27
+ /** Type guard for error classes */
28
+ export function isErrorClass<T extends Error>(value: unknown, errorClass: new (...args: any[]) => T): value is T {
29
+ return value instanceof errorClass || (value instanceof Error && value.name === errorClass.name);
30
+ }
31
+
22
32
  /** Resolves a record-like type. Lifted from viem. */
23
33
  export type Prettify<T> = {
24
34
  [K in keyof T]: T[K];
@@ -28,7 +38,7 @@ export type Prettify<T> = {
28
38
  * Type-safe Event Emitter type
29
39
  * @example
30
40
  * export type ArchiverEmitter = TypedEventEmitter<{
31
- * [L2BlockSourceEvents.L2PruneDetected]: (args: L2BlockSourceEvent) => void;
41
+ * [L2BlockSourceEvents.L2PruneUnproven]: (args: L2BlockSourceEvent) => void;
32
42
  * [L2BlockSourceEvents.L2BlockProven]: (args: L2BlockSourceEvent) => void;
33
43
  * }>;
34
44
  * class Archiver extends (EventEmitter as new () => ArchiverEmitter) {
@@ -1,39 +0,0 @@
1
- /**
2
- * BN254 utility functions for point operations.
3
- * Provides compression, decompression, and public key generation for the BN254 curve.
4
- * Uses the bb.js Barretenberg backend for point operations.
5
- */
6
- /**
7
- * Generate a compressed BN254 G1 public key from a private key.
8
- *
9
- * @param privateKeyHex - Private key as 0x-prefixed hex string
10
- * @returns Compressed G1 point (32 bytes with sign bit in MSB)
11
- */
12
- export declare function computeBn254G1PublicKeyCompressed(privateKeyHex: string): Promise<string>;
13
- /**
14
- * Generate uncompressed BN254 G1 public key from a private key.
15
- *
16
- * @param privateKeyHex - Private key as 0x-prefixed hex string
17
- * @returns G1 point in affine coordinates
18
- */
19
- export declare function computeBn254G1PublicKey(privateKeyHex: string): Promise<{
20
- x: bigint;
21
- y: bigint;
22
- }>;
23
- /**
24
- * Generate BN254 G2 public key from a private key.
25
- *
26
- * @param privateKeyHex - Private key as 0x-prefixed hex string
27
- * @returns G2 point in affine coordinates
28
- */
29
- export declare function computeBn254G2PublicKey(privateKeyHex: string): Promise<{
30
- x: {
31
- c0: bigint;
32
- c1: bigint;
33
- };
34
- y: {
35
- c0: bigint;
36
- c1: bigint;
37
- };
38
- }>;
39
- //# sourceMappingURL=bn254_utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bn254_utils.d.ts","sourceRoot":"","sources":["../../../src/crypto/bn254/bn254_utils.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH;;;;;GAKG;AACH,wBAAsB,iCAAiC,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU9F;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAQtG;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5E,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/B,CAAC,CAWD"}