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

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 (319) 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 +1 -1
  5. package/dest/async-map/index.d.ts +1 -1
  6. package/dest/async-pool/index.d.ts +1 -1
  7. package/dest/bigint/index.d.ts +1 -1
  8. package/dest/bigint-buffer/index.d.ts +1 -1
  9. package/dest/branded-types/epoch.d.ts +42 -0
  10. package/dest/branded-types/epoch.d.ts.map +1 -0
  11. package/dest/branded-types/epoch.js +59 -0
  12. package/dest/branded-types/index.d.ts +4 -0
  13. package/dest/branded-types/index.d.ts.map +1 -0
  14. package/dest/branded-types/index.js +2 -0
  15. package/dest/branded-types/slot.d.ts +42 -0
  16. package/dest/branded-types/slot.d.ts.map +1 -0
  17. package/dest/branded-types/slot.js +59 -0
  18. package/dest/branded-types/types.d.ts +5 -0
  19. package/dest/branded-types/types.d.ts.map +1 -0
  20. package/dest/branded-types/types.js +1 -0
  21. package/dest/buffer/buffer16.d.ts +1 -4
  22. package/dest/buffer/buffer16.d.ts.map +1 -1
  23. package/dest/buffer/buffer32.d.ts +1 -4
  24. package/dest/buffer/buffer32.d.ts.map +1 -1
  25. package/dest/buffer/index.d.ts +1 -1
  26. package/dest/collection/array.d.ts +1 -1
  27. package/dest/collection/index.d.ts +1 -1
  28. package/dest/collection/object.d.ts +1 -1
  29. package/dest/committable/committable.d.ts +1 -1
  30. package/dest/committable/committable.d.ts.map +1 -1
  31. package/dest/committable/index.d.ts +1 -1
  32. package/dest/config/env_var.d.ts +2 -2
  33. package/dest/config/env_var.d.ts.map +1 -1
  34. package/dest/config/index.d.ts +1 -1
  35. package/dest/config/network_config.d.ts +1 -1
  36. package/dest/config/network_name.d.ts +1 -1
  37. package/dest/config/secret_value.d.ts +1 -1
  38. package/dest/config/secret_value.d.ts.map +1 -1
  39. package/dest/crypto/aes128/index.d.ts +1 -1
  40. package/dest/crypto/aes128/index.d.ts.map +1 -1
  41. package/dest/crypto/aes128/index.js +2 -6
  42. package/dest/crypto/bls/bn254_keystore.d.ts +15 -15
  43. package/dest/crypto/bls/bn254_keystore.d.ts.map +1 -1
  44. package/dest/crypto/bls/index.d.ts +1 -1
  45. package/dest/crypto/bn254/bn254_utils.d.ts +1 -1
  46. package/dest/crypto/bn254/index.d.ts +1 -1
  47. package/dest/crypto/bn254/index.d.ts.map +1 -1
  48. package/dest/crypto/bn254/index.js +3 -0
  49. package/dest/crypto/ecdsa/index.d.ts +1 -1
  50. package/dest/crypto/ecdsa/index.d.ts.map +1 -1
  51. package/dest/crypto/ecdsa/index.js +4 -12
  52. package/dest/crypto/ecdsa/signature.d.ts +1 -10
  53. package/dest/crypto/ecdsa/signature.d.ts.map +1 -1
  54. package/dest/crypto/grumpkin/index.d.ts +1 -1
  55. package/dest/crypto/grumpkin/index.d.ts.map +1 -1
  56. package/dest/crypto/grumpkin/index.js +5 -15
  57. package/dest/crypto/index.d.ts +1 -1
  58. package/dest/crypto/keccak/index.d.ts +1 -1
  59. package/dest/crypto/keys/index.d.ts +1 -1
  60. package/dest/crypto/keys/index.js +1 -3
  61. package/dest/crypto/pedersen/index.d.ts +1 -1
  62. package/dest/crypto/pedersen/pedersen.noble.d.ts +1 -1
  63. package/dest/crypto/pedersen/pedersen.wasm.d.ts +1 -1
  64. package/dest/crypto/pedersen/pedersen.wasm.js +3 -9
  65. package/dest/crypto/poseidon/index.d.ts +1 -1
  66. package/dest/crypto/poseidon/index.js +5 -15
  67. package/dest/crypto/random/index.d.ts +1 -1
  68. package/dest/crypto/random/index.d.ts.map +1 -1
  69. package/dest/crypto/random/randomness_singleton.d.ts +1 -1
  70. package/dest/crypto/random/randomness_singleton.d.ts.map +1 -1
  71. package/dest/crypto/schnorr/index.d.ts +1 -1
  72. package/dest/crypto/schnorr/index.d.ts.map +1 -1
  73. package/dest/crypto/schnorr/index.js +3 -9
  74. package/dest/crypto/schnorr/signature.d.ts +1 -1
  75. package/dest/crypto/schnorr/signature.d.ts.map +1 -1
  76. package/dest/crypto/secp256k1/index.d.ts +1 -1
  77. package/dest/crypto/secp256k1/index.d.ts.map +1 -1
  78. package/dest/crypto/secp256k1/index.js +3 -9
  79. package/dest/crypto/secp256k1-signer/index.d.ts +1 -1
  80. package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts +1 -1
  81. package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts.map +1 -1
  82. package/dest/crypto/secp256k1-signer/utils.d.ts +1 -1
  83. package/dest/crypto/secp256k1-signer/utils.d.ts.map +1 -1
  84. package/dest/crypto/serialize.d.ts +1 -1
  85. package/dest/crypto/sha256/index.d.ts +1 -1
  86. package/dest/crypto/sha256/index.d.ts.map +1 -1
  87. package/dest/crypto/sha512/index.d.ts +2 -2
  88. package/dest/crypto/sha512/index.d.ts.map +1 -1
  89. package/dest/crypto/signature/index.d.ts +1 -1
  90. package/dest/crypto/sync/index.d.ts +1 -1
  91. package/dest/crypto/sync/index.js +1 -3
  92. package/dest/crypto/sync/pedersen/index.d.ts +1 -1
  93. package/dest/crypto/sync/poseidon/index.d.ts +1 -1
  94. package/dest/decorators/index.d.ts +1 -1
  95. package/dest/decorators/memoize.d.ts +1 -1
  96. package/dest/decorators/memoize.d.ts.map +1 -1
  97. package/dest/error/index.d.ts +4 -4
  98. package/dest/error/index.d.ts.map +1 -1
  99. package/dest/eth-address/index.d.ts +10 -1
  100. package/dest/eth-address/index.d.ts.map +1 -1
  101. package/dest/eth-address/index.js +17 -0
  102. package/dest/eth-signature/eth_signature.d.ts +1 -4
  103. package/dest/eth-signature/eth_signature.d.ts.map +1 -1
  104. package/dest/eth-signature/index.d.ts +1 -1
  105. package/dest/fields/bls12_fields.d.ts +1 -1
  106. package/dest/fields/bls12_fields.d.ts.map +1 -1
  107. package/dest/fields/bls12_point.d.ts +1 -10
  108. package/dest/fields/bls12_point.d.ts.map +1 -1
  109. package/dest/fields/coordinate.d.ts +1 -4
  110. package/dest/fields/coordinate.d.ts.map +1 -1
  111. package/dest/fields/fields.d.ts +10 -1
  112. package/dest/fields/fields.d.ts.map +1 -1
  113. package/dest/fields/fields.js +14 -0
  114. package/dest/fields/index.d.ts +1 -1
  115. package/dest/fields/point.d.ts +11 -11
  116. package/dest/fields/point.d.ts.map +1 -1
  117. package/dest/fields/point.js +17 -0
  118. package/dest/fs/index.d.ts +1 -1
  119. package/dest/fs/run_in_dir.d.ts +1 -1
  120. package/dest/fs/try_rm_dir.d.ts +1 -1
  121. package/dest/index.d.ts +2 -1
  122. package/dest/index.d.ts.map +1 -1
  123. package/dest/index.js +1 -0
  124. package/dest/iterable/all.d.ts +1 -1
  125. package/dest/iterable/filter.d.ts +1 -1
  126. package/dest/iterable/index.d.ts +1 -1
  127. package/dest/iterable/isAsyncIt.d.ts +1 -1
  128. package/dest/iterable/map.d.ts +1 -1
  129. package/dest/iterable/peek.d.ts +1 -1
  130. package/dest/iterable/sort.d.ts +1 -1
  131. package/dest/iterable/take.d.ts +1 -1
  132. package/dest/iterable/toArray.d.ts +1 -1
  133. package/dest/json-rpc/client/fetch.d.ts +1 -1
  134. package/dest/json-rpc/client/index.d.ts +1 -1
  135. package/dest/json-rpc/client/safe_json_rpc_client.d.ts +1 -1
  136. package/dest/json-rpc/client/undici.d.ts +1 -1
  137. package/dest/json-rpc/convert.d.ts +1 -1
  138. package/dest/json-rpc/errors.d.ts +1 -1
  139. package/dest/json-rpc/errors.d.ts.map +1 -1
  140. package/dest/json-rpc/fixtures/class_a.d.ts +3 -3
  141. package/dest/json-rpc/fixtures/class_a.d.ts.map +1 -1
  142. package/dest/json-rpc/fixtures/class_b.d.ts +3 -3
  143. package/dest/json-rpc/fixtures/class_b.d.ts.map +1 -1
  144. package/dest/json-rpc/fixtures/test_state.d.ts +1 -1
  145. package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -1
  146. package/dest/json-rpc/index.d.ts +1 -1
  147. package/dest/json-rpc/js_utils.d.ts +1 -1
  148. package/dest/json-rpc/js_utils.d.ts.map +1 -1
  149. package/dest/json-rpc/server/index.d.ts +1 -1
  150. package/dest/json-rpc/server/safe_json_rpc_server.d.ts +1 -1
  151. package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -1
  152. package/dest/json-rpc/server/telemetry.d.ts +1 -1
  153. package/dest/json-rpc/test/index.d.ts +1 -1
  154. package/dest/json-rpc/test/integration.d.ts +1 -1
  155. package/dest/log/console.d.ts +1 -1
  156. package/dest/log/gcloud-logger-config.d.ts +1 -1
  157. package/dest/log/gcloud-logger-config.d.ts.map +1 -1
  158. package/dest/log/index.d.ts +1 -1
  159. package/dest/log/libp2p_logger.d.ts +1 -1
  160. package/dest/log/log-filters.d.ts +1 -1
  161. package/dest/log/log-levels.d.ts +1 -1
  162. package/dest/log/log_fn.d.ts +1 -1
  163. package/dest/log/noir_debug_log_util.d.ts +1 -1
  164. package/dest/log/pino-logger.d.ts +2 -2
  165. package/dest/message/index.d.ts +1 -1
  166. package/dest/message/index.d.ts.map +1 -1
  167. package/dest/mutex/index.d.ts +1 -1
  168. package/dest/mutex/index.d.ts.map +1 -1
  169. package/dest/mutex/mutex_database.d.ts +1 -1
  170. package/dest/noir/index.d.ts +1 -1
  171. package/dest/noir/noir_package_config.d.ts +9 -9
  172. package/dest/number/index.d.ts +1 -1
  173. package/dest/profiler/index.d.ts +1 -1
  174. package/dest/profiler/profiler.d.ts +1 -1
  175. package/dest/promise/index.d.ts +1 -1
  176. package/dest/promise/running-promise.d.ts +1 -1
  177. package/dest/promise/running-promise.d.ts.map +1 -1
  178. package/dest/promise/utils.d.ts +1 -1
  179. package/dest/queue/base_memory_queue.d.ts +1 -1
  180. package/dest/queue/base_memory_queue.d.ts.map +1 -1
  181. package/dest/queue/batch_queue.d.ts +1 -1
  182. package/dest/queue/batch_queue.d.ts.map +1 -1
  183. package/dest/queue/bounded_serial_queue.d.ts +1 -1
  184. package/dest/queue/bounded_serial_queue.d.ts.map +1 -1
  185. package/dest/queue/fifo_memory_queue.d.ts +1 -1
  186. package/dest/queue/fifo_memory_queue.d.ts.map +1 -1
  187. package/dest/queue/index.d.ts +1 -1
  188. package/dest/queue/priority_memory_queue.d.ts +1 -1
  189. package/dest/queue/priority_memory_queue.d.ts.map +1 -1
  190. package/dest/queue/priority_queue.d.ts +1 -1
  191. package/dest/queue/priority_queue.d.ts.map +1 -1
  192. package/dest/queue/semaphore.d.ts +1 -1
  193. package/dest/queue/semaphore.d.ts.map +1 -1
  194. package/dest/queue/serial_queue.d.ts +1 -1
  195. package/dest/queue/serial_queue.d.ts.map +1 -1
  196. package/dest/retry/index.d.ts +1 -1
  197. package/dest/running-promise/index.d.ts +1 -1
  198. package/dest/schemas/api.d.ts +1 -1
  199. package/dest/schemas/index.d.ts +1 -1
  200. package/dest/schemas/parse.d.ts +1 -1
  201. package/dest/schemas/schemas.d.ts +9 -15
  202. package/dest/schemas/schemas.d.ts.map +1 -1
  203. package/dest/schemas/schemas.js +5 -7
  204. package/dest/schemas/types.d.ts +1 -1
  205. package/dest/schemas/utils.d.ts +4 -4
  206. package/dest/schemas/utils.d.ts.map +1 -1
  207. package/dest/schemas/utils.js +15 -5
  208. package/dest/serialize/buffer_reader.d.ts +1 -1
  209. package/dest/serialize/buffer_reader.d.ts.map +1 -1
  210. package/dest/serialize/field_reader.d.ts +1 -1
  211. package/dest/serialize/field_reader.d.ts.map +1 -1
  212. package/dest/serialize/free_funcs.d.ts +1 -1
  213. package/dest/serialize/index.d.ts +1 -1
  214. package/dest/serialize/serialize.d.ts +1 -1
  215. package/dest/serialize/type_registry.d.ts +1 -1
  216. package/dest/serialize/type_registry.d.ts.map +1 -1
  217. package/dest/serialize/types.d.ts +1 -1
  218. package/dest/sleep/index.d.ts +1 -1
  219. package/dest/sleep/index.d.ts.map +1 -1
  220. package/dest/string/index.d.ts +1 -1
  221. package/dest/testing/files/index.d.ts +2 -1
  222. package/dest/testing/files/index.d.ts.map +1 -1
  223. package/dest/testing/files/index.js +1 -1
  224. package/dest/testing/formatting.d.ts +1 -1
  225. package/dest/testing/index.d.ts +1 -1
  226. package/dest/testing/port_allocator.d.ts +1 -1
  227. package/dest/testing/snapshot_serializer.d.ts +1 -1
  228. package/dest/testing/test_data.d.ts +1 -1
  229. package/dest/timer/date.d.ts +1 -1
  230. package/dest/timer/date.d.ts.map +1 -1
  231. package/dest/timer/elapsed.d.ts +1 -1
  232. package/dest/timer/index.d.ts +1 -1
  233. package/dest/timer/timeout.d.ts +1 -1
  234. package/dest/timer/timeout.d.ts.map +1 -1
  235. package/dest/timer/timer.d.ts +1 -1
  236. package/dest/timer/timer.d.ts.map +1 -1
  237. package/dest/transport/dispatch/create_dispatch_fn.d.ts +1 -1
  238. package/dest/transport/dispatch/create_dispatch_fn.d.ts.map +1 -1
  239. package/dest/transport/dispatch/create_dispatch_proxy.d.ts +1 -1
  240. package/dest/transport/dispatch/messages.d.ts +1 -1
  241. package/dest/transport/index.d.ts +1 -1
  242. package/dest/transport/interface/connector.d.ts +1 -1
  243. package/dest/transport/interface/listener.d.ts +1 -1
  244. package/dest/transport/interface/socket.d.ts +1 -1
  245. package/dest/transport/interface/transferable.d.ts +1 -1
  246. package/dest/transport/node/index.d.ts +1 -1
  247. package/dest/transport/node/node_connector.d.ts +1 -1
  248. package/dest/transport/node/node_connector.d.ts.map +1 -1
  249. package/dest/transport/node/node_connector_socket.d.ts +1 -1
  250. package/dest/transport/node/node_connector_socket.d.ts.map +1 -1
  251. package/dest/transport/node/node_listener.d.ts +1 -1
  252. package/dest/transport/node/node_listener.d.ts.map +1 -1
  253. package/dest/transport/node/node_listener_socket.d.ts +1 -1
  254. package/dest/transport/node/node_listener_socket.d.ts.map +1 -1
  255. package/dest/transport/transport_client.d.ts +1 -1
  256. package/dest/transport/transport_client.d.ts.map +1 -1
  257. package/dest/transport/transport_server.d.ts +1 -10
  258. package/dest/transport/transport_server.d.ts.map +1 -1
  259. package/dest/trees/balanced_merkle_tree.d.ts +22 -0
  260. package/dest/trees/balanced_merkle_tree.d.ts.map +1 -0
  261. package/dest/trees/balanced_merkle_tree.js +64 -0
  262. package/dest/trees/hasher.d.ts +1 -1
  263. package/dest/trees/index.d.ts +2 -1
  264. package/dest/trees/index.d.ts.map +1 -1
  265. package/dest/trees/index.js +1 -0
  266. package/dest/trees/indexed_merkle_tree.d.ts +1 -1
  267. package/dest/trees/indexed_merkle_tree.d.ts.map +1 -1
  268. package/dest/trees/indexed_merkle_tree_calculator.d.ts +1 -1
  269. package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -1
  270. package/dest/trees/indexed_tree_leaf.d.ts +1 -1
  271. package/dest/trees/membership_witness.d.ts +2 -23
  272. package/dest/trees/membership_witness.d.ts.map +1 -1
  273. package/dest/trees/merkle_tree.d.ts +1 -1
  274. package/dest/trees/merkle_tree.d.ts.map +1 -1
  275. package/dest/trees/merkle_tree_calculator.d.ts +2 -12
  276. package/dest/trees/merkle_tree_calculator.d.ts.map +1 -1
  277. package/dest/trees/merkle_tree_calculator.js +1 -31
  278. package/dest/trees/sibling_path.d.ts +4 -38
  279. package/dest/trees/sibling_path.d.ts.map +1 -1
  280. package/dest/trees/unbalanced_merkle_tree.d.ts +5 -3
  281. package/dest/trees/unbalanced_merkle_tree.d.ts.map +1 -1
  282. package/dest/trees/unbalanced_merkle_tree.js +32 -9
  283. package/dest/trees/unbalanced_merkle_tree_calculator.d.ts +6 -5
  284. package/dest/trees/unbalanced_merkle_tree_calculator.d.ts.map +1 -1
  285. package/dest/trees/unbalanced_merkle_tree_calculator.js +36 -40
  286. package/dest/trees/unbalanced_tree_store.d.ts +1 -1
  287. package/dest/trees/unbalanced_tree_store.d.ts.map +1 -1
  288. package/dest/types/index.d.ts +1 -1
  289. package/dest/url/index.d.ts +1 -1
  290. package/dest/validation/index.d.ts +1 -1
  291. package/package.json +7 -5
  292. package/src/array/array.ts +0 -16
  293. package/src/branded-types/epoch.ts +88 -0
  294. package/src/branded-types/index.ts +4 -0
  295. package/src/branded-types/slot.ts +88 -0
  296. package/src/branded-types/types.ts +2 -0
  297. package/src/config/env_var.ts +12 -2
  298. package/src/crypto/aes128/index.ts +2 -2
  299. package/src/crypto/bn254/index.ts +3 -0
  300. package/src/crypto/ecdsa/index.ts +4 -4
  301. package/src/crypto/grumpkin/index.ts +5 -5
  302. package/src/crypto/keys/index.ts +1 -1
  303. package/src/crypto/pedersen/pedersen.wasm.ts +3 -3
  304. package/src/crypto/poseidon/index.ts +5 -5
  305. package/src/crypto/schnorr/index.ts +3 -3
  306. package/src/crypto/secp256k1/index.ts +3 -3
  307. package/src/crypto/sync/index.ts +1 -1
  308. package/src/eth-address/index.ts +19 -0
  309. package/src/fields/fields.ts +16 -0
  310. package/src/fields/point.ts +19 -0
  311. package/src/index.ts +1 -0
  312. package/src/schemas/schemas.ts +10 -10
  313. package/src/schemas/utils.ts +21 -8
  314. package/src/testing/files/index.ts +1 -1
  315. package/src/trees/balanced_merkle_tree.ts +82 -0
  316. package/src/trees/index.ts +1 -0
  317. package/src/trees/merkle_tree_calculator.ts +1 -34
  318. package/src/trees/unbalanced_merkle_tree.ts +54 -6
  319. package/src/trees/unbalanced_merkle_tree_calculator.ts +34 -41
@@ -1,5 +1,14 @@
1
- import { sha256Trunc } from '../crypto/sha256/index.js';
2
- import { MerkleTreeCalculator } from './merkle_tree_calculator.js';
1
+ import {
2
+ computeBalancedMerkleTreeRoot,
3
+ computeBalancedMerkleTreeRootAsync,
4
+ poseidonMerkleHash,
5
+ shaMerkleHash,
6
+ } from './balanced_merkle_tree.js';
7
+
8
+ export const computeUnbalancedShaRoot = (leaves: Buffer[]) => computeUnbalancedMerkleTreeRoot(leaves, shaMerkleHash);
9
+
10
+ export const computeUnbalancedPoseidonRoot = async (leaves: Buffer[]) =>
11
+ await computeUnbalancedMerkleTreeRootAsync(leaves, poseidonMerkleHash);
3
12
 
4
13
  /**
5
14
  * Computes the Merkle root of an unbalanced tree.
@@ -22,9 +31,48 @@ import { MerkleTreeCalculator } from './merkle_tree_calculator.js';
22
31
  * But if we instead combine the size-4 and size-8 subtrees first (depth 4), and then merge with the size-2 subtree
23
32
  * (depth 1), the final tree has a depth of 5.
24
33
  */
25
- export function computeUnbalancedMerkleTreeRoot(leaves: Buffer[], hasher = sha256Trunc): Buffer {
34
+ export function computeUnbalancedMerkleTreeRoot(
35
+ leaves: Buffer[],
36
+ hasher = shaMerkleHash,
37
+ emptyRoot = Buffer.alloc(32),
38
+ ): Buffer {
39
+ if (!leaves.length) {
40
+ return emptyRoot;
41
+ }
42
+
43
+ if (leaves.length === 1) {
44
+ return leaves[0];
45
+ }
46
+
47
+ let numRemainingLeaves = leaves.length;
48
+ let subtreeSize = 1;
49
+ let root: Buffer | undefined;
50
+ while (numRemainingLeaves > 1) {
51
+ if ((numRemainingLeaves & subtreeSize) !== 0) {
52
+ const subtreeLeaves = leaves.slice(numRemainingLeaves - subtreeSize, numRemainingLeaves);
53
+ const subtreeRoot = computeBalancedMerkleTreeRoot(subtreeLeaves, hasher);
54
+ if (!root) {
55
+ root = subtreeRoot;
56
+ } else {
57
+ root = hasher(subtreeRoot, root);
58
+ }
59
+
60
+ numRemainingLeaves -= subtreeSize;
61
+ }
62
+
63
+ subtreeSize *= 2;
64
+ }
65
+
66
+ return root!;
67
+ }
68
+
69
+ export async function computeUnbalancedMerkleTreeRootAsync(
70
+ leaves: Buffer[],
71
+ hasher = poseidonMerkleHash,
72
+ emptyRoot = Buffer.alloc(32),
73
+ ): Promise<Buffer> {
26
74
  if (!leaves.length) {
27
- throw new Error('Cannot compute a Merkle root with no leaves');
75
+ return emptyRoot;
28
76
  }
29
77
 
30
78
  if (leaves.length === 1) {
@@ -37,11 +85,11 @@ export function computeUnbalancedMerkleTreeRoot(leaves: Buffer[], hasher = sha25
37
85
  while (numRemainingLeaves > 1) {
38
86
  if ((numRemainingLeaves & subtreeSize) !== 0) {
39
87
  const subtreeLeaves = leaves.slice(numRemainingLeaves - subtreeSize, numRemainingLeaves);
40
- const subtreeRoot = MerkleTreeCalculator.computeTreeRootSync(subtreeLeaves, hasher);
88
+ const subtreeRoot = await computeBalancedMerkleTreeRootAsync(subtreeLeaves, hasher);
41
89
  if (!root) {
42
90
  root = subtreeRoot;
43
91
  } else {
44
- root = hasher(Buffer.concat([subtreeRoot, root]));
92
+ root = await hasher(subtreeRoot, root);
45
93
  }
46
94
 
47
95
  numRemainingLeaves -= subtreeSize;
@@ -1,4 +1,4 @@
1
- import { sha256Trunc } from '../crypto/index.js';
1
+ import { shaMerkleHash } from './balanced_merkle_tree.js';
2
2
  import type { Hasher } from './hasher.js';
3
3
  import { SiblingPath } from './sibling_path.js';
4
4
  import { type TreeNodeLocation, UnbalancedTreeStore } from './unbalanced_tree_store.js';
@@ -6,9 +6,10 @@ import { type TreeNodeLocation, UnbalancedTreeStore } from './unbalanced_tree_st
6
6
  export function computeCompressedUnbalancedMerkleTreeRoot(
7
7
  leaves: Buffer[],
8
8
  valueToCompress = Buffer.alloc(32),
9
+ emptyRoot = Buffer.alloc(32),
9
10
  hasher?: Hasher['hash'],
10
11
  ): Buffer {
11
- const calculator = UnbalancedMerkleTreeCalculator.create(leaves, valueToCompress, hasher);
12
+ const calculator = UnbalancedMerkleTreeCalculator.create(leaves, valueToCompress, emptyRoot, hasher);
12
13
  return calculator.getRoot();
13
14
  }
14
15
 
@@ -32,12 +33,9 @@ export class UnbalancedMerkleTreeCalculator {
32
33
  public constructor(
33
34
  private readonly leaves: Buffer[],
34
35
  private readonly valueToCompress: Buffer,
36
+ private readonly emptyRoot: Buffer,
35
37
  private readonly hasher: Hasher['hash'],
36
38
  ) {
37
- if (leaves.length === 0) {
38
- throw Error('Cannot create a compressed unbalanced tree with 0 leaves.');
39
- }
40
-
41
39
  this.store = new UnbalancedTreeStore(leaves.length);
42
40
  this.buildTree();
43
41
  }
@@ -45,9 +43,10 @@ export class UnbalancedMerkleTreeCalculator {
45
43
  static create(
46
44
  leaves: Buffer[],
47
45
  valueToCompress = Buffer.alloc(0),
48
- hasher = (left: Buffer, right: Buffer) => sha256Trunc(Buffer.concat([left, right])) as Buffer<ArrayBuffer>,
46
+ emptyRoot = Buffer.alloc(32),
47
+ hasher = shaMerkleHash,
49
48
  ) {
50
- return new UnbalancedMerkleTreeCalculator(leaves, valueToCompress, hasher);
49
+ return new UnbalancedMerkleTreeCalculator(leaves, valueToCompress, emptyRoot, hasher);
51
50
  }
52
51
 
53
52
  /**
@@ -113,8 +112,8 @@ export class UnbalancedMerkleTreeCalculator {
113
112
  // Start with the leaves that are not compressed.
114
113
  let toProcess = this.leafLocations.filter((_, i) => !this.leaves[i].equals(this.valueToCompress));
115
114
  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) });
115
+ // All leaves are compressed. Set empty root to the root.
116
+ this.store.setNode({ level: 0, index: 0 }, { value: this.emptyRoot });
118
117
  return;
119
118
  }
120
119
 
@@ -138,10 +137,7 @@ export class UnbalancedMerkleTreeCalculator {
138
137
  const shouldShiftUp = !sibling || sibling.value.equals(this.valueToCompress);
139
138
  if (shouldShiftUp) {
140
139
  // 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
- }
140
+ this.shiftNodeUp(location, parentLocation);
145
141
  } else {
146
142
  // Hash the value with the (right) sibling and update the parent node.
147
143
  const node = this.store.getNode(location)!;
@@ -157,38 +153,35 @@ export class UnbalancedMerkleTreeCalculator {
157
153
  }
158
154
  }
159
155
 
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;
156
+ private shiftNodeUp(from: TreeNodeLocation, to: TreeNodeLocation) {
157
+ // Collect all nodes that need to shift.
158
+ const nodesToShift = this.collectNodesToShift(from, to);
159
+ // Move all nodes to their new locations.
160
+ for (const { node, newLocation } of nodesToShift) {
161
+ this.store.setNode(newLocation, node);
162
+ if (node.leafIndex !== undefined) {
163
+ this.leafLocations[node.leafIndex] = newLocation;
164
+ }
169
165
  }
170
-
171
- return isLeaf;
172
166
  }
173
167
 
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
- });
168
+ private collectNodesToShift(from: TreeNodeLocation, to: TreeNodeLocation) {
169
+ const node = this.store.getNode(from);
170
+ if (!node) {
171
+ return [];
172
+ }
183
173
 
184
- const isLeftLeaf = this.shiftNodeUp(left, computeNewLocation(left.index));
185
- const isRightLeaf = this.shiftNodeUp(right, computeNewLocation(right.index));
174
+ let result = [{ node, newLocation: to }];
186
175
 
187
- if (!isLeftLeaf) {
188
- this.shiftChildrenUp(left);
189
- }
190
- if (!isRightLeaf) {
191
- this.shiftChildrenUp(right);
176
+ // If not a leaf, collect its children.
177
+ if (node.leafIndex === undefined) {
178
+ const [leftChild, rightChild] = this.store.getChildLocations(from);
179
+ const [leftChildNew, rightChildNew] = this.store.getChildLocations(to);
180
+ result = result
181
+ .concat(this.collectNodesToShift(leftChild, leftChildNew))
182
+ .concat(this.collectNodesToShift(rightChild, rightChildNew));
192
183
  }
184
+
185
+ return result;
193
186
  }
194
187
  }