@aztec/foundation 0.0.1-commit.e588bc7e5 → 0.0.1-commit.e5a3663dd

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 (80) hide show
  1. package/dest/branded-types/buffer32_hash.d.ts +24 -0
  2. package/dest/branded-types/buffer32_hash.d.ts.map +1 -0
  3. package/dest/branded-types/buffer32_hash.js +19 -0
  4. package/dest/branded-types/checkpoint_number.d.ts +4 -1
  5. package/dest/branded-types/checkpoint_number.d.ts.map +1 -1
  6. package/dest/branded-types/checkpoint_number.js +3 -0
  7. package/dest/branded-types/index.d.ts +2 -1
  8. package/dest/branded-types/index.d.ts.map +1 -1
  9. package/dest/branded-types/index.js +1 -0
  10. package/dest/buffer/buffer16.d.ts +3 -3
  11. package/dest/buffer/buffer16.d.ts.map +1 -1
  12. package/dest/buffer/buffer32.d.ts +28 -63
  13. package/dest/buffer/buffer32.d.ts.map +1 -1
  14. package/dest/buffer/buffer32.js +26 -60
  15. package/dest/config/env_var.d.ts +2 -2
  16. package/dest/config/env_var.d.ts.map +1 -1
  17. package/dest/config/index.d.ts +48 -30
  18. package/dest/config/index.d.ts.map +1 -1
  19. package/dest/config/index.js +21 -30
  20. package/dest/curves/bls12/field.d.ts +1 -1
  21. package/dest/curves/bls12/field.d.ts.map +1 -1
  22. package/dest/curves/bls12/field.js +0 -5
  23. package/dest/curves/bn254/field.d.ts +17 -16
  24. package/dest/curves/bn254/field.d.ts.map +1 -1
  25. package/dest/curves/bn254/field.js +18 -13
  26. package/dest/curves/grumpkin/point.d.ts +3 -3
  27. package/dest/curves/grumpkin/point.d.ts.map +1 -1
  28. package/dest/curves/grumpkin/point.js +6 -3
  29. package/dest/eth-address/index.d.ts +1 -1
  30. package/dest/eth-address/index.d.ts.map +1 -1
  31. package/dest/eth-address/index.js +0 -3
  32. package/dest/json-rpc/client/fetch.js +1 -1
  33. package/dest/json-rpc/client/undici.d.ts +1 -1
  34. package/dest/json-rpc/client/undici.d.ts.map +1 -1
  35. package/dest/json-rpc/client/undici.js +5 -3
  36. package/dest/log/pino-logger.js +15 -1
  37. package/dest/queue/batch_queue.d.ts +1 -1
  38. package/dest/queue/batch_queue.d.ts.map +1 -1
  39. package/dest/queue/batch_queue.js +1 -0
  40. package/dest/string/index.js +1 -1
  41. package/dest/trees/balanced_merkle_tree_root.d.ts +2 -3
  42. package/dest/trees/balanced_merkle_tree_root.d.ts.map +1 -1
  43. package/dest/trees/balanced_merkle_tree_root.js +2 -3
  44. package/dest/trees/hasher.d.ts +3 -2
  45. package/dest/trees/hasher.d.ts.map +1 -1
  46. package/dest/trees/hasher.js +5 -5
  47. package/dest/trees/merkle_tree_calculator.d.ts +4 -2
  48. package/dest/trees/merkle_tree_calculator.d.ts.map +1 -1
  49. package/dest/trees/merkle_tree_calculator.js +1 -5
  50. package/dest/trees/sibling_path.d.ts +2 -2
  51. package/dest/trees/sibling_path.d.ts.map +1 -1
  52. package/dest/trees/sibling_path.js +1 -5
  53. package/dest/trees/unbalanced_merkle_tree_root.d.ts +2 -3
  54. package/dest/trees/unbalanced_merkle_tree_root.d.ts.map +1 -1
  55. package/dest/trees/unbalanced_merkle_tree_root.js +2 -3
  56. package/dest/types/index.d.ts +9 -1
  57. package/dest/types/index.d.ts.map +1 -1
  58. package/package.json +2 -2
  59. package/src/branded-types/buffer32_hash.ts +42 -0
  60. package/src/branded-types/checkpoint_number.ts +5 -0
  61. package/src/branded-types/index.ts +1 -0
  62. package/src/buffer/buffer16.ts +2 -2
  63. package/src/buffer/buffer32.ts +36 -68
  64. package/src/config/env_var.ts +5 -5
  65. package/src/config/index.ts +96 -84
  66. package/src/curves/bls12/field.ts +0 -7
  67. package/src/curves/bn254/field.ts +25 -31
  68. package/src/curves/grumpkin/point.ts +5 -2
  69. package/src/eth-address/index.ts +0 -4
  70. package/src/json-rpc/client/fetch.ts +1 -1
  71. package/src/json-rpc/client/undici.ts +5 -3
  72. package/src/log/pino-logger.ts +16 -1
  73. package/src/queue/batch_queue.ts +1 -0
  74. package/src/string/index.ts +1 -1
  75. package/src/trees/balanced_merkle_tree_root.ts +2 -5
  76. package/src/trees/hasher.ts +6 -3
  77. package/src/trees/merkle_tree_calculator.ts +4 -10
  78. package/src/trees/sibling_path.ts +1 -2
  79. package/src/trees/unbalanced_merkle_tree_root.ts +2 -5
  80. package/src/types/index.ts +14 -0
@@ -125,9 +125,12 @@ export class Point {
125
125
  }
126
126
 
127
127
  /**
128
- * Returns the contents of the point as an array of 2 fields.
129
- * @returns The point as an array of 2 fields
128
+ * Returns the contents of the point as an array of 3 fields.
129
+ * @returns The point as an array of 3 fields
130
130
  */
131
+ // TODO(F-553): Once we take the breaking change and drop the custom Noir `Point` wrapper in
132
+ // `noir-projects/noir-protocol-circuits/crates/types/src/point.nr`, revert this to serialize as `[x, y]` (2 fields)
133
+ // and drop the `is_infinite` flag from `fromFields` / `toNoirStruct` below.
131
134
  toFields() {
132
135
  return [this.x, this.y, new Fr(this.isInfinite)];
133
136
  }
@@ -5,7 +5,6 @@ import { randomBytes } from '../crypto/random/index.js';
5
5
  import { Fr } from '../curves/bn254/index.js';
6
6
  import { hexSchemaFor } from '../schemas/utils.js';
7
7
  import { BufferReader, FieldReader } from '../serialize/index.js';
8
- import { TypeRegistry } from '../serialize/type_registry.js';
9
8
  import { bufferToHex } from '../string/index.js';
10
9
 
11
10
  /**
@@ -268,6 +267,3 @@ export class EthAddress {
268
267
  return addrA.equals(addrB);
269
268
  }
270
269
  }
271
-
272
- // For deserializing JSON.
273
- TypeRegistry.register('EthAddress', EthAddress);
@@ -54,7 +54,7 @@ export async function defaultFetch(
54
54
  }
55
55
 
56
56
  if (!resp.ok) {
57
- const errorMessage = `Error ${resp.status} from server ${host}: ${responseJson.error.message}`;
57
+ const errorMessage = `Error ${resp.status} from server ${host}: ${responseJson?.error?.message ?? JSON.stringify(responseJson)}`;
58
58
  if (noRetry || (resp.status >= 400 && resp.status < 500)) {
59
59
  throw new NoRetryError(errorMessage);
60
60
  } else {
@@ -44,18 +44,20 @@ export function makeUndiciFetch(client = new Agent()): JsonRpcFetch {
44
44
  let responseJson: any;
45
45
  const responseOk = resp.statusCode >= 200 && resp.statusCode <= 299;
46
46
  const contentEncoding = resp.headers['content-encoding'];
47
+ let responseText: string;
47
48
  try {
48
49
  if (contentEncoding === 'gzip') {
49
50
  const jsonBuffer = await gunzip(await resp.body.arrayBuffer());
50
- responseJson = JSON.parse(jsonBuffer.toString('utf-8'));
51
+ responseText = jsonBuffer.toString('utf-8');
51
52
  } else {
52
- responseJson = await resp.body.json();
53
+ responseText = await resp.body.text();
53
54
  }
55
+ responseJson = JSON.parse(responseText);
54
56
  } catch {
55
57
  if (!responseOk) {
56
58
  throw new Error('HTTP ' + resp.statusCode);
57
59
  }
58
- throw new Error(`Failed to parse body as JSON. encoding: ${contentEncoding}, body: ${await resp.body.text()}`);
60
+ throw new Error(`Failed to parse body as JSON. encoding: ${contentEncoding}, body: ${responseText!}`);
59
61
  }
60
62
 
61
63
  if (!responseOk) {
@@ -377,5 +377,20 @@ export type Logger = { [K in LogLevel]: LogFn } & { /** Error log function */ er
377
377
  * @returns A string with both the log message and the error message.
378
378
  */
379
379
  function formatErr(msg: string, err?: unknown): string {
380
- return err ? `${msg}: ${inspect(err)}` : msg;
380
+ if (!err) {
381
+ return msg;
382
+ }
383
+
384
+ try {
385
+ return `${msg}: ${inspect(err)}`;
386
+ } catch {
387
+ // inspect can crash on error objects with broken property descriptors
388
+ try {
389
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
390
+ return `${msg}: ${err instanceof Error ? `${err.name}: ${err.message}` : String(err)}`;
391
+ } catch {
392
+ // if even String(err) fails, return the original message with a note about the error
393
+ return `${msg}: [unserializable error]`;
394
+ }
395
+ }
381
396
  }
@@ -105,6 +105,7 @@ export class BatchQueue<T, K extends string | number> {
105
105
  return Promise.resolve();
106
106
  }
107
107
 
108
+ this.flushCurrentBatch();
108
109
  this.container.end();
109
110
  return runningPromise;
110
111
  }
@@ -58,7 +58,7 @@ export function urlJoin(...args: string[]): string {
58
58
  end--;
59
59
  }
60
60
 
61
- if (start < end) {
61
+ if (start <= end) {
62
62
  processed.push(arg.slice(start, end + 1));
63
63
  }
64
64
  }
@@ -1,10 +1,7 @@
1
- import { poseidonMerkleHash, shaMerkleHash } from './hasher.js';
1
+ import { shaMerkleHash } from './hasher.js';
2
2
 
3
3
  export const computeBalancedShaRoot = (leaves: Buffer[]) => computeBalancedMerkleTreeRoot(leaves);
4
4
 
5
- export const computeBalancedPoseidonRoot = async (leaves: Buffer[]) =>
6
- await computeBalancedMerkleTreeRootAsync(leaves, poseidonMerkleHash);
7
-
8
5
  /**
9
6
  * Computes the Merkle root with the provided leaves **synchronously**.
10
7
  * This method uses a synchronous hash function (defaults to `sha256Trunc`).
@@ -36,7 +33,7 @@ export function computeBalancedMerkleTreeRoot(leaves: Buffer[], hasher = shaMerk
36
33
  */
37
34
  export async function computeBalancedMerkleTreeRootAsync(
38
35
  leaves: Buffer[],
39
- hasher = poseidonMerkleHash,
36
+ hasher: (left: Buffer, right: Buffer) => Promise<Buffer<ArrayBuffer>>,
40
37
  ): Promise<Buffer> {
41
38
  const height = getTreeHeight(leaves);
42
39
  let nodes = leaves.slice();
@@ -1,4 +1,4 @@
1
- import { poseidon2Hash } from '../crypto/poseidon/index.js';
1
+ import { poseidon2HashWithSeparator } from '../crypto/poseidon/index.js';
2
2
  import { sha256Trunc } from '../crypto/sha256/index.js';
3
3
 
4
4
  /**
@@ -44,5 +44,8 @@ export interface AsyncHasher {
44
44
  export const shaMerkleHash: Hasher['hash'] = (left: Buffer, right: Buffer) =>
45
45
  sha256Trunc(Buffer.concat([left, right])) as Buffer<ArrayBuffer>;
46
46
 
47
- export const poseidonMerkleHash: AsyncHasher['hash'] = async (left: Buffer, right: Buffer) =>
48
- (await poseidon2Hash([left, right])).toBuffer() as Buffer<ArrayBuffer>;
47
+ /** Creates a poseidon2 merkle hasher with the given domain separator. */
48
+ export const makePoseidonMerkleHash =
49
+ (separator: number): AsyncHasher['hash'] =>
50
+ async (left: Buffer, right: Buffer) =>
51
+ (await poseidon2HashWithSeparator([left, right], separator)).toBuffer() as Buffer<ArrayBuffer>;
@@ -1,8 +1,7 @@
1
- import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
2
-
3
- import type { AsyncHasher } from './hasher.js';
4
1
  import { MerkleTree } from './merkle_tree.js';
5
2
 
3
+ type MerkleHashFn = (left: Buffer, right: Buffer) => Promise<Buffer<ArrayBuffer>>;
4
+
6
5
  /**
7
6
  * Merkle tree calculator.
8
7
  */
@@ -10,17 +9,12 @@ export class MerkleTreeCalculator {
10
9
  private constructor(
11
10
  private height: number,
12
11
  private zeroHashes: Buffer[],
13
- private hasher: AsyncHasher['hash'],
12
+ private hasher: MerkleHashFn,
14
13
  ) {
15
14
  this.hasher = hasher;
16
15
  }
17
16
 
18
- static async create(
19
- height: number,
20
- zeroLeaf: Buffer = Buffer.alloc(32),
21
- hasher = async (left: Buffer, right: Buffer) =>
22
- (await poseidon2Hash([left, right])).toBuffer() as Buffer<ArrayBuffer>,
23
- ) {
17
+ static async create(height: number, zeroLeaf: Buffer = Buffer.alloc(32), hasher: MerkleHashFn) {
24
18
  const zeroHashes = [zeroLeaf];
25
19
  for (let i = 0; i < height; i++) {
26
20
  zeroHashes.push((await hasher(zeroHashes[i], zeroHashes[i])) as Buffer<ArrayBuffer>);
@@ -1,5 +1,4 @@
1
1
  import { makeTuple } from '../array/array.js';
2
- import { poseidon2Hash } from '../crypto/poseidon/index.js';
3
2
  import { Fr } from '../curves/bn254/index.js';
4
3
  import { schemas } from '../schemas/index.js';
5
4
  import {
@@ -172,7 +171,7 @@ export async function computeRootFromSiblingPath(
172
171
  leaf: Buffer,
173
172
  siblingPath: Buffer[],
174
173
  index: number,
175
- hasher = async (left: Buffer, right: Buffer) => (await poseidon2Hash([left, right])).toBuffer(),
174
+ hasher: (left: Buffer, right: Buffer) => Promise<Buffer>,
176
175
  ) {
177
176
  let result = leaf;
178
177
  for (const sibling of siblingPath) {
@@ -1,12 +1,9 @@
1
1
  import { computeBalancedMerkleTreeRoot, computeBalancedMerkleTreeRootAsync } from './balanced_merkle_tree_root.js';
2
- import { poseidonMerkleHash, shaMerkleHash } from './hasher.js';
2
+ import { shaMerkleHash } from './hasher.js';
3
3
  import { UnbalancedMerkleTreeCalculator } from './unbalanced_merkle_tree_calculator.js';
4
4
 
5
5
  export const computeUnbalancedShaRoot = (leaves: Buffer[]) => computeUnbalancedMerkleTreeRoot(leaves, shaMerkleHash);
6
6
 
7
- export const computeUnbalancedPoseidonRoot = async (leaves: Buffer[]) =>
8
- await computeUnbalancedMerkleTreeRootAsync(leaves, poseidonMerkleHash);
9
-
10
7
  export const computeWonkyShaRoot = (leaves: Buffer[]) => computeWonkyMerkleTreeRoot(leaves);
11
8
 
12
9
  /**
@@ -67,7 +64,7 @@ export function computeUnbalancedMerkleTreeRoot(
67
64
 
68
65
  export async function computeUnbalancedMerkleTreeRootAsync(
69
66
  leaves: Buffer[],
70
- hasher = poseidonMerkleHash,
67
+ hasher: (left: Uint8Array, right: Uint8Array) => Promise<Buffer<ArrayBuffer>>,
71
68
  emptyRoot = Buffer.alloc(32),
72
69
  ): Promise<Buffer> {
73
70
  if (!leaves.length) {
@@ -34,6 +34,20 @@ export type Prettify<T> = {
34
34
  [K in keyof T]: T[K];
35
35
  } & {};
36
36
 
37
+ /** Returns a type with fields conditionally required based on a flag */
38
+ export type IfFlag<
39
+ OptsSchema,
40
+ Opts extends OptsSchema,
41
+ Key extends keyof OptsSchema,
42
+ Field extends object,
43
+ > = Opts extends { [K in Key]: true }
44
+ ? Field
45
+ : Opts extends { [K in Key]: false }
46
+ ? {}
47
+ : Opts extends { [K in Key]?: boolean }
48
+ ? Partial<Field>
49
+ : {};
50
+
37
51
  /**
38
52
  * Type-safe Event Emitter type
39
53
  * @example