@aztec/merkle-tree 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2

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 (70) hide show
  1. package/dest/hasher_with_stats.js +17 -13
  2. package/dest/index.js +0 -1
  3. package/dest/interfaces/append_only_tree.js +3 -2
  4. package/dest/interfaces/indexed_tree.js +3 -2
  5. package/dest/interfaces/merkle_tree.js +3 -2
  6. package/dest/interfaces/update_only_tree.js +3 -2
  7. package/dest/load_tree.js +1 -3
  8. package/dest/new_tree.js +1 -3
  9. package/dest/pedersen.js +12 -13
  10. package/dest/poseidon.js +12 -13
  11. package/dest/sha_256.js +22 -23
  12. package/dest/snapshots/append_only_snapshot.js +98 -79
  13. package/dest/snapshots/base_full_snapshot.js +77 -43
  14. package/dest/snapshots/full_snapshot.js +4 -6
  15. package/dest/snapshots/indexed_tree_snapshot.js +27 -25
  16. package/dest/snapshots/snapshot_builder.js +1 -2
  17. package/dest/snapshots/snapshot_builder_test_suite.js +43 -43
  18. package/dest/sparse_tree/sparse_tree.js +9 -19
  19. package/dest/standard_indexed_tree/standard_indexed_tree.js +251 -278
  20. package/dest/standard_indexed_tree/test/standard_indexed_tree_with_append.js +12 -17
  21. package/dest/standard_tree/standard_tree.js +10 -19
  22. package/dest/tree_base.js +109 -111
  23. package/dest/unbalanced_tree.js +84 -88
  24. package/package.json +6 -6
  25. package/dest/hasher_with_stats.d.ts +0 -22
  26. package/dest/hasher_with_stats.d.ts.map +0 -1
  27. package/dest/index.d.ts +0 -20
  28. package/dest/index.d.ts.map +0 -1
  29. package/dest/interfaces/append_only_tree.d.ts +0 -16
  30. package/dest/interfaces/append_only_tree.d.ts.map +0 -1
  31. package/dest/interfaces/indexed_tree.d.ts +0 -69
  32. package/dest/interfaces/indexed_tree.d.ts.map +0 -1
  33. package/dest/interfaces/merkle_tree.d.ts +0 -64
  34. package/dest/interfaces/merkle_tree.d.ts.map +0 -1
  35. package/dest/interfaces/update_only_tree.d.ts +0 -17
  36. package/dest/interfaces/update_only_tree.d.ts.map +0 -1
  37. package/dest/load_tree.d.ts +0 -16
  38. package/dest/load_tree.d.ts.map +0 -1
  39. package/dest/new_tree.d.ts +0 -16
  40. package/dest/new_tree.d.ts.map +0 -1
  41. package/dest/pedersen.d.ts +0 -13
  42. package/dest/pedersen.d.ts.map +0 -1
  43. package/dest/poseidon.d.ts +0 -13
  44. package/dest/poseidon.d.ts.map +0 -1
  45. package/dest/sha_256.d.ts +0 -22
  46. package/dest/sha_256.d.ts.map +0 -1
  47. package/dest/snapshots/append_only_snapshot.d.ts +0 -32
  48. package/dest/snapshots/append_only_snapshot.d.ts.map +0 -1
  49. package/dest/snapshots/base_full_snapshot.d.ts +0 -66
  50. package/dest/snapshots/base_full_snapshot.d.ts.map +0 -1
  51. package/dest/snapshots/full_snapshot.d.ts +0 -27
  52. package/dest/snapshots/full_snapshot.d.ts.map +0 -1
  53. package/dest/snapshots/indexed_tree_snapshot.d.ts +0 -16
  54. package/dest/snapshots/indexed_tree_snapshot.d.ts.map +0 -1
  55. package/dest/snapshots/snapshot_builder.d.ts +0 -85
  56. package/dest/snapshots/snapshot_builder.d.ts.map +0 -1
  57. package/dest/snapshots/snapshot_builder_test_suite.d.ts +0 -6
  58. package/dest/snapshots/snapshot_builder_test_suite.d.ts.map +0 -1
  59. package/dest/sparse_tree/sparse_tree.d.ts +0 -21
  60. package/dest/sparse_tree/sparse_tree.d.ts.map +0 -1
  61. package/dest/standard_indexed_tree/standard_indexed_tree.d.ts +0 -291
  62. package/dest/standard_indexed_tree/standard_indexed_tree.d.ts.map +0 -1
  63. package/dest/standard_indexed_tree/test/standard_indexed_tree_with_append.d.ts +0 -25
  64. package/dest/standard_indexed_tree/test/standard_indexed_tree_with_append.d.ts.map +0 -1
  65. package/dest/standard_tree/standard_tree.d.ts +0 -23
  66. package/dest/standard_tree/standard_tree.d.ts.map +0 -1
  67. package/dest/tree_base.d.ts +0 -159
  68. package/dest/tree_base.d.ts.map +0 -1
  69. package/dest/unbalanced_tree.d.ts +0 -109
  70. package/dest/unbalanced_tree.d.ts.map +0 -1
@@ -1,21 +1,26 @@
1
1
  import { createHistogram, performance } from 'perf_hooks';
2
2
  /**
3
3
  * A helper class to track stats for a Hasher
4
- */
5
- export class HasherWithStats {
6
- constructor(hasher) {
7
- this.hashCount = 0;
8
- this.hashInputsCount = 0;
9
- this.hashHistogram = createHistogram();
10
- this.hashInputsHistogram = createHistogram();
11
- this.hash = performance.timerify((lhs, rhs) => {
4
+ */ export class HasherWithStats {
5
+ hashCount = 0;
6
+ hashInputsCount = 0;
7
+ hashHistogram = createHistogram();
8
+ hashInputsHistogram = createHistogram();
9
+ hash;
10
+ hashInputs;
11
+ constructor(hasher){
12
+ this.hash = performance.timerify((lhs, rhs)=>{
12
13
  this.hashCount++;
13
14
  return hasher.hash(lhs, rhs);
14
- }, { histogram: this.hashHistogram });
15
- this.hashInputs = performance.timerify((inputs) => {
15
+ }, {
16
+ histogram: this.hashHistogram
17
+ });
18
+ this.hashInputs = performance.timerify((inputs)=>{
16
19
  this.hashInputsCount++;
17
20
  return hasher.hashInputs(inputs);
18
- }, { histogram: this.hashInputsHistogram });
21
+ }, {
22
+ histogram: this.hashInputsHistogram
23
+ });
19
24
  }
20
25
  stats() {
21
26
  return {
@@ -23,7 +28,7 @@ export class HasherWithStats {
23
28
  // timerify records in ns, convert to ms
24
29
  hashDuration: this.hashHistogram.mean / 1e6,
25
30
  hashInputsCount: this.hashInputsCount,
26
- hashInputsDuration: this.hashInputsHistogram.mean / 1e6,
31
+ hashInputsDuration: this.hashInputsHistogram.mean / 1e6
27
32
  };
28
33
  }
29
34
  reset() {
@@ -33,4 +38,3 @@ export class HasherWithStats {
33
38
  this.hashInputsHistogram.reset();
34
39
  }
35
40
  }
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaGVyX3dpdGhfc3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaGFzaGVyX3dpdGhfc3RhdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFMUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQVMxQixZQUFZLE1BQWM7UUFSMUIsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLGtCQUFhLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFDbEMsd0JBQW1CLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFNdEMsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsUUFBUSxDQUM5QixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNYLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUMsRUFDRCxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQ2xDLENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQ3BDLENBQUMsTUFBZ0IsRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QixPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxFQUNELEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUN4QyxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUs7UUFDSCxPQUFPO1lBQ0wsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLHdDQUF3QztZQUN4QyxZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsR0FBRztZQUMzQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDckMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksR0FBRyxHQUFHO1NBQ3hELENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ25DLENBQUM7Q0FDRiJ9
package/dest/index.js CHANGED
@@ -17,4 +17,3 @@ export * from './snapshots/snapshot_builder.js';
17
17
  export * from './snapshots/full_snapshot.js';
18
18
  export * from './snapshots/append_only_snapshot.js';
19
19
  export * from './snapshots/indexed_tree_snapshot.js';
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLDhCQUE4QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLG1FQUFtRSxDQUFDO0FBQ2xILGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMsc0NBQXNDLENBQUMifQ==
@@ -1,2 +1,3 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwZW5kX29ubHlfdHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnRlcmZhY2VzL2FwcGVuZF9vbmx5X3RyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
1
+ /**
2
+ * A Merkle tree that supports only appending leaves and not updating existing leaves.
3
+ */ export { };
@@ -1,2 +1,3 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZF90cmVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVyZmFjZXMvaW5kZXhlZF90cmVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
1
+ /**
2
+ * Indexed merkle tree.
3
+ */ export { };
@@ -1,2 +1,3 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJmYWNlcy9tZXJrbGVfdHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
1
+ /**
2
+ * Defines the interface for a Merkle tree.
3
+ */ export { };
@@ -1,2 +1,3 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlX29ubHlfdHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnRlcmZhY2VzL3VwZGF0ZV9vbmx5X3RyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
1
+ /**
2
+ * A Merkle tree that supports updates at arbitrary indices but not appending.
3
+ */ export { };
package/dest/load_tree.js CHANGED
@@ -6,10 +6,8 @@ import { getTreeMeta } from './tree_base.js';
6
6
  * @param hasher - A hasher used to compute hash paths.
7
7
  * @param name - Name of the tree.
8
8
  * @returns The newly created tree.
9
- */
10
- export function loadTree(c, store, hasher, name, deserializer) {
9
+ */ export function loadTree(c, store, hasher, name, deserializer) {
11
10
  const { root, depth, size } = getTreeMeta(store, name);
12
11
  const tree = new c(store, hasher, name, depth, size, deserializer, root);
13
12
  return Promise.resolve(tree);
14
13
  }
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZF90cmVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvYWRfdHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQWlCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUN0QixDQVFNLEVBQ04sS0FBbUIsRUFDbkIsTUFBYyxFQUNkLElBQVksRUFDWixZQUFlO0lBRWYsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0IsQ0FBQyJ9
package/dest/new_tree.js CHANGED
@@ -7,10 +7,8 @@
7
7
  * @param depth - Depth of the tree.
8
8
  * @param prefilledSize - A number of leaves that are prefilled with values.
9
9
  * @returns The newly created tree.
10
- */
11
- export async function newTree(c, store, hasher, name, deserializer, depth, prefilledSize = 1) {
10
+ */ export async function newTree(c, store, hasher, name, deserializer, depth, prefilledSize = 1) {
12
11
  const tree = new c(store, hasher, name, depth, 0n, deserializer);
13
12
  await tree.init(prefilledSize);
14
13
  return tree;
15
14
  }
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3X3RyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV3X3RyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUE7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLENBQzNCLENBQTZHLEVBQzdHLEtBQW1CLEVBQ25CLE1BQWMsRUFDZCxJQUFZLEVBQ1osWUFBZSxFQUNmLEtBQWEsRUFDYixhQUFhLEdBQUcsQ0FBQztJQUVqQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvQixPQUFPLElBQUksQ0FBQztBQUNkLENBQUMifQ==
package/dest/pedersen.js CHANGED
@@ -4,22 +4,21 @@ import { Fr } from '@aztec/foundation/fields';
4
4
  * A helper class encapsulating Pedersen hash functionality.
5
5
  * @deprecated Don't call pedersen directly in production code. Instead, create suitably-named functions for specific
6
6
  * purposes.
7
- */
8
- export class Pedersen {
7
+ */ export class Pedersen {
9
8
  /*
10
- * @deprecated Don't call pedersen directly in production code. Instead, create suitably-named functions for specific
11
- * purposes.
12
- */
13
- hash(lhs, rhs) {
14
- return pedersenHash([Fr.fromBuffer(Buffer.from(lhs)), Fr.fromBuffer(Buffer.from(rhs))]).toBuffer();
9
+ * @deprecated Don't call pedersen directly in production code. Instead, create suitably-named functions for specific
10
+ * purposes.
11
+ */ hash(lhs, rhs) {
12
+ return pedersenHash([
13
+ Fr.fromBuffer(Buffer.from(lhs)),
14
+ Fr.fromBuffer(Buffer.from(rhs))
15
+ ]).toBuffer();
15
16
  }
16
17
  /*
17
- * @deprecated Don't call pedersen directly in production code. Instead, create suitably-named functions for specific
18
- * purposes.
19
- */
20
- hashInputs(inputs) {
21
- const inputFields = inputs.map(i => Fr.fromBuffer(i));
18
+ * @deprecated Don't call pedersen directly in production code. Instead, create suitably-named functions for specific
19
+ * purposes.
20
+ */ hashInputs(inputs) {
21
+ const inputFields = inputs.map((i)=>Fr.fromBuffer(i));
22
22
  return pedersenHash(inputFields).toBuffer();
23
23
  }
24
24
  }
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVkZXJzZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGVkZXJzZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUc5Qzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDbkI7OztPQUdHO0lBQ0ksSUFBSSxDQUFDLEdBQWUsRUFBRSxHQUFlO1FBQzFDLE9BQU8sWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JHLENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsTUFBZ0I7UUFDaEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxPQUFPLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0NBQ0YifQ==
package/dest/poseidon.js CHANGED
@@ -4,22 +4,21 @@ import { Fr } from '@aztec/foundation/fields';
4
4
  * A helper class encapsulating poseidon2 hash functionality.
5
5
  * @deprecated Don't call poseidon2 directly in production code. Instead, create suitably-named functions for specific
6
6
  * purposes.
7
- */
8
- export class Poseidon {
7
+ */ export class Poseidon {
9
8
  /*
10
- * @deprecated Don't call poseidon2 directly in production code. Instead, create suitably-named functions for specific
11
- * purposes.
12
- */
13
- hash(lhs, rhs) {
14
- return poseidon2Hash([Fr.fromBuffer(Buffer.from(lhs)), Fr.fromBuffer(Buffer.from(rhs))]).toBuffer();
9
+ * @deprecated Don't call poseidon2 directly in production code. Instead, create suitably-named functions for specific
10
+ * purposes.
11
+ */ hash(lhs, rhs) {
12
+ return poseidon2Hash([
13
+ Fr.fromBuffer(Buffer.from(lhs)),
14
+ Fr.fromBuffer(Buffer.from(rhs))
15
+ ]).toBuffer();
15
16
  }
16
17
  /*
17
- * @deprecated Don't call poseidon2 directly in production code. Instead, create suitably-named functions for specific
18
- * purposes.
19
- */
20
- hashInputs(inputs) {
21
- const inputFields = inputs.map(i => Fr.fromBuffer(i));
18
+ * @deprecated Don't call poseidon2 directly in production code. Instead, create suitably-named functions for specific
19
+ * purposes.
20
+ */ hashInputs(inputs) {
21
+ const inputFields = inputs.map((i)=>Fr.fromBuffer(i));
22
22
  return poseidon2Hash(inputFields).toBuffer();
23
23
  }
24
24
  }
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zZWlkb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcG9zZWlkb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUc5Qzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDbkI7OztPQUdHO0lBQ0ksSUFBSSxDQUFDLEdBQWUsRUFBRSxHQUFlO1FBQzFDLE9BQU8sYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RHLENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsTUFBZ0I7UUFDaEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxPQUFPLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0NBQ0YifQ==
package/dest/sha_256.js CHANGED
@@ -4,20 +4,20 @@ import { truncateAndPad } from '@aztec/foundation/serialize';
4
4
  * A helper class encapsulating SHA256 hash functionality.
5
5
  * @deprecated Don't call SHA256 directly in production code. Instead, create suitably-named functions for specific
6
6
  * purposes.
7
- */
8
- export class SHA256 {
7
+ */ export class SHA256 {
9
8
  /*
10
- * @deprecated Don't call SHA256 directly in production code. Instead, create suitably-named functions for specific
11
- * purposes.
12
- */
13
- hash(lhs, rhs) {
14
- return sha256(Buffer.concat([Buffer.from(lhs), Buffer.from(rhs)]));
9
+ * @deprecated Don't call SHA256 directly in production code. Instead, create suitably-named functions for specific
10
+ * purposes.
11
+ */ hash(lhs, rhs) {
12
+ return sha256(Buffer.concat([
13
+ Buffer.from(lhs),
14
+ Buffer.from(rhs)
15
+ ]));
15
16
  }
16
17
  /*
17
- * @deprecated Don't call SHA256 directly in production code. Instead, create suitably-named functions for specific
18
- * purposes.
19
- */
20
- hashInputs(inputs) {
18
+ * @deprecated Don't call SHA256 directly in production code. Instead, create suitably-named functions for specific
19
+ * purposes.
20
+ */ hashInputs(inputs) {
21
21
  return sha256(Buffer.concat(inputs));
22
22
  }
23
23
  }
@@ -25,21 +25,20 @@ export class SHA256 {
25
25
  * A helper class encapsulating truncated SHA256 hash functionality.
26
26
  * @deprecated Don't call SHA256 directly in production code. Instead, create suitably-named functions for specific
27
27
  * purposes.
28
- */
29
- export class SHA256Trunc {
28
+ */ export class SHA256Trunc {
30
29
  /*
31
- * @deprecated Don't call SHA256 directly in production code. Instead, create suitably-named functions for specific
32
- * purposes.
33
- */
34
- hash(lhs, rhs) {
35
- return truncateAndPad(sha256(Buffer.concat([Buffer.from(lhs), Buffer.from(rhs)])));
30
+ * @deprecated Don't call SHA256 directly in production code. Instead, create suitably-named functions for specific
31
+ * purposes.
32
+ */ hash(lhs, rhs) {
33
+ return truncateAndPad(sha256(Buffer.concat([
34
+ Buffer.from(lhs),
35
+ Buffer.from(rhs)
36
+ ])));
36
37
  }
37
38
  /*
38
- * @deprecated Don't call SHA256 directly in production code. Instead, create suitably-named functions for specific
39
- * purposes.
40
- */
41
- hashInputs(inputs) {
39
+ * @deprecated Don't call SHA256 directly in production code. Instead, create suitably-named functions for specific
40
+ * purposes.
41
+ */ hashInputs(inputs) {
42
42
  return truncateAndPad(sha256(Buffer.concat(inputs)));
43
43
  }
44
44
  }
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhXzI1Ni5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zaGFfMjU2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHN0Q7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxNQUFNO0lBQ2pCOzs7T0FHRztJQUNJLElBQUksQ0FBQyxHQUFlLEVBQUUsR0FBZTtRQUMxQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsTUFBZ0I7UUFDaEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUN0Qjs7O09BR0c7SUFDSSxJQUFJLENBQUMsR0FBZSxFQUFFLEdBQWU7UUFDMUMsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksVUFBVSxDQUFDLE1BQWdCO1FBQ2hDLE9BQU8sY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0YifQ==
@@ -1,11 +1,9 @@
1
- var _AppendOnlySnapshotBuilder_instances, _AppendOnlySnapshotBuilder_nodeValue, _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock, _AppendOnlySnapshotBuilder_snapshotMetadata, _AppendOnlySnapshotBuilder_getSnapshotMeta, _AppendOnlySnapshot_instances, _AppendOnlySnapshot_getHistoricalNodeValue, _AppendOnlySnapshot_getBlockNumberThatModifiedNode;
2
- import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
1
  import { SiblingPath } from '@aztec/circuit-types';
4
2
  import { serializeToBuffer } from '@aztec/foundation/serialize';
5
3
  // stores the last block that modified this node
6
- const nodeModifiedAtBlockKey = (level, index) => `node:${level}:${index}:modifiedAtBlock`;
4
+ const nodeModifiedAtBlockKey = (level, index)=>`node:${level}:${index}:modifiedAtBlock`;
7
5
  // stores the value of the node at the above block
8
- const historicalNodeKey = (level, index) => `node:${level}:${index}:value`;
6
+ const historicalNodeKey = (level, index)=>`node:${level}:${index}:value`;
9
7
  /**
10
8
  * A more space-efficient way of storing snapshots of AppendOnlyTrees that trades space need for slower
11
9
  * sibling path reads.
@@ -20,85 +18,106 @@ const historicalNodeKey = (level, index) => `node:${level}:${index}:value`;
20
18
  * Sibling path access:
21
19
  * Best case: O(H) database reads + O(1) hashes
22
20
  * Worst case: O(H) database reads + O(H) hashes
23
- */
24
- export class AppendOnlySnapshotBuilder {
25
- constructor(db, tree, hasher, deserializer) {
26
- _AppendOnlySnapshotBuilder_instances.add(this);
21
+ */ export class AppendOnlySnapshotBuilder {
22
+ db;
23
+ tree;
24
+ hasher;
25
+ deserializer;
26
+ #nodeValue;
27
+ #nodeLastModifiedByBlock;
28
+ #snapshotMetadata;
29
+ constructor(db, tree, hasher, deserializer){
27
30
  this.db = db;
28
31
  this.tree = tree;
29
32
  this.hasher = hasher;
30
33
  this.deserializer = deserializer;
31
- _AppendOnlySnapshotBuilder_nodeValue.set(this, void 0);
32
- _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock.set(this, void 0);
33
- _AppendOnlySnapshotBuilder_snapshotMetadata.set(this, void 0);
34
34
  const treeName = tree.getName();
35
- __classPrivateFieldSet(this, _AppendOnlySnapshotBuilder_nodeValue, db.openMap(`append_only_snapshot:${treeName}:node`), "f");
36
- __classPrivateFieldSet(this, _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock, db.openMap(`append_ony_snapshot:${treeName}:block`), "f");
37
- __classPrivateFieldSet(this, _AppendOnlySnapshotBuilder_snapshotMetadata, db.openMap(`append_only_snapshot:${treeName}:snapshot_metadata`), "f");
35
+ this.#nodeValue = db.openMap(`append_only_snapshot:${treeName}:node`);
36
+ this.#nodeLastModifiedByBlock = db.openMap(`append_ony_snapshot:${treeName}:block`);
37
+ this.#snapshotMetadata = db.openMap(`append_only_snapshot:${treeName}:snapshot_metadata`);
38
38
  }
39
39
  getSnapshot(block) {
40
- const meta = __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_instances, "m", _AppendOnlySnapshotBuilder_getSnapshotMeta).call(this, block);
40
+ const meta = this.#getSnapshotMeta(block);
41
41
  if (typeof meta === 'undefined') {
42
42
  return Promise.reject(new Error(`Snapshot for tree ${this.tree.getName()} at block ${block} does not exist`));
43
43
  }
44
- return Promise.resolve(new AppendOnlySnapshot(__classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeValue, "f"), __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock, "f"), block, meta.numLeaves, meta.root, this.tree, this.hasher, this.deserializer));
44
+ return Promise.resolve(new AppendOnlySnapshot(this.#nodeValue, this.#nodeLastModifiedByBlock, block, meta.numLeaves, meta.root, this.tree, this.hasher, this.deserializer));
45
45
  }
46
46
  snapshot(block) {
47
- return this.db.transaction(() => {
48
- const meta = __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_instances, "m", _AppendOnlySnapshotBuilder_getSnapshotMeta).call(this, block);
47
+ return this.db.transaction(()=>{
48
+ const meta = this.#getSnapshotMeta(block);
49
49
  if (typeof meta !== 'undefined') {
50
50
  // no-op, we already have a snapshot
51
- return new AppendOnlySnapshot(__classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeValue, "f"), __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock, "f"), block, meta.numLeaves, meta.root, this.tree, this.hasher, this.deserializer);
51
+ return new AppendOnlySnapshot(this.#nodeValue, this.#nodeLastModifiedByBlock, block, meta.numLeaves, meta.root, this.tree, this.hasher, this.deserializer);
52
52
  }
53
53
  const root = this.tree.getRoot(false);
54
54
  const depth = this.tree.getDepth();
55
- const queue = [[root, 0, 0n]];
55
+ const queue = [
56
+ [
57
+ root,
58
+ 0,
59
+ 0n
60
+ ]
61
+ ];
56
62
  // walk the tree in BF and store latest nodes
57
- while (queue.length > 0) {
63
+ while(queue.length > 0){
58
64
  const [node, level, index] = queue.shift();
59
- const historicalValue = __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeValue, "f").get(historicalNodeKey(level, index));
65
+ const historicalValue = this.#nodeValue.get(historicalNodeKey(level, index));
60
66
  if (!historicalValue || !node.equals(historicalValue)) {
61
67
  // we've never seen this node before or it's different than before
62
68
  // update the historical tree and tag it with the block that modified it
63
- void __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock, "f").set(nodeModifiedAtBlockKey(level, index), block);
64
- void __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeValue, "f").set(historicalNodeKey(level, index), node);
65
- }
66
- else {
67
- // if this node hasn't changed, that means, nothing below it has changed either
69
+ void this.#nodeLastModifiedByBlock.set(nodeModifiedAtBlockKey(level, index), block);
70
+ void this.#nodeValue.set(historicalNodeKey(level, index), node);
71
+ } else {
68
72
  continue;
69
73
  }
70
74
  if (level + 1 > depth) {
71
- // short circuit if we've reached the leaf level
72
- // otherwise getNode might throw if we ask for the children of a leaf
73
75
  continue;
74
76
  }
75
77
  // these could be undefined because zero hashes aren't stored in the tree
76
- const [lhs, rhs] = [this.tree.getNode(level + 1, 2n * index), this.tree.getNode(level + 1, 2n * index + 1n)];
78
+ const [lhs, rhs] = [
79
+ this.tree.getNode(level + 1, 2n * index),
80
+ this.tree.getNode(level + 1, 2n * index + 1n)
81
+ ];
77
82
  if (lhs) {
78
- queue.push([lhs, level + 1, 2n * index]);
83
+ queue.push([
84
+ lhs,
85
+ level + 1,
86
+ 2n * index
87
+ ]);
79
88
  }
80
89
  if (rhs) {
81
- queue.push([rhs, level + 1, 2n * index + 1n]);
90
+ queue.push([
91
+ rhs,
92
+ level + 1,
93
+ 2n * index + 1n
94
+ ]);
82
95
  }
83
96
  }
84
97
  const numLeaves = this.tree.getNumLeaves(false);
85
- void __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_snapshotMetadata, "f").set(block, {
98
+ void this.#snapshotMetadata.set(block, {
86
99
  numLeaves,
87
- root,
100
+ root
88
101
  });
89
- return new AppendOnlySnapshot(__classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeValue, "f"), __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock, "f"), block, numLeaves, root, this.tree, this.hasher, this.deserializer);
102
+ return new AppendOnlySnapshot(this.#nodeValue, this.#nodeLastModifiedByBlock, block, numLeaves, root, this.tree, this.hasher, this.deserializer);
90
103
  });
91
104
  }
105
+ #getSnapshotMeta(block) {
106
+ return this.#snapshotMetadata.get(block);
107
+ }
92
108
  }
93
- _AppendOnlySnapshotBuilder_nodeValue = new WeakMap(), _AppendOnlySnapshotBuilder_nodeLastModifiedByBlock = new WeakMap(), _AppendOnlySnapshotBuilder_snapshotMetadata = new WeakMap(), _AppendOnlySnapshotBuilder_instances = new WeakSet(), _AppendOnlySnapshotBuilder_getSnapshotMeta = function _AppendOnlySnapshotBuilder_getSnapshotMeta(block) {
94
- return __classPrivateFieldGet(this, _AppendOnlySnapshotBuilder_snapshotMetadata, "f").get(block);
95
- };
96
109
  /**
97
110
  * a
98
- */
99
- class AppendOnlySnapshot {
100
- constructor(nodes, nodeHistory, block, leafCount, historicalRoot, tree, hasher, deserializer) {
101
- _AppendOnlySnapshot_instances.add(this);
111
+ */ class AppendOnlySnapshot {
112
+ nodes;
113
+ nodeHistory;
114
+ block;
115
+ leafCount;
116
+ historicalRoot;
117
+ tree;
118
+ hasher;
119
+ deserializer;
120
+ constructor(nodes, nodeHistory, block, leafCount, historicalRoot, tree, hasher, deserializer){
102
121
  this.nodes = nodes;
103
122
  this.nodeHistory = nodeHistory;
104
123
  this.block = block;
@@ -112,10 +131,10 @@ class AppendOnlySnapshot {
112
131
  const path = [];
113
132
  const depth = this.tree.getDepth();
114
133
  let level = depth;
115
- while (level > 0) {
134
+ while(level > 0){
116
135
  const isRight = index & 0x01n;
117
136
  const siblingIndex = isRight ? index - 1n : index + 1n;
118
- const sibling = __classPrivateFieldGet(this, _AppendOnlySnapshot_instances, "m", _AppendOnlySnapshot_getHistoricalNodeValue).call(this, level, siblingIndex);
137
+ const sibling = this.#getHistoricalNodeValue(level, siblingIndex);
119
138
  path.push(sibling);
120
139
  level -= 1;
121
140
  index >>= 1n;
@@ -134,7 +153,7 @@ class AppendOnlySnapshot {
134
153
  }
135
154
  getLeafValue(index) {
136
155
  const leafLevel = this.getDepth();
137
- const blockNumber = __classPrivateFieldGet(this, _AppendOnlySnapshot_instances, "m", _AppendOnlySnapshot_getBlockNumberThatModifiedNode).call(this, leafLevel, index);
156
+ const blockNumber = this.#getBlockNumberThatModifiedNode(leafLevel, index);
138
157
  // leaf hasn't been set yet
139
158
  if (typeof blockNumber === 'undefined') {
140
159
  return undefined;
@@ -147,13 +166,46 @@ class AppendOnlySnapshot {
147
166
  // leaf has been set but in a block in the future
148
167
  return undefined;
149
168
  }
169
+ #getHistoricalNodeValue(level, index) {
170
+ const blockNumber = this.#getBlockNumberThatModifiedNode(level, index);
171
+ // node has never been set
172
+ if (typeof blockNumber === 'undefined') {
173
+ return this.tree.getZeroHash(level);
174
+ }
175
+ // node was set some time in the past
176
+ if (blockNumber <= this.block) {
177
+ return this.nodes.get(historicalNodeKey(level, index));
178
+ }
179
+ // the node has been modified since this snapshot was taken
180
+ // because we're working with an AppendOnly tree, historical leaves never change
181
+ // so what we do instead is rebuild this Merkle path up using zero hashes as needed
182
+ // worst case this will do O(H) hashes
183
+ //
184
+ // we first check if this subtree was touched by the block
185
+ // compare how many leaves this block added to the leaf interval of this subtree
186
+ // if they don't intersect then the whole subtree was a hash of zero
187
+ // if they do then we need to rebuild the merkle tree
188
+ const depth = this.tree.getDepth();
189
+ const leafStart = index * 2n ** BigInt(depth - level);
190
+ if (leafStart >= this.leafCount) {
191
+ return this.tree.getZeroHash(level);
192
+ }
193
+ const [lhs, rhs] = [
194
+ this.#getHistoricalNodeValue(level + 1, 2n * index),
195
+ this.#getHistoricalNodeValue(level + 1, 2n * index + 1n)
196
+ ];
197
+ return this.hasher.hash(lhs, rhs);
198
+ }
199
+ #getBlockNumberThatModifiedNode(level, index) {
200
+ return this.nodeHistory.get(nodeModifiedAtBlockKey(level, index));
201
+ }
150
202
  findLeafIndex(value) {
151
203
  return this.findLeafIndexAfter(value, 0n);
152
204
  }
153
205
  findLeafIndexAfter(value, startIndex) {
154
206
  const valueBuffer = serializeToBuffer(value);
155
207
  const numLeaves = this.getNumLeaves();
156
- for (let i = startIndex; i < numLeaves; i++) {
208
+ for(let i = startIndex; i < numLeaves; i++){
157
209
  const currentValue = this.getLeafValue(i);
158
210
  if (currentValue && serializeToBuffer(currentValue).equals(valueBuffer)) {
159
211
  return i;
@@ -162,36 +214,3 @@ class AppendOnlySnapshot {
162
214
  return undefined;
163
215
  }
164
216
  }
165
- _AppendOnlySnapshot_instances = new WeakSet(), _AppendOnlySnapshot_getHistoricalNodeValue = function _AppendOnlySnapshot_getHistoricalNodeValue(level, index) {
166
- const blockNumber = __classPrivateFieldGet(this, _AppendOnlySnapshot_instances, "m", _AppendOnlySnapshot_getBlockNumberThatModifiedNode).call(this, level, index);
167
- // node has never been set
168
- if (typeof blockNumber === 'undefined') {
169
- return this.tree.getZeroHash(level);
170
- }
171
- // node was set some time in the past
172
- if (blockNumber <= this.block) {
173
- return this.nodes.get(historicalNodeKey(level, index));
174
- }
175
- // the node has been modified since this snapshot was taken
176
- // because we're working with an AppendOnly tree, historical leaves never change
177
- // so what we do instead is rebuild this Merkle path up using zero hashes as needed
178
- // worst case this will do O(H) hashes
179
- //
180
- // we first check if this subtree was touched by the block
181
- // compare how many leaves this block added to the leaf interval of this subtree
182
- // if they don't intersect then the whole subtree was a hash of zero
183
- // if they do then we need to rebuild the merkle tree
184
- const depth = this.tree.getDepth();
185
- const leafStart = index * 2n ** BigInt(depth - level);
186
- if (leafStart >= this.leafCount) {
187
- return this.tree.getZeroHash(level);
188
- }
189
- const [lhs, rhs] = [
190
- __classPrivateFieldGet(this, _AppendOnlySnapshot_instances, "m", _AppendOnlySnapshot_getHistoricalNodeValue).call(this, level + 1, 2n * index),
191
- __classPrivateFieldGet(this, _AppendOnlySnapshot_instances, "m", _AppendOnlySnapshot_getHistoricalNodeValue).call(this, level + 1, 2n * index + 1n),
192
- ];
193
- return this.hasher.hash(lhs, rhs);
194
- }, _AppendOnlySnapshot_getBlockNumberThatModifiedNode = function _AppendOnlySnapshot_getBlockNumberThatModifiedNode(level, index) {
195
- return this.nodeHistory.get(nodeModifiedAtBlockKey(level, index));
196
- };
197
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwZW5kX29ubHlfc25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc25hcHNob3RzL2FwcGVuZF9vbmx5X3NuYXBzaG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBb0MsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQVFsRyxnREFBZ0Q7QUFDaEQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLFFBQVEsS0FBSyxJQUFJLEtBQUssa0JBQWtCLENBQUM7QUFFMUcsa0RBQWtEO0FBQ2xELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFhLEVBQUUsS0FBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEtBQUssSUFBSSxLQUFLLFFBQVEsQ0FBQztBQVkzRjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sT0FBTyx5QkFBeUI7SUFLcEMsWUFDVSxFQUFnQixFQUNoQixJQUFxQyxFQUNyQyxNQUFjLEVBQ2QsWUFBMkI7O1FBSDNCLE9BQUUsR0FBRixFQUFFLENBQWM7UUFDaEIsU0FBSSxHQUFKLElBQUksQ0FBaUM7UUFDckMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGlCQUFZLEdBQVosWUFBWSxDQUFlO1FBUnJDLHVEQUFtRTtRQUNuRSxxRUFBc0Y7UUFDdEYsOERBQXNEO1FBUXBELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQyx1QkFBQSxJQUFJLHdDQUFjLEVBQUUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLFFBQVEsT0FBTyxDQUFDLE1BQUEsQ0FBQztRQUN0RSx1QkFBQSxJQUFJLHNEQUE0QixFQUFFLENBQUMsT0FBTyxDQUFDLHVCQUF1QixRQUFRLFFBQVEsQ0FBQyxNQUFBLENBQUM7UUFDcEYsdUJBQUEsSUFBSSwrQ0FBcUIs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