@aztec/foundation 0.69.1 → 0.70.0

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 (45) hide show
  1. package/dest/abi/note_selector.d.ts +5 -2
  2. package/dest/abi/note_selector.d.ts.map +1 -1
  3. package/dest/abi/note_selector.js +12 -4
  4. package/dest/collection/array.d.ts +8 -0
  5. package/dest/collection/array.d.ts.map +1 -1
  6. package/dest/collection/array.js +28 -1
  7. package/dest/config/env_var.d.ts +1 -1
  8. package/dest/config/env_var.d.ts.map +1 -1
  9. package/dest/json-rpc/server/safe_json_rpc_server.d.ts +7 -2
  10. package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -1
  11. package/dest/json-rpc/server/safe_json_rpc_server.js +18 -16
  12. package/dest/log/pino-logger.d.ts +3 -0
  13. package/dest/log/pino-logger.d.ts.map +1 -1
  14. package/dest/log/pino-logger.js +14 -2
  15. package/dest/promise/running-promise.d.ts.map +1 -1
  16. package/dest/promise/running-promise.js +9 -1
  17. package/dest/queue/serial_queue.d.ts +1 -0
  18. package/dest/queue/serial_queue.d.ts.map +1 -1
  19. package/dest/queue/serial_queue.js +6 -1
  20. package/dest/testing/files/index.d.ts +2 -1
  21. package/dest/testing/files/index.d.ts.map +1 -1
  22. package/dest/testing/files/index.js +6 -2
  23. package/dest/trees/index.d.ts +2 -1
  24. package/dest/trees/index.d.ts.map +1 -1
  25. package/dest/trees/index.js +3 -2
  26. package/dest/trees/{unbalanced_merkle_root.d.ts → unbalanced_merkle_tree.d.ts} +6 -2
  27. package/dest/trees/unbalanced_merkle_tree.d.ts.map +1 -0
  28. package/dest/trees/{unbalanced_merkle_root.js → unbalanced_merkle_tree.js} +40 -2
  29. package/dest/trees/unbalanced_tree_store.d.ts +19 -0
  30. package/dest/trees/unbalanced_tree_store.d.ts.map +1 -0
  31. package/dest/trees/unbalanced_tree_store.js +80 -0
  32. package/package.json +2 -2
  33. package/src/abi/note_selector.ts +11 -4
  34. package/src/collection/array.ts +31 -0
  35. package/src/config/env_var.ts +5 -2
  36. package/src/json-rpc/server/safe_json_rpc_server.ts +22 -15
  37. package/src/log/pino-logger.ts +19 -2
  38. package/src/promise/running-promise.ts +8 -0
  39. package/src/queue/serial_queue.ts +5 -0
  40. package/src/testing/files/index.ts +6 -1
  41. package/src/trees/index.ts +2 -1
  42. package/src/trees/unbalanced_merkle_tree.ts +103 -0
  43. package/src/trees/unbalanced_tree_store.ts +102 -0
  44. package/dest/trees/unbalanced_merkle_root.d.ts.map +0 -1
  45. package/src/trees/unbalanced_merkle_root.ts +0 -52
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/files/index.ts"],"names":[],"mappings":";;AAOA,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,QAStF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAenG;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAMnF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/files/index.ts"],"names":[],"mappings":";;AAOA,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,QAStF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAenG;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAMnF"}
@@ -14,6 +14,10 @@ export function writeTestData(targetFileFromRepoRoot, contents) {
14
14
  const logger = createConsoleLogger('aztec:testing:test_data');
15
15
  logger(`Wrote test data to ${targetFile}`);
16
16
  }
17
+ export function readTestData(repoPath) {
18
+ const targetFile = getPathToFile(repoPath);
19
+ return readFileSync(targetFile);
20
+ }
17
21
  /**
18
22
  * Looks for a variable assignment in the target file and updates the value, only if test data generation is enabled.
19
23
  * Note that a magic inline comment would be a cleaner approach, like `/* TEST-DATA-START *\/` and `/* TEST-DATA-END *\/`,
@@ -38,7 +42,7 @@ export function updateInlineTestData(targetFileFromRepoRoot, itemName, value) {
38
42
  /**
39
43
  * Updates the sample Prover.toml files in noir-projects/noir-protocol-circuits/crates/.
40
44
  * @remarks Requires AZTEC_GENERATE_TEST_DATA=1 to be set
41
- * To re-gen, run 'AZTEC_GENERATE_TEST_DATA=1 FAKE_PROOFS=1 yarn test:e2e-no-docker full.test '
45
+ * To re-gen, run 'AZTEC_GENERATE_TEST_DATA=1 FAKE_PROOFS=1 yarn test:e2e full.test '
42
46
  */
43
47
  export function updateProtocolCircuitSampleInputs(circuitName, value) {
44
48
  const logger = createConsoleLogger('aztec:testing:test_data');
@@ -54,4 +58,4 @@ function getPathToFile(targetFileFromRepoRoot) {
54
58
  }
55
59
  return join(repoRoot, targetFileFromRepoRoot);
56
60
  }
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9maWxlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RCwyRkFBMkY7QUFDM0YsTUFBTSxVQUFVLGFBQWEsQ0FBQyxzQkFBOEIsRUFBRSxRQUF5QjtJQUNyRixJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDekQsTUFBTSxPQUFPLEdBQUcsT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkYsYUFBYSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuQyxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzlELE1BQU0sQ0FBQyxzQkFBc0IsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsc0JBQThCLEVBQUUsUUFBZ0IsRUFBRSxLQUFhO0lBQ2xHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLENBQUM7UUFDakMsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzlELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxRQUFRLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM5RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLFFBQVEsaUJBQWlCLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sUUFBUSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDbEYsYUFBYSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUMzQyxNQUFNLENBQUMsd0JBQXdCLFVBQVUsUUFBUSxRQUFRLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxpQ0FBaUMsQ0FBQyxXQUFtQixFQUFFLEtBQWE7SUFDbEYsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM5RCxNQUFNLHNCQUFzQixHQUFHLCtDQUErQyxXQUFXLGNBQWMsQ0FBQztJQUN4RyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6RCxhQUFhLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sQ0FBQyx3QkFBd0IsVUFBVSxRQUFRLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLHNCQUE4QjtJQUNuRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNyRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0FBQ2hELENBQUMifQ==
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9maWxlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RCwyRkFBMkY7QUFDM0YsTUFBTSxVQUFVLGFBQWEsQ0FBQyxzQkFBOEIsRUFBRSxRQUF5QjtJQUNyRixJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDekQsTUFBTSxPQUFPLEdBQUcsT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkYsYUFBYSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuQyxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzlELE1BQU0sQ0FBQyxzQkFBc0IsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxRQUFnQjtJQUMzQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLHNCQUE4QixFQUFFLFFBQWdCLEVBQUUsS0FBYTtJQUNsRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM5RCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdELE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sUUFBUSxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDOUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixRQUFRLGlCQUFpQixVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLFFBQVEsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2xGLGFBQWEsQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDM0MsTUFBTSxDQUFDLHdCQUF3QixVQUFVLFFBQVEsUUFBUSxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsaUNBQWlDLENBQUMsV0FBbUIsRUFBRSxLQUFhO0lBQ2xGLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDOUQsTUFBTSxzQkFBc0IsR0FBRywrQ0FBK0MsV0FBVyxjQUFjLENBQUM7SUFDeEcsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDekQsYUFBYSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqQyxNQUFNLENBQUMsd0JBQXdCLFVBQVUsUUFBUSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxzQkFBOEI7SUFDbkQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDckYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztBQUNoRCxDQUFDIn0=
@@ -1,6 +1,7 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
2
  /// <reference types="node" resolution-mode="require"/>
3
- export * from './unbalanced_merkle_root.js';
3
+ export * from './unbalanced_merkle_tree.js';
4
+ export * from './unbalanced_tree_store.js';
4
5
  /**
5
6
  * A leaf of an indexed merkle tree.
6
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trees/index.ts"],"names":[],"mappings":";;AAAA,cAAc,6BAA6B,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAC;IACnB;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC;IACjB;;OAEG;IACH,MAAM,IAAI,eAAe,CAAC;IAC1B;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,UAAU,IAAI,MAAM,CAAC;IACrB;;OAEG;IACH,YAAY,IAAI,MAAM,CAAC;CACxB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trees/index.ts"],"names":[],"mappings":";;AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAC;IACnB;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC;IACjB;;OAEG;IACH,MAAM,IAAI,eAAe,CAAC;IAC1B;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,UAAU,IAAI,MAAM,CAAC;IACrB;;OAEG;IACH,YAAY,IAAI,MAAM,CAAC;CACxB"}
@@ -1,2 +1,3 @@
1
- export * from './unbalanced_merkle_root.js';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJlZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw2QkFBNkIsQ0FBQyJ9
1
+ export * from './unbalanced_merkle_tree.js';
2
+ export * from './unbalanced_tree_store.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJlZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDRCQUE0QixDQUFDIn0=
@@ -4,10 +4,14 @@ import { sha256Trunc } from '@aztec/foundation/crypto';
4
4
  /**
5
5
  * Computes the merkle root for an unbalanced tree.
6
6
  *
7
- * @dev Adapted from proving-state.ts -> findMergeLevel and unbalanced_tree.ts.
7
+ * @dev Adapted from unbalanced_tree.ts.
8
8
  * Calculates the tree upwards layer by layer until we reach the root.
9
9
  * The L1 calculation instead computes the tree from right to left (slightly cheaper gas).
10
10
  * TODO: A more thorough investigation of which method is cheaper, then use that method everywhere.
11
11
  */
12
12
  export declare function computeUnbalancedMerkleRoot(leaves: Buffer[], emptyLeaf?: Buffer, hasher?: typeof sha256Trunc): Buffer;
13
- //# sourceMappingURL=unbalanced_merkle_root.d.ts.map
13
+ export declare function findLeafLevelAndIndex(numLeaves: number, leafIndex: number): {
14
+ level: number;
15
+ indexAtLevel: number;
16
+ };
17
+ //# sourceMappingURL=unbalanced_merkle_tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unbalanced_merkle_tree.d.ts","sourceRoot":"","sources":["../../src/trees/unbalanced_merkle_tree.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,qBAAc,GAAG,MAAM,CAwC9G;AAgDD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;EAGzE"}
@@ -3,7 +3,7 @@ import { sha256Trunc } from '@aztec/foundation/crypto';
3
3
  /**
4
4
  * Computes the merkle root for an unbalanced tree.
5
5
  *
6
- * @dev Adapted from proving-state.ts -> findMergeLevel and unbalanced_tree.ts.
6
+ * @dev Adapted from unbalanced_tree.ts.
7
7
  * Calculates the tree upwards layer by layer until we reach the root.
8
8
  * The L1 calculation instead computes the tree from right to left (slightly cheaper gas).
9
9
  * TODO: A more thorough investigation of which method is cheaper, then use that method everywhere.
@@ -49,4 +49,42 @@ export function computeUnbalancedMerkleRoot(leaves, emptyLeaf, hasher = sha256Tr
49
49
  // return the root
50
50
  return thisLayer[0];
51
51
  }
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iYWxhbmNlZF9tZXJrbGVfcm9vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmVlcy91bmJhbGFuY2VkX21lcmtsZV9yb290LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxNQUFnQixFQUFFLFNBQWtCLEVBQUUsTUFBTSxHQUFHLFdBQVc7SUFDcEcsa0JBQWtCO0lBQ2xCLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QixJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDMUUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FDM0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RywwREFBMEQ7SUFDMUQsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDNUMsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2QywyQ0FBMkM7WUFDM0MsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCxVQUFVLElBQUksQ0FBQyxDQUFDO1FBQ2hCLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25CLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN2QixnR0FBZ0c7Z0JBQ2hHLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzVCLFVBQVUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixpR0FBaUc7Z0JBQ2pHLFVBQVUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLFdBQVcsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUM7UUFDRCxtQkFBbUI7UUFDbkIsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN0QixTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFDRCxrQkFBa0I7SUFDbEIsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsQ0FBQyJ9
52
+ function getMaxBalancedTreeDepth(numLeaves) {
53
+ return Math.floor(Math.log2(numLeaves));
54
+ }
55
+ function getMaxUnbalancedTreeDepth(numLeaves) {
56
+ return Math.ceil(Math.log2(numLeaves));
57
+ }
58
+ function findPosition(rootLevel, leafLevel, numLeaves, indexOffset, targetIndex) {
59
+ if (numLeaves <= 1) {
60
+ // Single leaf.
61
+ return { level: rootLevel, indexAtLevel: indexOffset };
62
+ }
63
+ // The largest balanced tree that can be created with the given number of leaves.
64
+ const maxBalancedTreeDepth = getMaxBalancedTreeDepth(numLeaves);
65
+ const numBalancedLeaves = 2 ** maxBalancedTreeDepth;
66
+ const numRemainingLeaves = numLeaves - numBalancedLeaves;
67
+ if (targetIndex < numBalancedLeaves) {
68
+ // Target is in the balanced tree.
69
+ // - If numRemainingLeaves is 0: this balanced tree is grown from the current root.
70
+ // - If numRemainingLeaves is not 0: the remaining leaves will form another tree, which will become the right child of the root.
71
+ // And the balanced tree will be the left child of the root.
72
+ // There will be an extra level between the root of the balanced tree and the current root.
73
+ const extraLevel = numRemainingLeaves ? 1 : 0;
74
+ return { level: rootLevel + maxBalancedTreeDepth + extraLevel, indexAtLevel: indexOffset + targetIndex };
75
+ }
76
+ else {
77
+ // Target is in the right branch.
78
+ const rightBranchMaxLevel = getMaxUnbalancedTreeDepth(numRemainingLeaves);
79
+ const shiftedUp = leafLevel - rootLevel - rightBranchMaxLevel - 1;
80
+ const nextLeafLevel = leafLevel - shiftedUp;
81
+ const newIndexOffset = (indexOffset + numBalancedLeaves) >> shiftedUp;
82
+ const shiftedTargetIndex = targetIndex - numBalancedLeaves;
83
+ return findPosition(rootLevel + 1, nextLeafLevel, numRemainingLeaves, newIndexOffset, shiftedTargetIndex);
84
+ }
85
+ }
86
+ export function findLeafLevelAndIndex(numLeaves, leafIndex) {
87
+ const maxLevel = getMaxUnbalancedTreeDepth(numLeaves);
88
+ return findPosition(0, maxLevel, numLeaves, 0, leafIndex);
89
+ }
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iYWxhbmNlZF9tZXJrbGVfdHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmVlcy91bmJhbGFuY2VkX21lcmtsZV90cmVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxNQUFnQixFQUFFLFNBQWtCLEVBQUUsTUFBTSxHQUFHLFdBQVc7SUFDcEcsa0JBQWtCO0lBQ2xCLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QixJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDMUUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FDM0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RywwREFBMEQ7SUFDMUQsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDNUMsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2QywyQ0FBMkM7WUFDM0MsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCxVQUFVLElBQUksQ0FBQyxDQUFDO1FBQ2hCLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25CLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN2QixnR0FBZ0c7Z0JBQ2hHLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzVCLFVBQVUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixpR0FBaUc7Z0JBQ2pHLFVBQVUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLFdBQVcsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUM7UUFDRCxtQkFBbUI7UUFDbkIsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN0QixTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFDRCxrQkFBa0I7SUFDbEIsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUMsU0FBaUI7SUFDaEQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQsU0FBUyx5QkFBeUIsQ0FBQyxTQUFpQjtJQUNsRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDbkIsU0FBaUIsRUFDakIsU0FBaUIsRUFDakIsU0FBaUIsRUFDakIsV0FBbUIsRUFDbkIsV0FBbUI7SUFFbkIsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkIsZUFBZTtRQUNmLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQsaUZBQWlGO0lBQ2pGLE1BQU0sb0JBQW9CLEdBQUcsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEUsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLElBQUksb0JBQW9CLENBQUM7SUFDcEQsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLEdBQUcsaUJBQWlCLENBQUM7SUFFekQsSUFBSSxXQUFXLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztRQUNwQyxrQ0FBa0M7UUFFbEMsbUZBQW1GO1FBQ25GLGdJQUFnSTtRQUNoSSw4REFBOEQ7UUFDOUQsNkZBQTZGO1FBQzdGLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FBRyxvQkFBb0IsR0FBRyxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsR0FBRyxXQUFXLEVBQUUsQ0FBQztJQUMzRyxDQUFDO1NBQU0sQ0FBQztRQUNOLGlDQUFpQztRQUNqQyxNQUFNLG1CQUFtQixHQUFHLHlCQUF5QixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDMUUsTUFBTSxTQUFTLEdBQUcsU0FBUyxHQUFHLFNBQVMsR0FBRyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDbEUsTUFBTSxhQUFhLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUM1QyxNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUN0RSxNQUFNLGtCQUFrQixHQUFHLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQztRQUMzRCxPQUFPLFlBQVksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUM1RyxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxTQUFpQixFQUFFLFNBQWlCO0lBQ3hFLE1BQU0sUUFBUSxHQUFHLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sWUFBWSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM1RCxDQUFDIn0=
@@ -0,0 +1,19 @@
1
+ export interface TreeNodeLocation {
2
+ level: number;
3
+ index: number;
4
+ }
5
+ export declare class UnbalancedTreeStore<T> {
6
+ #private;
7
+ constructor(numLeaves: number);
8
+ setLeaf(leafIndex: number, value: T): TreeNodeLocation;
9
+ setNode({ level, index }: TreeNodeLocation, value: T): void;
10
+ getParentLocation({ level, index }: TreeNodeLocation): TreeNodeLocation;
11
+ getSiblingLocation({ level, index }: TreeNodeLocation): TreeNodeLocation;
12
+ getChildLocations({ level, index }: TreeNodeLocation): [TreeNodeLocation, TreeNodeLocation];
13
+ getLeaf(leafIndex: number): T | undefined;
14
+ getNode(location: TreeNodeLocation): T | undefined;
15
+ getParent(location: TreeNodeLocation): T | undefined;
16
+ getSibling(location: TreeNodeLocation): T | undefined;
17
+ getChildren(location: TreeNodeLocation): [T | undefined, T | undefined];
18
+ }
19
+ //# sourceMappingURL=unbalanced_tree_store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unbalanced_tree_store.d.ts","sourceRoot":"","sources":["../../src/trees/unbalanced_tree_store.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAOD,qBAAa,mBAAmB,CAAC,CAAC;;gBAIpB,SAAS,EAAE,MAAM;IAI7B,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,gBAAgB;IAiBtD,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;IAWpD,iBAAiB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gBAAgB,GAAG,gBAAgB;IAQvE,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gBAAgB,GAAG,gBAAgB;IAQxE,iBAAiB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gBAAgB,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAM3F,OAAO,CAAC,SAAS,EAAE,MAAM;IASzB,OAAO,CAAC,QAAQ,EAAE,gBAAgB,GAAG,CAAC,GAAG,SAAS;IAIlD,SAAS,CAAC,QAAQ,EAAE,gBAAgB,GAAG,CAAC,GAAG,SAAS;IAKpD,UAAU,CAAC,QAAQ,EAAE,gBAAgB,GAAG,CAAC,GAAG,SAAS;IAKrD,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC;CAQxE"}
@@ -0,0 +1,80 @@
1
+ var _UnbalancedTreeStore_instances, _UnbalancedTreeStore_nodeMapping, _UnbalancedTreeStore_numLeaves, _UnbalancedTreeStore_getKey;
2
+ import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
+ import { findLeafLevelAndIndex } from './unbalanced_merkle_tree.js';
4
+ export class UnbalancedTreeStore {
5
+ constructor(numLeaves) {
6
+ _UnbalancedTreeStore_instances.add(this);
7
+ _UnbalancedTreeStore_nodeMapping.set(this, new Map());
8
+ _UnbalancedTreeStore_numLeaves.set(this, void 0);
9
+ __classPrivateFieldSet(this, _UnbalancedTreeStore_numLeaves, numLeaves, "f");
10
+ }
11
+ setLeaf(leafIndex, value) {
12
+ if (leafIndex >= __classPrivateFieldGet(this, _UnbalancedTreeStore_numLeaves, "f")) {
13
+ throw new Error(`Expected at most ${__classPrivateFieldGet(this, _UnbalancedTreeStore_numLeaves, "f")} leaves. Received a leaf at index ${leafIndex}.`);
14
+ }
15
+ const { level, indexAtLevel } = findLeafLevelAndIndex(__classPrivateFieldGet(this, _UnbalancedTreeStore_numLeaves, "f"), leafIndex);
16
+ const location = {
17
+ level,
18
+ index: indexAtLevel,
19
+ };
20
+ __classPrivateFieldGet(this, _UnbalancedTreeStore_nodeMapping, "f").set(__classPrivateFieldGet(this, _UnbalancedTreeStore_instances, "m", _UnbalancedTreeStore_getKey).call(this, location), {
21
+ location,
22
+ value,
23
+ });
24
+ return location;
25
+ }
26
+ setNode({ level, index }, value) {
27
+ const location = {
28
+ level,
29
+ index,
30
+ };
31
+ __classPrivateFieldGet(this, _UnbalancedTreeStore_nodeMapping, "f").set(__classPrivateFieldGet(this, _UnbalancedTreeStore_instances, "m", _UnbalancedTreeStore_getKey).call(this, location), {
32
+ location,
33
+ value,
34
+ });
35
+ }
36
+ getParentLocation({ level, index }) {
37
+ if (level === 0) {
38
+ throw new Error('Tree root does not have a parent.');
39
+ }
40
+ return { level: level - 1, index: Math.floor(index / 2) };
41
+ }
42
+ getSiblingLocation({ level, index }) {
43
+ if (level === 0) {
44
+ throw new Error('Tree root does not have a sibling.');
45
+ }
46
+ return { level, index: index % 2 ? index - 1 : index + 1 };
47
+ }
48
+ getChildLocations({ level, index }) {
49
+ const left = { level: level + 1, index: index * 2 };
50
+ const right = { level: level + 1, index: index * 2 + 1 };
51
+ return [left, right];
52
+ }
53
+ getLeaf(leafIndex) {
54
+ const { level, indexAtLevel } = findLeafLevelAndIndex(__classPrivateFieldGet(this, _UnbalancedTreeStore_numLeaves, "f"), leafIndex);
55
+ const location = {
56
+ level,
57
+ index: indexAtLevel,
58
+ };
59
+ return this.getNode(location);
60
+ }
61
+ getNode(location) {
62
+ return __classPrivateFieldGet(this, _UnbalancedTreeStore_nodeMapping, "f").get(__classPrivateFieldGet(this, _UnbalancedTreeStore_instances, "m", _UnbalancedTreeStore_getKey).call(this, location))?.value;
63
+ }
64
+ getParent(location) {
65
+ const parentLocation = this.getParentLocation(location);
66
+ return this.getNode(parentLocation);
67
+ }
68
+ getSibling(location) {
69
+ const siblingLocation = this.getSiblingLocation(location);
70
+ return this.getNode(siblingLocation);
71
+ }
72
+ getChildren(location) {
73
+ const [left, right] = this.getChildLocations(location);
74
+ return [this.getNode(left), this.getNode(right)];
75
+ }
76
+ }
77
+ _UnbalancedTreeStore_nodeMapping = new WeakMap(), _UnbalancedTreeStore_numLeaves = new WeakMap(), _UnbalancedTreeStore_instances = new WeakSet(), _UnbalancedTreeStore_getKey = function _UnbalancedTreeStore_getKey(location) {
78
+ return `${location.level}-${location.index}`;
79
+ };
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iYWxhbmNlZF90cmVlX3N0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyZWVzL3VuYmFsYW5jZWRfdHJlZV9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBWXBFLE1BQU0sT0FBTyxtQkFBbUI7SUFJOUIsWUFBWSxTQUFpQjs7UUFIN0IsMkNBQXlDLElBQUksR0FBRyxFQUFFLEVBQUM7UUFDMUMsaURBQW1CO1FBRzFCLHVCQUFBLElBQUksa0NBQWMsU0FBUyxNQUFBLENBQUM7SUFDOUIsQ0FBQztJQUVELE9BQU8sQ0FBQyxTQUFpQixFQUFFLEtBQVE7UUFDakMsSUFBSSxTQUFTLElBQUksdUJBQUEsSUFBSSxzQ0FBVyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsdUJBQUEsSUFBSSxzQ0FBVyxxQ0FBcUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUN4RyxDQUFDO1FBRUQsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQyx1QkFBQSxJQUFJLHNDQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEYsTUFBTSxRQUFRLEdBQUc7WUFDZixLQUFLO1lBQ0wsS0FBSyxFQUFFLFlBQVk7U0FDcEIsQ0FBQztRQUNGLHVCQUFBLElBQUksd0NBQWEsQ0FBQyxHQUFHLENBQUMsdUJBQUEsSUFBSSxtRUFBUSxNQUFaLElBQUksRUFBUyxRQUFRLENBQUMsRUFBRTtZQUM1QyxRQUFRO1lBQ1IsS0FBSztTQUNOLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFvQixFQUFFLEtBQVE7UUFDbEQsTUFBTSxRQUFRLEdBQUc7WUFDZixLQUFLO1lBQ0wsS0FBSztTQUNOLENBQUM7UUFDRix1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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/foundation",
3
- "version": "0.69.1",
3
+ "version": "0.70.0",
4
4
  "type": "module",
5
5
  "main": "./dest/index.js",
6
6
  "types": "./dest/index.d.ts",
@@ -102,7 +102,7 @@
102
102
  ]
103
103
  },
104
104
  "dependencies": {
105
- "@aztec/bb.js": "0.69.1",
105
+ "@aztec/bb.js": "0.70.0",
106
106
  "@koa/cors": "^5.0.0",
107
107
  "@noble/curves": "^1.2.0",
108
108
  "bn.js": "^5.2.1",
@@ -1,6 +1,6 @@
1
1
  import { toBigIntBE } from '../bigint-buffer/index.js';
2
- import { randomBytes } from '../crypto/index.js';
3
- import { type Fr } from '../fields/fields.js';
2
+ import { randomInt } from '../crypto/index.js';
3
+ import { Fr } from '../fields/fields.js';
4
4
  import { hexSchemaFor } from '../schemas/utils.js';
5
5
  import { BufferReader } from '../serialize/buffer_reader.js';
6
6
  import { TypeRegistry } from '../serialize/type_registry.js';
@@ -14,7 +14,10 @@ export interface NoteSelector {
14
14
  _branding: 'NoteSelector';
15
15
  }
16
16
 
17
- /** A note selector is the first 4 bytes of the hash of a note signature. */
17
+ /**
18
+ * A note selector is a 7 bit long value that identifies a note type within a contract.
19
+ * TODO(#10952): Encoding of note type id can be reduced to 7 bits.
20
+ */
18
21
  export class NoteSelector extends Selector {
19
22
  /**
20
23
  * Deserializes from a buffer or reader, corresponding to a write in cpp.
@@ -24,6 +27,9 @@ export class NoteSelector extends Selector {
24
27
  static fromBuffer(buffer: Buffer | BufferReader) {
25
28
  const reader = BufferReader.asReader(buffer);
26
29
  const value = Number(toBigIntBE(reader.readBytes(Selector.SIZE)));
30
+ if (value >= 1 << 7) {
31
+ throw new Error(`Invalid note selector: ${value}`);
32
+ }
27
33
  return new NoteSelector(value);
28
34
  }
29
35
 
@@ -55,7 +61,8 @@ export class NoteSelector extends Selector {
55
61
  * @returns A random selector.
56
62
  */
57
63
  static random() {
58
- return NoteSelector.fromBuffer(randomBytes(Selector.SIZE));
64
+ const value = randomInt(1 << 7);
65
+ return NoteSelector.fromField(new Fr(value));
59
66
  }
60
67
 
61
68
  toJSON() {
@@ -146,6 +146,11 @@ export function maxBy<T>(arr: T[], fn: (x: T) => number): T | undefined {
146
146
  return arr.reduce((max, x) => (fn(x) > fn(max) ? x : max), arr[0]);
147
147
  }
148
148
 
149
+ /** Computes the sum of a numeric array. */
150
+ export function sum(arr: number[]): number {
151
+ return arr.reduce((a, b) => a + b, 0);
152
+ }
153
+
149
154
  /** Computes the median of a numeric array. Returns undefined if array is empty. */
150
155
  export function median(arr: number[]) {
151
156
  if (arr.length === 0) {
@@ -155,3 +160,29 @@ export function median(arr: number[]) {
155
160
  const mid = Math.floor(sorted.length / 2);
156
161
  return sorted.length % 2 !== 0 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
157
162
  }
163
+
164
+ /** Computes the mean of a numeric array. Returns undefined if the array is empty. */
165
+ export function mean(values: number[]) {
166
+ if (values.length === 0) {
167
+ return undefined;
168
+ }
169
+ return values.reduce((a, b) => a + b, 0) / values.length;
170
+ }
171
+
172
+ /** Computes the variance of a numeric array. Returns undefined if there are less than 2 points. */
173
+ export function variance(values: number[]) {
174
+ if (values.length < 2) {
175
+ return undefined;
176
+ }
177
+ const avg = mean(values)!;
178
+ const points = values.map(value => value * value + avg * avg - 2 * value * avg);
179
+ return sum(points) / (values.length - 1);
180
+ }
181
+
182
+ /** Computes the standard deviation of a numeric array. Returns undefined if there are less than 2 points. */
183
+ export function stdDev(values: number[]) {
184
+ if (values.length < 2) {
185
+ return undefined;
186
+ }
187
+ return Math.sqrt(variance(values)!);
188
+ }
@@ -64,6 +64,7 @@ export type EnvVar =
64
64
  | 'NETWORK'
65
65
  | 'NO_PXE'
66
66
  | 'COIN_ISSUER_CONTRACT_ADDRESS'
67
+ | 'USE_GCLOUD_OBSERVABILITY'
67
68
  | 'OTEL_EXPORTER_OTLP_METRICS_ENDPOINT'
68
69
  | 'OTEL_EXPORTER_OTLP_TRACES_ENDPOINT'
69
70
  | 'OTEL_EXPORTER_OTLP_LOGS_ENDPOINT'
@@ -113,7 +114,6 @@ export type EnvVar =
113
114
  | 'PROVER_BROKER_JOB_TIMEOUT_MS'
114
115
  | 'PROVER_BROKER_POLL_INTERVAL_MS'
115
116
  | 'PROVER_BROKER_JOB_MAX_RETRIES'
116
- | 'PROVER_BROKER_DATA_DIRECTORY'
117
117
  | 'PROVER_COORDINATION_NODE_URL'
118
118
  | 'PROVER_DISABLED'
119
119
  | 'PROVER_ID'
@@ -189,8 +189,10 @@ export type EnvVar =
189
189
  | 'L1_GAS_LIMIT_BUFFER_FIXED'
190
190
  | 'L1_GAS_PRICE_MIN'
191
191
  | 'L1_GAS_PRICE_MAX'
192
+ | 'L1_BLOB_FEE_PER_GAS_MAX'
192
193
  | 'L1_PRIORITY_FEE_BUMP_PERCENTAGE'
193
194
  | 'L1_PRIORITY_FEE_RETRY_BUMP_PERCENTAGE'
195
+ | 'L1_FIXED_PRIORITY_FEE_PER_GAS'
194
196
  | 'L1_TX_MONITOR_MAX_ATTEMPTS'
195
197
  | 'L1_TX_MONITOR_CHECK_INTERVAL_MS'
196
198
  | 'L1_TX_MONITOR_STALL_TIME_MS'
@@ -201,4 +203,5 @@ export type EnvVar =
201
203
  | 'FAUCET_INTERVAL_MS'
202
204
  | 'FAUCET_L1_ASSETS'
203
205
  | 'K8S_POD_NAME'
204
- | 'K8S_POD_UID';
206
+ | 'K8S_POD_UID'
207
+ | 'K8S_NAMESPACE_NAME';
@@ -60,6 +60,12 @@ export class SafeJsonRpcServer {
60
60
  const message = err.issues.map(e => `${e.message} (${e.path.join('.')})`).join('. ') || 'Validation error';
61
61
  ctx.status = 400;
62
62
  ctx.body = { jsonrpc: '2.0', id: null, error: { code: -32701, message } };
63
+ } else if (this.http200OnError) {
64
+ ctx.body = {
65
+ jsonrpc: '2.0',
66
+ id: null,
67
+ error: { code: err.code || -32600, data: err.data, message: err.message },
68
+ };
63
69
  } else {
64
70
  ctx.status = 500;
65
71
  ctx.body = { jsonrpc: '2.0', id: null, error: { code: -32600, message: err.message ?? 'Internal error' } };
@@ -111,16 +117,8 @@ export class SafeJsonRpcServer {
111
117
  ctx.body = { jsonrpc, id, error: { code: -32601, message: `Method not found: ${method}` } };
112
118
  } else {
113
119
  ctx.status = 200;
114
- try {
115
- const result = await this.proxy.call(method, params);
116
- ctx.body = { jsonrpc, id, result };
117
- } catch (err: any) {
118
- if (this.http200OnError) {
119
- ctx.body = { jsonrpc, id, error: { code: err.code || -32600, data: err.data, message: err.message } };
120
- } else {
121
- throw err;
122
- }
123
- }
120
+ const result = await this.proxy.call(method, params);
121
+ ctx.body = { jsonrpc, id, result };
124
122
  }
125
123
  });
126
124
 
@@ -265,6 +263,12 @@ function makeAggregateHealthcheck(namedHandlers: NamespacedApiHandlers, log?: Lo
265
263
  };
266
264
  }
267
265
 
266
+ type SafeJsonRpcServerOptions = {
267
+ http200OnError: boolean;
268
+ healthCheck?: StatusCheckFn;
269
+ log?: Logger;
270
+ };
271
+
268
272
  /**
269
273
  * Creates a single SafeJsonRpcServer from multiple handlers.
270
274
  * @param servers - List of handlers to be combined.
@@ -272,9 +276,12 @@ function makeAggregateHealthcheck(namedHandlers: NamespacedApiHandlers, log?: Lo
272
276
  */
273
277
  export function createNamespacedSafeJsonRpcServer(
274
278
  handlers: NamespacedApiHandlers,
275
- http200OnError = false,
276
- log = createLogger('json-rpc:server'),
279
+ options: Omit<SafeJsonRpcServerOptions, 'healthcheck'> = {
280
+ http200OnError: false,
281
+ log: createLogger('json-rpc:server'),
282
+ },
277
283
  ): SafeJsonRpcServer {
284
+ const { http200OnError, log } = options;
278
285
  const proxy = new NamespacedSafeJsonProxy(handlers);
279
286
  const healthCheck = makeAggregateHealthcheck(handlers, log);
280
287
  return new SafeJsonRpcServer(proxy, http200OnError, healthCheck, log);
@@ -283,11 +290,11 @@ export function createNamespacedSafeJsonRpcServer(
283
290
  export function createSafeJsonRpcServer<T extends object = any>(
284
291
  handler: T,
285
292
  schema: ApiSchemaFor<T>,
286
- http200OnError = false,
287
- healthCheck?: StatusCheckFn,
293
+ options: SafeJsonRpcServerOptions = { http200OnError: false },
288
294
  ) {
295
+ const { http200OnError, log, healthCheck } = options;
289
296
  const proxy = new SafeJsonProxy(handler, schema);
290
- return new SafeJsonRpcServer(proxy, http200OnError, healthCheck);
297
+ return new SafeJsonRpcServer(proxy, http200OnError, healthCheck, log);
291
298
  }
292
299
 
293
300
  /**
@@ -10,7 +10,7 @@ import { type LogLevel } from './log-levels.js';
10
10
  import { type LogData, type LogFn } from './log_fn.js';
11
11
 
12
12
  export function createLogger(module: string): Logger {
13
- module = module.replace(/^aztec:/, '');
13
+ module = logNameHandlers.reduce((moduleName, handler) => handler(moduleName), module.replace(/^aztec:/, ''));
14
14
  const pinoLogger = logger.child({ module }, { level: getLogLevelFromFilters(logFilters, module) });
15
15
 
16
16
  // We check manually for isLevelEnabled to avoid calling processLogData unnecessarily.
@@ -56,6 +56,22 @@ function processLogData(data: LogData): LogData {
56
56
  return logDataHandlers.reduce((accum, handler) => handler(accum), data);
57
57
  }
58
58
 
59
+ // Allow global hooks for tweaking module names.
60
+ // Used in tests to add a uid to modules, so we can differentiate multiple nodes in the same process.
61
+ type LogNameHandler = (module: string) => string;
62
+ const logNameHandlers: LogNameHandler[] = [];
63
+
64
+ export function addLogNameHandler(handler: LogNameHandler): void {
65
+ logNameHandlers.push(handler);
66
+ }
67
+
68
+ export function removeLogNameHandler(handler: LogNameHandler) {
69
+ const index = logNameHandlers.indexOf(handler);
70
+ if (index !== -1) {
71
+ logNameHandlers.splice(index, 1);
72
+ }
73
+ }
74
+
59
75
  // Patch isLevelEnabled missing from pino/browser.
60
76
  function isLevelEnabled(logger: pino.Logger<'verbose', boolean>, level: LogLevel): boolean {
61
77
  return typeof logger.isLevelEnabled === 'function'
@@ -101,8 +117,10 @@ const levelToSeverityFormatter = (label: string, level: number): object => {
101
117
  return { severity, level };
102
118
  };
103
119
 
120
+ const useGcloudObservability = process.env.USE_GCLOUD_OBSERVABILITY === 'true';
104
121
  const pinoOpts: pino.LoggerOptions<keyof typeof customLevels> = {
105
122
  customLevels,
123
+ messageKey: useGcloudObservability ? 'message' : 'msg',
106
124
  useOnlyCustomLevels: false,
107
125
  level: logLevel,
108
126
  formatters: {
@@ -156,7 +174,6 @@ const otelTransport: pino.TransportTargetOptions = {
156
174
  options: otelOpts,
157
175
  level: 'trace',
158
176
  };
159
-
160
177
  function makeLogger() {
161
178
  if (!isNode) {
162
179
  // We are on the browser.
@@ -23,6 +23,10 @@ export class RunningPromise {
23
23
  * Starts the running promise.
24
24
  */
25
25
  public start() {
26
+ if (this.running) {
27
+ this.logger.warn(`Attempted to start running promise that was already started`);
28
+ return;
29
+ }
26
30
  this.running = true;
27
31
 
28
32
  const poll = async () => {
@@ -54,6 +58,10 @@ export class RunningPromise {
54
58
  * and waits for the currently executing function to complete.
55
59
  */
56
60
  async stop(): Promise<void> {
61
+ if (!this.running) {
62
+ this.logger.warn(`Running promise was not started`);
63
+ return;
64
+ }
57
65
  this.running = false;
58
66
  this.interruptibleSleep.interrupt();
59
67
  await this.runningPromise;
@@ -6,6 +6,7 @@ import { FifoMemoryQueue } from './fifo_memory_queue.js';
6
6
  export class SerialQueue {
7
7
  private readonly queue = new FifoMemoryQueue<() => Promise<void>>();
8
8
  private runningPromise!: Promise<void>;
9
+ private started = false;
9
10
 
10
11
  /**
11
12
  * Initializes the execution of enqueued functions in the serial queue.
@@ -14,7 +15,11 @@ export class SerialQueue {
14
15
  * This method should be called once to start processing the queue.
15
16
  */
16
17
  public start() {
18
+ if (this.started) {
19
+ return;
20
+ }
17
21
  this.runningPromise = this.queue.process(fn => fn());
22
+ this.started = true;
18
23
  }
19
24
 
20
25
  /**
@@ -17,6 +17,11 @@ export function writeTestData(targetFileFromRepoRoot: string, contents: string |
17
17
  logger(`Wrote test data to ${targetFile}`);
18
18
  }
19
19
 
20
+ export function readTestData(repoPath: string): Buffer {
21
+ const targetFile = getPathToFile(repoPath);
22
+ return readFileSync(targetFile);
23
+ }
24
+
20
25
  /**
21
26
  * Looks for a variable assignment in the target file and updates the value, only if test data generation is enabled.
22
27
  * Note that a magic inline comment would be a cleaner approach, like `/* TEST-DATA-START *\/` and `/* TEST-DATA-END *\/`,
@@ -43,7 +48,7 @@ export function updateInlineTestData(targetFileFromRepoRoot: string, itemName: s
43
48
  /**
44
49
  * Updates the sample Prover.toml files in noir-projects/noir-protocol-circuits/crates/.
45
50
  * @remarks Requires AZTEC_GENERATE_TEST_DATA=1 to be set
46
- * To re-gen, run 'AZTEC_GENERATE_TEST_DATA=1 FAKE_PROOFS=1 yarn test:e2e-no-docker full.test '
51
+ * To re-gen, run 'AZTEC_GENERATE_TEST_DATA=1 FAKE_PROOFS=1 yarn test:e2e full.test '
47
52
  */
48
53
  export function updateProtocolCircuitSampleInputs(circuitName: string, value: string) {
49
54
  const logger = createConsoleLogger('aztec:testing:test_data');
@@ -1,4 +1,5 @@
1
- export * from './unbalanced_merkle_root.js';
1
+ export * from './unbalanced_merkle_tree.js';
2
+ export * from './unbalanced_tree_store.js';
2
3
 
3
4
  /**
4
5
  * A leaf of an indexed merkle tree.