@aztec/foundation 0.0.1-commit.21ecf947b → 0.0.1-commit.2448fdb

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 (86) hide show
  1. package/dest/branded-types/slot.d.ts +4 -1
  2. package/dest/branded-types/slot.d.ts.map +1 -1
  3. package/dest/branded-types/slot.js +3 -0
  4. package/dest/buffer/index.d.ts +2 -1
  5. package/dest/buffer/index.d.ts.map +1 -1
  6. package/dest/buffer/index.js +1 -0
  7. package/dest/buffer/utils.d.ts +3 -0
  8. package/dest/buffer/utils.d.ts.map +1 -0
  9. package/dest/buffer/utils.js +7 -0
  10. package/dest/collection/array.d.ts +3 -1
  11. package/dest/collection/array.d.ts.map +1 -1
  12. package/dest/collection/array.js +15 -0
  13. package/dest/config/env_var.d.ts +2 -2
  14. package/dest/config/env_var.d.ts.map +1 -1
  15. package/dest/config/index.d.ts +1 -1
  16. package/dest/config/index.d.ts.map +1 -1
  17. package/dest/config/index.js +15 -0
  18. package/dest/config/network_config.d.ts +19 -1
  19. package/dest/config/network_config.d.ts.map +1 -1
  20. package/dest/config/network_config.js +4 -1
  21. package/dest/crypto/poseidon/index.d.ts +1 -1
  22. package/dest/crypto/poseidon/index.d.ts.map +1 -1
  23. package/dest/crypto/poseidon/index.js +40 -33
  24. package/dest/crypto/secp256k1-signer/utils.d.ts +12 -1
  25. package/dest/crypto/secp256k1-signer/utils.d.ts.map +1 -1
  26. package/dest/crypto/secp256k1-signer/utils.js +26 -0
  27. package/dest/curves/bn254/field.d.ts +2 -1
  28. package/dest/curves/bn254/field.d.ts.map +1 -1
  29. package/dest/curves/bn254/field.js +5 -2
  30. package/dest/curves/grumpkin/point.d.ts +4 -4
  31. package/dest/curves/grumpkin/point.d.ts.map +1 -1
  32. package/dest/curves/grumpkin/point.js +7 -4
  33. package/dest/eth-signature/eth_signature.d.ts +2 -1
  34. package/dest/eth-signature/eth_signature.d.ts.map +1 -1
  35. package/dest/eth-signature/eth_signature.js +7 -2
  36. package/dest/json-rpc/client/safe_json_rpc_client.d.ts +2 -1
  37. package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -1
  38. package/dest/json-rpc/client/safe_json_rpc_client.js +1 -1
  39. package/dest/json-rpc/server/api_key_auth.d.ts +19 -0
  40. package/dest/json-rpc/server/api_key_auth.d.ts.map +1 -0
  41. package/dest/json-rpc/server/api_key_auth.js +57 -0
  42. package/dest/json-rpc/server/index.d.ts +2 -1
  43. package/dest/json-rpc/server/index.d.ts.map +1 -1
  44. package/dest/json-rpc/server/index.js +1 -0
  45. package/dest/log/bigint-utils.d.ts +5 -0
  46. package/dest/log/bigint-utils.d.ts.map +1 -0
  47. package/dest/log/bigint-utils.js +21 -0
  48. package/dest/log/gcloud-logger-config.d.ts +1 -1
  49. package/dest/log/gcloud-logger-config.d.ts.map +1 -1
  50. package/dest/log/gcloud-logger-config.js +3 -0
  51. package/dest/log/pino-logger.d.ts +1 -1
  52. package/dest/log/pino-logger.d.ts.map +1 -1
  53. package/dest/log/pino-logger.js +4 -0
  54. package/dest/schemas/api.d.ts +2 -2
  55. package/dest/schemas/api.d.ts.map +1 -1
  56. package/dest/serialize/buffer_reader.d.ts +20 -7
  57. package/dest/serialize/buffer_reader.d.ts.map +1 -1
  58. package/dest/serialize/buffer_reader.js +18 -5
  59. package/dest/serialize/field_reader.d.ts +13 -5
  60. package/dest/serialize/field_reader.d.ts.map +1 -1
  61. package/dest/serialize/field_reader.js +13 -0
  62. package/dest/transport/transport_client.js +2 -2
  63. package/package.json +2 -2
  64. package/src/branded-types/slot.ts +5 -0
  65. package/src/buffer/index.ts +1 -0
  66. package/src/buffer/utils.ts +8 -0
  67. package/src/collection/array.ts +14 -0
  68. package/src/config/env_var.ts +20 -4
  69. package/src/config/index.ts +15 -0
  70. package/src/config/network_config.ts +3 -0
  71. package/src/crypto/poseidon/index.ts +42 -34
  72. package/src/crypto/secp256k1-signer/utils.ts +32 -0
  73. package/src/curves/bn254/field.ts +6 -2
  74. package/src/curves/grumpkin/point.ts +6 -3
  75. package/src/eth-signature/eth_signature.ts +7 -1
  76. package/src/json-rpc/client/safe_json_rpc_client.ts +2 -0
  77. package/src/json-rpc/server/api_key_auth.ts +63 -0
  78. package/src/json-rpc/server/index.ts +1 -0
  79. package/src/log/bigint-utils.ts +25 -0
  80. package/src/log/gcloud-logger-config.ts +5 -0
  81. package/src/log/pino-logger.ts +4 -0
  82. package/src/schemas/api.ts +4 -1
  83. package/src/serialize/buffer_reader.ts +29 -6
  84. package/src/serialize/field_reader.ts +22 -4
  85. package/src/transport/transport_client.ts +2 -2
  86. package/src/trees/membership_witness.ts +2 -2
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Converts bigint values to strings recursively in a log object to avoid serialization issues.
3
+ */
4
+ export function convertBigintsToStrings(obj: unknown): unknown {
5
+ if (typeof obj === 'bigint') {
6
+ return String(obj);
7
+ }
8
+
9
+ if (Array.isArray(obj)) {
10
+ return obj.map(item => convertBigintsToStrings(item));
11
+ }
12
+
13
+ if (obj !== null && typeof obj === 'object') {
14
+ if (typeof (obj as any).toJSON === 'function') {
15
+ return convertBigintsToStrings((obj as any).toJSON());
16
+ }
17
+ const result: Record<string, unknown> = {};
18
+ for (const key in obj) {
19
+ result[key] = convertBigintsToStrings((obj as Record<string, unknown>)[key]);
20
+ }
21
+ return result;
22
+ }
23
+
24
+ return obj;
25
+ }
@@ -1,5 +1,7 @@
1
1
  import type { pino } from 'pino';
2
2
 
3
+ import { convertBigintsToStrings } from './bigint-utils.js';
4
+
3
5
  /* eslint-disable camelcase */
4
6
 
5
7
  const GOOGLE_CLOUD_TRACE_ID = 'logging.googleapis.com/trace';
@@ -15,6 +17,9 @@ export const GoogleCloudLoggerConfig = {
15
17
  messageKey: 'message',
16
18
  formatters: {
17
19
  log(object: Record<string, unknown>): Record<string, unknown> {
20
+ // Convert bigints to strings recursively to avoid serialization issues
21
+ object = convertBigintsToStrings(object) as Record<string, unknown>;
22
+
18
23
  // Add trace context attributes following Cloud Logging structured log format described
19
24
  // in https://cloud.google.com/logging/docs/structured-logging#special-payload-fields
20
25
  const { trace_id, span_id, trace_flags, ...rest } = object;
@@ -7,6 +7,7 @@ import { inspect } from 'util';
7
7
  import { compactArray } from '../collection/array.js';
8
8
  import type { EnvVar } from '../config/index.js';
9
9
  import { parseBooleanEnv } from '../config/parse-env.js';
10
+ import { convertBigintsToStrings } from './bigint-utils.js';
10
11
  import { GoogleCloudLoggerConfig } from './gcloud-logger-config.js';
11
12
  import { getLogLevelFromFilters, parseLogLevelEnvVar } from './log-filters.js';
12
13
  import type { LogLevel } from './log-levels.js';
@@ -165,6 +166,9 @@ const pinoOpts: pino.LoggerOptions<keyof typeof customLevels> = {
165
166
  ...redactedPaths.map(p => `opts.${p}`),
166
167
  ],
167
168
  },
169
+ formatters: {
170
+ log: obj => convertBigintsToStrings(obj) as Record<string, unknown>,
171
+ },
168
172
  ...(useGcloudLogging ? GoogleCloudLoggerConfig : {}),
169
173
  };
170
174
 
@@ -37,7 +37,10 @@ export type ApiSchema = {
37
37
  };
38
38
 
39
39
  /** Return whether an API schema defines a valid function schema for a given method name. */
40
- export function schemaHasMethod(schema: ApiSchema, methodName: string) {
40
+ export function schemaHasMethod<T extends ApiSchema>(
41
+ schema: T,
42
+ methodName: string,
43
+ ): methodName is Extract<keyof T, string> {
41
44
  return (
42
45
  typeof methodName === 'string' &&
43
46
  Object.hasOwn(schema, methodName) &&
@@ -286,16 +286,39 @@ export class BufferReader {
286
286
  }
287
287
 
288
288
  /**
289
- * Read an array of a fixed size with elements of type T from the buffer.
290
- * The 'itemDeserializer' object should have a 'fromBuffer' method that takes a BufferReader instance as input,
291
- * and returns an instance of the desired deserialized data type T.
292
- * This method will call the 'fromBuffer' method for each element in the array and return the resulting array.
289
+ * Read an array from the buffer using lazy allocation (new Array + loop).
290
+ * Safe for use with untrusted sizes does not pre-allocate memory proportional to size.
293
291
  *
294
- * @param size - The fixed number of elements in the array.
292
+ * @param size - The number of elements to read.
295
293
  * @param itemDeserializer - An object with a 'fromBuffer' method to deserialize individual elements of type T.
296
294
  * @returns An array of instances of type T.
297
295
  */
298
- public readArray<T, N extends number>(
296
+ public readArray<T>(
297
+ size: number,
298
+ itemDeserializer: {
299
+ /**
300
+ * A function for deserializing data from a BufferReader instance.
301
+ */
302
+ fromBuffer: (reader: BufferReader) => T;
303
+ },
304
+ ): T[] {
305
+ const result = new Array<T>(size);
306
+ for (let i = 0; i < size; i++) {
307
+ result[i] = itemDeserializer.fromBuffer(this);
308
+ }
309
+ return result;
310
+ }
311
+
312
+ /**
313
+ * Read a fixed-size tuple from the buffer using dense allocation (Array.from).
314
+ * Only use with compile-time constant sizes — the size parameter MUST NOT come from untrusted input
315
+ * as Array.from pre-allocates memory proportional to size.
316
+ *
317
+ * @param size - The fixed number of elements (must be a compile-time constant).
318
+ * @param itemDeserializer - An object with a 'fromBuffer' method to deserialize individual elements of type T.
319
+ * @returns A densely-allocated tuple of instances of type T.
320
+ */
321
+ public readTuple<T, N extends number>(
299
322
  size: N,
300
323
  itemDeserializer: {
301
324
  /**
@@ -169,12 +169,30 @@ export class FieldReader {
169
169
  * @param itemDeserializer - An object with a 'fromFields' method to deserialize individual elements of type T.
170
170
  * @returns An array of instances of type T.
171
171
  */
172
- public readArray<T, N extends number>(
172
+ /**
173
+ * Read an array from the field array using lazy allocation (new Array + loop).
174
+ * Safe for use with untrusted sizes.
175
+ */
176
+ public readArray<T>(
177
+ size: number,
178
+ itemDeserializer: {
179
+ fromFields: (reader: FieldReader) => T;
180
+ },
181
+ ): T[] {
182
+ const result = new Array<T>(size);
183
+ for (let i = 0; i < size; i++) {
184
+ result[i] = itemDeserializer.fromFields(this);
185
+ }
186
+ return result;
187
+ }
188
+
189
+ /**
190
+ * Read a fixed-size tuple from the field array using dense allocation (Array.from).
191
+ * Only use with compile-time constant sizes — the size parameter MUST NOT come from untrusted input.
192
+ */
193
+ public readTuple<T, N extends number>(
173
194
  size: N,
174
195
  itemDeserializer: {
175
- /**
176
- * A function for deserializing data from a FieldReader instance.
177
- */
178
196
  fromFields: (reader: FieldReader) => T;
179
197
  },
180
198
  ): Tuple<T, N> {
@@ -91,7 +91,7 @@ export class TransportClient<Payload> extends EventEmitter {
91
91
  }
92
92
  const msgId = this.msgId++;
93
93
  const msg = { msgId, payload };
94
- log.debug(format(`->`, msg));
94
+ log.trace(format(`->`, msg));
95
95
  return new Promise<any>((resolve, reject) => {
96
96
  this.pendingRequests.push({ resolve, reject, msgId });
97
97
  this.socket!.send(msg, transfer).catch(reject);
@@ -111,7 +111,7 @@ export class TransportClient<Payload> extends EventEmitter {
111
111
  this.close();
112
112
  return;
113
113
  }
114
- log.debug(format(`<-`, msg));
114
+ log.trace(format(`<-`, msg));
115
115
  if (isEventMessage(msg)) {
116
116
  this.emit('event_msg', msg.payload);
117
117
  return;
@@ -94,7 +94,7 @@ export class MembershipWitness<N extends number> {
94
94
  static fromBuffer<N extends number>(buffer: Buffer | BufferReader, size: N): MembershipWitness<N> {
95
95
  const reader = BufferReader.asReader(buffer);
96
96
  const leafIndex = toBigIntBE(reader.readBytes(32));
97
- const siblingPath = reader.readArray(size, Fr);
97
+ const siblingPath = reader.readArray(size, Fr) as Tuple<Fr, N>;
98
98
  return new MembershipWitness(size, leafIndex, siblingPath);
99
99
  }
100
100
 
@@ -108,7 +108,7 @@ export class MembershipWitness<N extends number> {
108
108
  fromBuffer: (buffer: Buffer | BufferReader) => {
109
109
  const reader = BufferReader.asReader(buffer);
110
110
  const leafIndex = toBigIntBE(reader.readBytes(32));
111
- const siblingPath = reader.readArray(size, Fr);
111
+ const siblingPath = reader.readArray(size, Fr) as Tuple<Fr, N>;
112
112
  return new MembershipWitness(size, leafIndex, siblingPath);
113
113
  },
114
114
  };