@aztec/foundation 0.0.1-commit.1142ef1 → 0.0.1-commit.11bf3dd6e
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.
- package/dest/array/sorted_array.d.ts +6 -1
- package/dest/array/sorted_array.d.ts.map +1 -1
- package/dest/array/sorted_array.js +18 -15
- package/dest/branded-types/block_number.d.ts +4 -1
- package/dest/branded-types/block_number.d.ts.map +1 -1
- package/dest/branded-types/block_number.js +3 -0
- package/dest/branded-types/buffer32_hash.d.ts +24 -0
- package/dest/branded-types/buffer32_hash.d.ts.map +1 -0
- package/dest/branded-types/buffer32_hash.js +19 -0
- package/dest/branded-types/checkpoint_number.d.ts +4 -1
- package/dest/branded-types/checkpoint_number.d.ts.map +1 -1
- package/dest/branded-types/checkpoint_number.js +3 -0
- package/dest/branded-types/index.d.ts +3 -1
- package/dest/branded-types/index.d.ts.map +1 -1
- package/dest/branded-types/index.js +2 -0
- package/dest/branded-types/index_within_checkpoint.d.ts +42 -0
- package/dest/branded-types/index_within_checkpoint.d.ts.map +1 -0
- package/dest/branded-types/index_within_checkpoint.js +59 -0
- package/dest/branded-types/slot.d.ts +4 -1
- package/dest/branded-types/slot.d.ts.map +1 -1
- package/dest/branded-types/slot.js +3 -0
- package/dest/buffer/buffer16.d.ts +6 -1
- package/dest/buffer/buffer16.d.ts.map +1 -1
- package/dest/buffer/buffer32.d.ts +28 -58
- package/dest/buffer/buffer32.d.ts.map +1 -1
- package/dest/buffer/buffer32.js +26 -60
- package/dest/buffer/index.d.ts +2 -1
- package/dest/buffer/index.d.ts.map +1 -1
- package/dest/buffer/index.js +1 -0
- package/dest/buffer/utils.d.ts +3 -0
- package/dest/buffer/utils.d.ts.map +1 -0
- package/dest/buffer/utils.js +7 -0
- package/dest/collection/array.d.ts +14 -1
- package/dest/collection/array.d.ts.map +1 -1
- package/dest/collection/array.js +66 -0
- package/dest/collection/index.d.ts +2 -1
- package/dest/collection/index.d.ts.map +1 -1
- package/dest/collection/index.js +1 -0
- package/dest/collection/lru_set.d.ts +35 -0
- package/dest/collection/lru_set.d.ts.map +1 -0
- package/dest/collection/lru_set.js +95 -0
- package/dest/config/env_var.d.ts +2 -2
- package/dest/config/env_var.d.ts.map +1 -1
- package/dest/config/index.d.ts +51 -29
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +48 -28
- package/dest/config/network_config.d.ts +19 -1
- package/dest/config/network_config.d.ts.map +1 -1
- package/dest/config/network_config.js +4 -1
- package/dest/config/network_name.d.ts +2 -2
- package/dest/config/network_name.d.ts.map +1 -1
- package/dest/config/network_name.js +2 -0
- package/dest/crypto/aes128/index.d.ts +2 -1
- package/dest/crypto/aes128/index.d.ts.map +1 -1
- package/dest/crypto/aes128/index.js +11 -2
- package/dest/crypto/bls/bn254_keystore.d.ts +1 -10
- package/dest/crypto/bls/bn254_keystore.d.ts.map +1 -1
- package/dest/crypto/bls/bn254_keystore.js +0 -17
- package/dest/crypto/ecdsa/signature.d.ts +10 -1
- package/dest/crypto/ecdsa/signature.d.ts.map +1 -1
- package/dest/crypto/poseidon/index.d.ts +1 -2
- package/dest/crypto/poseidon/index.d.ts.map +1 -1
- package/dest/crypto/poseidon/index.js +40 -42
- package/dest/crypto/random/randomness_singleton.d.ts +4 -3
- package/dest/crypto/random/randomness_singleton.d.ts.map +1 -1
- package/dest/crypto/random/randomness_singleton.js +4 -4
- package/dest/crypto/secp256k1-signer/utils.d.ts +12 -1
- package/dest/crypto/secp256k1-signer/utils.d.ts.map +1 -1
- package/dest/crypto/secp256k1-signer/utils.js +26 -0
- package/dest/crypto/sync/poseidon/index.d.ts +1 -2
- package/dest/crypto/sync/poseidon/index.d.ts.map +1 -1
- package/dest/crypto/sync/poseidon/index.js +0 -8
- package/dest/curves/bls12/field.d.ts +1 -1
- package/dest/curves/bls12/field.d.ts.map +1 -1
- package/dest/curves/bls12/field.js +0 -5
- package/dest/curves/bls12/point.d.ts +10 -1
- package/dest/curves/bls12/point.d.ts.map +1 -1
- package/dest/curves/bn254/field.d.ts +18 -16
- package/dest/curves/bn254/field.d.ts.map +1 -1
- package/dest/curves/bn254/field.js +23 -15
- package/dest/curves/grumpkin/point.d.ts +14 -5
- package/dest/curves/grumpkin/point.d.ts.map +1 -1
- package/dest/curves/grumpkin/point.js +7 -4
- package/dest/error/index.d.ts +4 -4
- package/dest/error/index.d.ts.map +1 -1
- package/dest/eth-address/index.d.ts +1 -1
- package/dest/eth-address/index.d.ts.map +1 -1
- package/dest/eth-address/index.js +0 -3
- package/dest/eth-signature/eth_signature.d.ts +5 -1
- package/dest/eth-signature/eth_signature.d.ts.map +1 -1
- package/dest/eth-signature/eth_signature.js +7 -2
- package/dest/fifo/fifo_frame_reader.d.ts +41 -0
- package/dest/fifo/fifo_frame_reader.d.ts.map +1 -0
- package/dest/fifo/fifo_frame_reader.js +74 -0
- package/dest/fifo/index.d.ts +2 -0
- package/dest/fifo/index.d.ts.map +1 -0
- package/dest/fifo/index.js +1 -0
- package/dest/jest/setup.js +28 -1
- package/dest/json-rpc/client/fetch.d.ts +1 -1
- package/dest/json-rpc/client/fetch.d.ts.map +1 -1
- package/dest/json-rpc/client/fetch.js +4 -3
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts +2 -1
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -1
- package/dest/json-rpc/client/safe_json_rpc_client.js +1 -1
- package/dest/json-rpc/client/undici.d.ts +1 -1
- package/dest/json-rpc/client/undici.d.ts.map +1 -1
- package/dest/json-rpc/client/undici.js +23 -4
- package/dest/json-rpc/fixtures/class_a.d.ts +3 -3
- package/dest/json-rpc/fixtures/class_a.d.ts.map +1 -1
- package/dest/json-rpc/fixtures/class_b.d.ts +3 -3
- package/dest/json-rpc/fixtures/class_b.d.ts.map +1 -1
- package/dest/json-rpc/server/api_key_auth.d.ts +19 -0
- package/dest/json-rpc/server/api_key_auth.d.ts.map +1 -0
- package/dest/json-rpc/server/api_key_auth.js +57 -0
- package/dest/json-rpc/server/index.d.ts +2 -1
- package/dest/json-rpc/server/index.d.ts.map +1 -1
- package/dest/json-rpc/server/index.js +1 -0
- package/dest/json-rpc/server/safe_json_rpc_server.js +1 -1
- package/dest/log/bigint-utils.d.ts +5 -0
- package/dest/log/bigint-utils.d.ts.map +1 -0
- package/dest/log/bigint-utils.js +21 -0
- package/dest/log/gcloud-logger-config.d.ts +1 -1
- package/dest/log/gcloud-logger-config.d.ts.map +1 -1
- package/dest/log/gcloud-logger-config.js +3 -0
- package/dest/log/libp2p_logger.d.ts +5 -2
- package/dest/log/libp2p_logger.d.ts.map +1 -1
- package/dest/log/libp2p_logger.js +14 -4
- package/dest/log/log-filters.d.ts +17 -4
- package/dest/log/log-filters.d.ts.map +1 -1
- package/dest/log/log-filters.js +26 -12
- package/dest/log/pino-logger-server.d.ts +9 -0
- package/dest/log/pino-logger-server.d.ts.map +1 -0
- package/dest/log/pino-logger-server.js +18 -0
- package/dest/log/pino-logger.d.ts +37 -8
- package/dest/log/pino-logger.d.ts.map +1 -1
- package/dest/log/pino-logger.js +137 -29
- package/dest/queue/base_memory_queue.d.ts +2 -2
- package/dest/queue/base_memory_queue.d.ts.map +1 -1
- package/dest/queue/batch_queue.d.ts +1 -1
- package/dest/queue/batch_queue.d.ts.map +1 -1
- package/dest/queue/batch_queue.js +1 -0
- package/dest/queue/semaphore.d.ts +5 -1
- package/dest/queue/semaphore.d.ts.map +1 -1
- package/dest/retry/index.d.ts +22 -1
- package/dest/retry/index.d.ts.map +1 -1
- package/dest/retry/index.js +32 -0
- package/dest/schemas/api.d.ts +2 -2
- package/dest/schemas/api.d.ts.map +1 -1
- package/dest/serialize/buffer_reader.d.ts +14 -4
- package/dest/serialize/buffer_reader.d.ts.map +1 -1
- package/dest/serialize/buffer_reader.js +26 -4
- package/dest/serialize/serialize.d.ts +19 -1
- package/dest/serialize/serialize.d.ts.map +1 -1
- package/dest/serialize/serialize.js +31 -0
- package/dest/sleep/index.d.ts +2 -1
- package/dest/sleep/index.d.ts.map +1 -1
- package/dest/sleep/index.js +10 -1
- package/dest/string/index.js +1 -1
- package/dest/timer/date.d.ts +25 -1
- package/dest/timer/date.d.ts.map +1 -1
- package/dest/timer/date.js +33 -0
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts +11 -2
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts.map +1 -1
- package/dest/transport/index.d.ts +1 -2
- package/dest/transport/index.d.ts.map +1 -1
- package/dest/transport/index.js +0 -1
- package/dest/transport/transport_client.js +2 -2
- package/dest/trees/balanced_merkle_tree_root.d.ts +17 -0
- package/dest/trees/balanced_merkle_tree_root.d.ts.map +1 -0
- package/dest/trees/{balanced_merkle_tree.js → balanced_merkle_tree_root.js} +2 -17
- package/dest/trees/hasher.d.ts +3 -1
- package/dest/trees/hasher.d.ts.map +1 -1
- package/dest/trees/hasher.js +10 -5
- package/dest/trees/index.d.ts +4 -4
- package/dest/trees/index.d.ts.map +1 -1
- package/dest/trees/index.js +3 -3
- package/dest/trees/indexed_merkle_tree_calculator.d.ts +1 -1
- package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/indexed_merkle_tree_calculator.js +5 -1
- package/dest/trees/membership_witness.d.ts +11 -1
- package/dest/trees/membership_witness.d.ts.map +1 -1
- package/dest/trees/membership_witness.js +9 -0
- package/dest/trees/merkle_tree_calculator.d.ts +1 -1
- package/dest/trees/merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/merkle_tree_calculator.js +2 -2
- package/dest/trees/sibling_path.d.ts +2 -1
- package/dest/trees/sibling_path.d.ts.map +1 -1
- package/dest/trees/sibling_path.js +2 -2
- package/dest/trees/unbalanced_merkle_tree_calculator.d.ts +2 -2
- package/dest/trees/unbalanced_merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/unbalanced_merkle_tree_calculator.js +1 -1
- package/dest/trees/{unbalanced_merkle_tree.d.ts → unbalanced_merkle_tree_root.d.ts} +3 -7
- package/dest/trees/unbalanced_merkle_tree_root.d.ts.map +1 -0
- package/dest/trees/{unbalanced_merkle_tree.js → unbalanced_merkle_tree_root.js} +8 -52
- package/dest/trees/unbalanced_tree_store.d.ts +5 -1
- package/dest/trees/unbalanced_tree_store.d.ts.map +1 -1
- package/dest/trees/unbalanced_tree_store.js +49 -1
- package/dest/types/index.d.ts +4 -2
- package/dest/types/index.d.ts.map +1 -1
- package/dest/types/index.js +3 -0
- package/package.json +26 -4
- package/src/array/sorted_array.ts +22 -17
- package/src/branded-types/block_number.ts +5 -0
- package/src/branded-types/buffer32_hash.ts +42 -0
- package/src/branded-types/checkpoint_number.ts +5 -0
- package/src/branded-types/index.ts +2 -0
- package/src/branded-types/index_within_checkpoint.ts +88 -0
- package/src/branded-types/slot.ts +5 -0
- package/src/buffer/buffer16.ts +3 -0
- package/src/buffer/buffer32.ts +36 -65
- package/src/buffer/index.ts +1 -0
- package/src/buffer/utils.ts +8 -0
- package/src/collection/array.ts +66 -0
- package/src/collection/index.ts +1 -0
- package/src/collection/lru_set.ts +115 -0
- package/src/config/env_var.ts +71 -19
- package/src/config/index.ts +126 -82
- package/src/config/network_config.ts +3 -0
- package/src/config/network_name.ts +4 -1
- package/src/crypto/aes128/index.ts +11 -2
- package/src/crypto/bls/bn254_keystore.ts +0 -23
- package/src/crypto/poseidon/index.ts +42 -44
- package/src/crypto/random/randomness_singleton.ts +9 -5
- package/src/crypto/secp256k1-signer/utils.ts +32 -0
- package/src/crypto/sync/poseidon/index.ts +0 -9
- package/src/curves/bls12/field.ts +0 -7
- package/src/curves/bn254/field.ts +31 -33
- package/src/curves/grumpkin/point.ts +6 -3
- package/src/eth-address/index.ts +0 -4
- package/src/eth-signature/eth_signature.ts +7 -1
- package/src/fifo/fifo_frame_reader.ts +98 -0
- package/src/fifo/index.ts +1 -0
- package/src/jest/setup.mjs +31 -1
- package/src/json-rpc/client/fetch.ts +4 -3
- package/src/json-rpc/client/safe_json_rpc_client.ts +2 -0
- package/src/json-rpc/client/undici.ts +23 -3
- package/src/json-rpc/server/api_key_auth.ts +63 -0
- package/src/json-rpc/server/index.ts +1 -0
- package/src/json-rpc/server/safe_json_rpc_server.ts +1 -1
- package/src/log/bigint-utils.ts +25 -0
- package/src/log/gcloud-logger-config.ts +5 -0
- package/src/log/libp2p_logger.ts +12 -5
- package/src/log/log-filters.ts +29 -11
- package/src/log/pino-logger-server.ts +25 -0
- package/src/log/pino-logger.ts +160 -39
- package/src/queue/base_memory_queue.ts +1 -1
- package/src/queue/batch_queue.ts +1 -0
- package/src/queue/semaphore.ts +5 -0
- package/src/retry/index.ts +48 -0
- package/src/schemas/api.ts +4 -1
- package/src/serialize/buffer_reader.ts +36 -9
- package/src/serialize/serialize.ts +32 -0
- package/src/sleep/index.ts +10 -1
- package/src/string/index.ts +1 -1
- package/src/timer/date.ts +48 -0
- package/src/transport/dispatch/create_dispatch_proxy.ts +11 -1
- package/src/transport/index.ts +0 -1
- package/src/transport/transport_client.ts +2 -2
- package/src/trees/{balanced_merkle_tree.ts → balanced_merkle_tree_root.ts} +2 -18
- package/src/trees/hasher.ts +9 -0
- package/src/trees/index.ts +3 -3
- package/src/trees/indexed_merkle_tree_calculator.ts +5 -1
- package/src/trees/membership_witness.ts +8 -0
- package/src/trees/merkle_tree_calculator.ts +2 -2
- package/src/trees/sibling_path.ts +2 -2
- package/src/trees/unbalanced_merkle_tree_calculator.ts +1 -2
- package/src/trees/{unbalanced_merkle_tree.ts → unbalanced_merkle_tree_root.ts} +8 -66
- package/src/trees/unbalanced_tree_store.ts +57 -2
- package/src/types/index.ts +6 -1
- package/dest/crypto/serialize.d.ts +0 -51
- package/dest/crypto/serialize.d.ts.map +0 -1
- package/dest/crypto/serialize.js +0 -68
- package/dest/transport/dispatch/create_dispatch_fn.d.ts +0 -25
- package/dest/transport/dispatch/create_dispatch_fn.d.ts.map +0 -1
- package/dest/transport/dispatch/create_dispatch_fn.js +0 -17
- package/dest/trees/balanced_merkle_tree.d.ts +0 -22
- package/dest/trees/balanced_merkle_tree.d.ts.map +0 -1
- package/dest/trees/unbalanced_merkle_tree.d.ts.map +0 -1
- package/src/crypto/serialize.ts +0 -85
- package/src/transport/dispatch/create_dispatch_fn.ts +0 -35
package/src/config/index.ts
CHANGED
|
@@ -10,14 +10,15 @@ export type { EnvVar, NetworkNames };
|
|
|
10
10
|
export type { NetworkConfig, NetworkConfigMap } from './network_config.js';
|
|
11
11
|
export { NetworkConfigMapSchema, NetworkConfigSchema } from './network_config.js';
|
|
12
12
|
|
|
13
|
-
export interface ConfigMapping {
|
|
13
|
+
export interface ConfigMapping<T> {
|
|
14
14
|
env?: EnvVar;
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
/** Parse an env-var string into `T`. Throws on invalid input. */
|
|
16
|
+
parseEnv?: (val: string) => T;
|
|
17
|
+
defaultValue?: T;
|
|
17
18
|
printDefault?: (val: any) => string;
|
|
18
19
|
description: string;
|
|
19
20
|
isBoolean?: boolean;
|
|
20
|
-
nested?: Record<string, ConfigMapping
|
|
21
|
+
nested?: Record<string, ConfigMapping<any>>;
|
|
21
22
|
fallback?: EnvVar[];
|
|
22
23
|
/**
|
|
23
24
|
* List of deprecated env vars that are still supported but will log a warning.
|
|
@@ -30,7 +31,9 @@ export function isBooleanConfigValue<T>(obj: T, key: keyof T): boolean {
|
|
|
30
31
|
return typeof obj[key] === 'boolean';
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
export type ConfigMappingsType<T> =
|
|
34
|
+
export type ConfigMappingsType<T> = {
|
|
35
|
+
[K in keyof T]-?: ConfigMapping<Required<T>[K]>;
|
|
36
|
+
};
|
|
34
37
|
|
|
35
38
|
/**
|
|
36
39
|
* Shared utility function to get a value from environment variables with fallback support.
|
|
@@ -66,8 +69,8 @@ export function getValueFromEnvWithFallback<T>(
|
|
|
66
69
|
}
|
|
67
70
|
}
|
|
68
71
|
|
|
69
|
-
// Parse the value if needed
|
|
70
|
-
if (value !== undefined) {
|
|
72
|
+
// Parse the value if needed. Empty strings are treated as "not set".
|
|
73
|
+
if (value !== undefined && value !== '') {
|
|
71
74
|
return parseFunc ? parseFunc(value) : (value as unknown as T);
|
|
72
75
|
}
|
|
73
76
|
|
|
@@ -84,7 +87,11 @@ export function getConfigFromMappings<T>(configMappings: ConfigMappingsType<T>):
|
|
|
84
87
|
(config as any)[key] = getConfigFromMappings(nested);
|
|
85
88
|
} else {
|
|
86
89
|
// Use the shared utility function
|
|
87
|
-
|
|
90
|
+
try {
|
|
91
|
+
(config as any)[key] = getValueFromEnvWithFallback(env, parseEnv, defaultValue, fallback);
|
|
92
|
+
} catch (e: any) {
|
|
93
|
+
throw new Error(`Failed to parse config '${key}' (env: ${env ?? 'none'}): ${e.message}`);
|
|
94
|
+
}
|
|
88
95
|
|
|
89
96
|
// Check for deprecated env vars and warn if logger is set
|
|
90
97
|
if (deprecatedFallback?.length) {
|
|
@@ -123,7 +130,7 @@ export function omitConfigMappings<T, K extends keyof T>(
|
|
|
123
130
|
* @param defaultVal - The default numerical value to use if the environment variable is not set or is invalid
|
|
124
131
|
* @returns Object with parseEnv and default values for a numerical config value
|
|
125
132
|
*/
|
|
126
|
-
export function numberConfigHelper(defaultVal: number): Pick<ConfigMapping
|
|
133
|
+
export function numberConfigHelper(defaultVal: number): Pick<ConfigMapping<number>, 'parseEnv' | 'defaultValue'> {
|
|
127
134
|
return {
|
|
128
135
|
parseEnv: (val: string) => safeParseNumber(val, defaultVal),
|
|
129
136
|
defaultValue: defaultVal,
|
|
@@ -138,7 +145,7 @@ export function numberConfigHelper(defaultVal: number): Pick<ConfigMapping, 'par
|
|
|
138
145
|
export function floatConfigHelper(
|
|
139
146
|
defaultVal: number,
|
|
140
147
|
validationFn?: (val: number) => void,
|
|
141
|
-
): Pick<ConfigMapping
|
|
148
|
+
): Pick<ConfigMapping<number>, 'parseEnv' | 'defaultValue'> {
|
|
142
149
|
return {
|
|
143
150
|
parseEnv: (val: string): number => {
|
|
144
151
|
const parsed = safeParseFloat(val, defaultVal);
|
|
@@ -149,16 +156,49 @@ export function floatConfigHelper(
|
|
|
149
156
|
};
|
|
150
157
|
}
|
|
151
158
|
|
|
159
|
+
/**
|
|
160
|
+
* Parses an environment variable to a 0-1 percentage value
|
|
161
|
+
*/
|
|
162
|
+
export function percentageConfigHelper(defaultVal: number): Pick<ConfigMapping<number>, 'parseEnv' | 'defaultValue'> {
|
|
163
|
+
return {
|
|
164
|
+
parseEnv: (val: string): number => {
|
|
165
|
+
const parsed = safeParseFloat(val, defaultVal);
|
|
166
|
+
if (parsed < 0 || parsed > 1) {
|
|
167
|
+
throw new TypeError(`Invalid percentage value: ${parsed} should be between 0 and 1`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return parsed;
|
|
171
|
+
},
|
|
172
|
+
defaultValue: defaultVal,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
152
176
|
/**
|
|
153
177
|
* Generates parseEnv and default values for a numerical config value.
|
|
154
178
|
* @param defaultVal - The default numerical value to use if the environment variable is not set or is invalid
|
|
155
179
|
* @returns Object with parseEnv and default values for a numerical config value
|
|
156
180
|
*/
|
|
157
|
-
export function bigintConfigHelper(defaultVal
|
|
181
|
+
export function bigintConfigHelper(defaultVal: bigint): Pick<ConfigMapping<bigint>, 'parseEnv' | 'defaultValue'>;
|
|
182
|
+
export function bigintConfigHelper(): Pick<ConfigMapping<bigint | undefined>, 'parseEnv' | 'defaultValue'>;
|
|
183
|
+
export function bigintConfigHelper(
|
|
184
|
+
defaultVal?: bigint,
|
|
185
|
+
): Pick<ConfigMapping<bigint | undefined>, 'parseEnv' | 'defaultValue'> {
|
|
158
186
|
return {
|
|
159
187
|
parseEnv: (val: string) => {
|
|
160
|
-
|
|
161
|
-
|
|
188
|
+
// Handle scientific notation (e.g. "1e+23", "2E23") which BigInt() doesn't accept directly.
|
|
189
|
+
// We parse it losslessly using bigint arithmetic instead of going through float64.
|
|
190
|
+
if (/[eE]/.test(val)) {
|
|
191
|
+
const match = val.match(/^(-?\d+(?:\.(\d+))?)[eE]([+-]?\d+)$/);
|
|
192
|
+
if (!match) {
|
|
193
|
+
throw new Error(`Cannot convert '${val}' to a BigInt`);
|
|
194
|
+
}
|
|
195
|
+
const digits = match[1].replace('.', '');
|
|
196
|
+
const decimalPlaces = match[2]?.length ?? 0;
|
|
197
|
+
const exponent = parseInt(match[3], 10) - decimalPlaces;
|
|
198
|
+
if (exponent < 0) {
|
|
199
|
+
throw new Error(`Cannot convert '${val}' to a BigInt: result is not an integer`);
|
|
200
|
+
}
|
|
201
|
+
return BigInt(digits) * 10n ** BigInt(exponent);
|
|
162
202
|
}
|
|
163
203
|
return BigInt(val);
|
|
164
204
|
},
|
|
@@ -168,32 +208,37 @@ export function bigintConfigHelper(defaultVal?: bigint): Pick<ConfigMapping, 'pa
|
|
|
168
208
|
|
|
169
209
|
/**
|
|
170
210
|
* Generates parseEnv for an optional numerical config value.
|
|
211
|
+
* Empty strings are already handled by getValueFromEnvWithFallback.
|
|
171
212
|
*/
|
|
172
|
-
export function optionalNumberConfigHelper(): Pick<ConfigMapping
|
|
213
|
+
export function optionalNumberConfigHelper(): Pick<ConfigMapping<number>, 'parseEnv'> {
|
|
173
214
|
return {
|
|
174
|
-
parseEnv: (val: string
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
215
|
+
parseEnv: (val: string) => {
|
|
216
|
+
const parsedValue = parseInt(val);
|
|
217
|
+
if (!Number.isSafeInteger(parsedValue)) {
|
|
218
|
+
throw new Error(`Invalid number: ${val}`);
|
|
178
219
|
}
|
|
179
|
-
return
|
|
220
|
+
return parsedValue;
|
|
180
221
|
},
|
|
181
222
|
};
|
|
182
223
|
}
|
|
183
224
|
|
|
184
225
|
/** Generates parseEnv for an enum-like config value. */
|
|
226
|
+
export function enumConfigHelper<T extends string>(
|
|
227
|
+
values: T[],
|
|
228
|
+
defaultValue: NoInfer<T>,
|
|
229
|
+
): Pick<ConfigMapping<T>, 'parseEnv' | 'defaultValue'>;
|
|
230
|
+
export function enumConfigHelper<T extends string>(
|
|
231
|
+
values: T[],
|
|
232
|
+
): Pick<ConfigMapping<T | undefined>, 'parseEnv' | 'defaultValue'>;
|
|
185
233
|
export function enumConfigHelper<T extends string>(
|
|
186
234
|
values: T[],
|
|
187
235
|
defaultValue?: NoInfer<T>,
|
|
188
|
-
): Pick<ConfigMapping
|
|
236
|
+
): Pick<ConfigMapping<T | undefined>, 'parseEnv' | 'defaultValue'> {
|
|
189
237
|
return {
|
|
190
238
|
parseEnv: (val: string) => {
|
|
191
|
-
const sanitizedVal =
|
|
192
|
-
if (values.
|
|
193
|
-
return
|
|
194
|
-
}
|
|
195
|
-
if (!val && defaultValue) {
|
|
196
|
-
return defaultValue;
|
|
239
|
+
const sanitizedVal = val.trim().toLowerCase();
|
|
240
|
+
if (values.some(v => v.toLowerCase() === sanitizedVal)) {
|
|
241
|
+
return values.find(v => v.toLowerCase() === sanitizedVal)!;
|
|
197
242
|
}
|
|
198
243
|
throw new Error(`Invalid config value '${val}' (must be one of ${values.join(', ')})`);
|
|
199
244
|
},
|
|
@@ -208,7 +253,9 @@ export function enumConfigHelper<T extends string>(
|
|
|
208
253
|
*/
|
|
209
254
|
export function booleanConfigHelper(
|
|
210
255
|
defaultVal = false,
|
|
211
|
-
): Required<
|
|
256
|
+
): Required<
|
|
257
|
+
Pick<ConfigMapping<boolean>, 'parseEnv' | 'defaultValue' | 'isBoolean'> & { parseVal: (val: string) => boolean }
|
|
258
|
+
> {
|
|
212
259
|
const parse = (val: string | boolean) => (typeof val === 'boolean' ? val : parseBooleanEnv(val));
|
|
213
260
|
return {
|
|
214
261
|
parseEnv: parse,
|
|
@@ -218,91 +265,88 @@ export function booleanConfigHelper(
|
|
|
218
265
|
};
|
|
219
266
|
}
|
|
220
267
|
|
|
221
|
-
export function secretValueConfigHelper<T>(parse: (val: string | undefined) => T):
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
268
|
+
export function secretValueConfigHelper<T>(parse: (val: string | undefined) => T): Pick<
|
|
269
|
+
ConfigMapping<SecretValue<T>>,
|
|
270
|
+
'parseEnv' | 'defaultValue'
|
|
271
|
+
> & {
|
|
272
|
+
parseVal: (val: string) => SecretValue<T>;
|
|
273
|
+
} {
|
|
226
274
|
const wrap = (val: string) => new SecretValue(parse(val));
|
|
227
275
|
return {
|
|
228
276
|
parseEnv: wrap,
|
|
229
277
|
parseVal: wrap,
|
|
230
278
|
defaultValue: new SecretValue(parse(undefined)),
|
|
231
|
-
isBoolean: true,
|
|
232
279
|
};
|
|
233
280
|
}
|
|
234
281
|
|
|
235
282
|
export { parseBooleanEnv } from './parse-env.js';
|
|
236
283
|
|
|
237
|
-
export function secretStringConfigHelper():
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
export function secretStringConfigHelper(defaultValue: string):
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
export function secretStringConfigHelper(defaultValue?: string):
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
284
|
+
export function secretStringConfigHelper(): {
|
|
285
|
+
parseEnv: (val: string) => SecretValue<string>;
|
|
286
|
+
parseVal: (val: string) => SecretValue<string>;
|
|
287
|
+
defaultValue: undefined;
|
|
288
|
+
};
|
|
289
|
+
export function secretStringConfigHelper(defaultValue: string): {
|
|
290
|
+
parseEnv: (val: string) => SecretValue<string>;
|
|
291
|
+
parseVal: (val: string) => SecretValue<string>;
|
|
292
|
+
defaultValue: SecretValue<string>;
|
|
293
|
+
};
|
|
294
|
+
export function secretStringConfigHelper(defaultValue?: string): {
|
|
295
|
+
parseEnv: (val: string) => SecretValue<string>;
|
|
296
|
+
parseVal: (val: string) => SecretValue<string>;
|
|
297
|
+
defaultValue: SecretValue<string> | undefined;
|
|
298
|
+
} {
|
|
252
299
|
const parse = (val: string) => new SecretValue(val);
|
|
253
300
|
return {
|
|
254
301
|
parseEnv: parse,
|
|
255
302
|
parseVal: parse,
|
|
256
303
|
defaultValue: defaultValue !== undefined ? new SecretValue(defaultValue) : undefined,
|
|
257
|
-
isBoolean: true,
|
|
258
304
|
};
|
|
259
305
|
}
|
|
260
306
|
|
|
261
|
-
export function secretFrConfigHelper():
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
export function secretFrConfigHelper(defaultValue: Fr):
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
export function secretFrConfigHelper(defaultValue?: Fr):
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
307
|
+
export function secretFrConfigHelper(): {
|
|
308
|
+
parseEnv: (val: string) => SecretValue<Fr>;
|
|
309
|
+
parseVal: (val: string) => SecretValue<Fr>;
|
|
310
|
+
defaultValue: undefined;
|
|
311
|
+
};
|
|
312
|
+
export function secretFrConfigHelper(defaultValue: Fr): {
|
|
313
|
+
parseEnv: (val: string) => SecretValue<Fr>;
|
|
314
|
+
parseVal: (val: string) => SecretValue<Fr>;
|
|
315
|
+
defaultValue: SecretValue<Fr>;
|
|
316
|
+
};
|
|
317
|
+
export function secretFrConfigHelper(defaultValue?: Fr): {
|
|
318
|
+
parseEnv: (val: string) => SecretValue<Fr>;
|
|
319
|
+
parseVal: (val: string) => SecretValue<Fr>;
|
|
320
|
+
defaultValue: SecretValue<Fr> | undefined;
|
|
321
|
+
} {
|
|
276
322
|
const parse = (val: string) => new SecretValue(Fr.fromHexString(val));
|
|
277
323
|
return {
|
|
278
324
|
parseEnv: parse,
|
|
279
325
|
parseVal: parse,
|
|
280
326
|
defaultValue: defaultValue !== undefined ? new SecretValue(defaultValue) : undefined,
|
|
281
|
-
isBoolean: true,
|
|
282
327
|
};
|
|
283
328
|
}
|
|
284
329
|
|
|
285
|
-
export function secretFqConfigHelper(
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
export function secretFqConfigHelper():
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
export function secretFqConfigHelper(defaultValue?: Fq):
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
330
|
+
export function secretFqConfigHelper(): {
|
|
331
|
+
parseEnv: (val: string) => SecretValue<Fq>;
|
|
332
|
+
parseVal: (val: string) => SecretValue<Fq>;
|
|
333
|
+
defaultValue: undefined;
|
|
334
|
+
};
|
|
335
|
+
export function secretFqConfigHelper(defaultValue: Fq): {
|
|
336
|
+
parseEnv: (val: string) => SecretValue<Fq>;
|
|
337
|
+
parseVal: (val: string) => SecretValue<Fq>;
|
|
338
|
+
defaultValue: SecretValue<Fq>;
|
|
339
|
+
};
|
|
340
|
+
export function secretFqConfigHelper(defaultValue?: Fq): {
|
|
341
|
+
parseEnv: (val: string) => SecretValue<Fq>;
|
|
342
|
+
parseVal: (val: string) => SecretValue<Fq>;
|
|
343
|
+
defaultValue: SecretValue<Fq> | undefined;
|
|
344
|
+
} {
|
|
300
345
|
const parse = (val: string) => new SecretValue(Fq.fromHexString(val));
|
|
301
346
|
return {
|
|
302
347
|
parseEnv: parse,
|
|
303
348
|
parseVal: parse,
|
|
304
|
-
defaultValue:
|
|
305
|
-
isBoolean: true,
|
|
349
|
+
defaultValue: defaultValue !== undefined ? new SecretValue(defaultValue) : undefined,
|
|
306
350
|
};
|
|
307
351
|
}
|
|
308
352
|
|
|
@@ -5,10 +5,13 @@ export const NetworkConfigSchema = z
|
|
|
5
5
|
bootnodes: z.array(z.string()),
|
|
6
6
|
snapshots: z.array(z.string()),
|
|
7
7
|
blobFileStoreUrls: z.array(z.string()).optional(),
|
|
8
|
+
txCollectionFileStoreUrls: z.array(z.string()).optional(),
|
|
8
9
|
registryAddress: z.string(),
|
|
9
10
|
feeAssetHandlerAddress: z.string().optional(),
|
|
10
11
|
l1ChainId: z.number(),
|
|
11
12
|
blockDurationMs: z.number().positive().optional(),
|
|
13
|
+
txPublicSetupAllowListExtend: z.string().optional(),
|
|
14
|
+
nodeVersion: z.string().optional(),
|
|
12
15
|
})
|
|
13
16
|
.passthrough(); // Allow additional unknown fields to pass through
|
|
14
17
|
|
|
@@ -5,7 +5,8 @@ export type NetworkNames =
|
|
|
5
5
|
| 'testnet'
|
|
6
6
|
| 'mainnet'
|
|
7
7
|
| 'next-net'
|
|
8
|
-
| 'devnet'
|
|
8
|
+
| 'devnet'
|
|
9
|
+
| `v${number}-devnet-${number}`;
|
|
9
10
|
|
|
10
11
|
export function getActiveNetworkName(name?: string): NetworkNames {
|
|
11
12
|
const network = name || process.env.NETWORK;
|
|
@@ -23,6 +24,8 @@ export function getActiveNetworkName(name?: string): NetworkNames {
|
|
|
23
24
|
return 'next-net';
|
|
24
25
|
} else if (network === 'devnet') {
|
|
25
26
|
return 'devnet';
|
|
27
|
+
} else if (/^v\d+-devnet-\d+$/.test(network)) {
|
|
28
|
+
return network as `v${number}-devnet-${number}`;
|
|
26
29
|
}
|
|
27
30
|
throw new Error(`Unknown network: ${network}`);
|
|
28
31
|
}
|
|
@@ -59,10 +59,19 @@ export class Aes128 {
|
|
|
59
59
|
* @param iv - AES initialization vector.
|
|
60
60
|
* @param key - Key to decrypt with.
|
|
61
61
|
* @returns Decrypted data.
|
|
62
|
+
* @throws If the decrypted buffer has invalid PKCS#7 padding.
|
|
62
63
|
*/
|
|
63
64
|
public async decryptBufferCBC(data: Uint8Array, iv: Uint8Array, key: Uint8Array) {
|
|
64
65
|
const paddedBuffer = await this.decryptBufferCBCKeepPadding(data, iv, key);
|
|
65
|
-
const
|
|
66
|
-
|
|
66
|
+
const paddingLen = paddedBuffer[paddedBuffer.length - 1];
|
|
67
|
+
if (paddingLen === 0 || paddingLen > 16) {
|
|
68
|
+
throw new Error(`Invalid PKCS#7 padding length: ${paddingLen}`);
|
|
69
|
+
}
|
|
70
|
+
for (let i = paddedBuffer.length - paddingLen; i < paddedBuffer.length; i++) {
|
|
71
|
+
if (paddedBuffer[i] !== paddingLen) {
|
|
72
|
+
throw new Error('Invalid PKCS#7 padding');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return paddedBuffer.subarray(0, paddedBuffer.length - paddingLen);
|
|
67
76
|
}
|
|
68
77
|
}
|
|
@@ -262,26 +262,3 @@ export function decryptBn254KeystoreFromObject(keystore: Bn254Keystore, password
|
|
|
262
262
|
throw new Bn254KeystoreError(`Failed to decrypt keystore: ${String(error)}`, error as Error);
|
|
263
263
|
}
|
|
264
264
|
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Validates that a decrypted private key matches the public key in the keystore.
|
|
268
|
-
*
|
|
269
|
-
* @param privateKeyHex - Decrypted private key (0x-prefixed)
|
|
270
|
-
* @param expectedPubkey - Expected public key from keystore
|
|
271
|
-
* @param computePublicKey - Function to compute public key from private key
|
|
272
|
-
* @returns true if keys match, false otherwise
|
|
273
|
-
*/
|
|
274
|
-
export function verifyBn254Keypair(
|
|
275
|
-
privateKeyHex: string,
|
|
276
|
-
expectedPubkey: string,
|
|
277
|
-
computePublicKey: (privateKey: string) => string,
|
|
278
|
-
): boolean {
|
|
279
|
-
try {
|
|
280
|
-
const computedPubkey = computePublicKey(privateKeyHex);
|
|
281
|
-
const normalizedExpected = expectedPubkey.toLowerCase().replace(/^0x/i, '');
|
|
282
|
-
const normalizedComputed = computedPubkey.toLowerCase().replace(/^0x/i, '');
|
|
283
|
-
return normalizedExpected === normalizedComputed;
|
|
284
|
-
} catch {
|
|
285
|
-
return false;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
@@ -1,21 +1,35 @@
|
|
|
1
|
-
import { BarretenbergSync } from '@aztec/bb.js';
|
|
1
|
+
import { Barretenberg, BarretenbergSync } from '@aztec/bb.js';
|
|
2
2
|
|
|
3
3
|
import { Fr } from '../../curves/bn254/field.js';
|
|
4
4
|
import { type Fieldable, serializeToFields } from '../../serialize/serialize.js';
|
|
5
5
|
|
|
6
|
+
const IS_BROWSER = typeof self !== 'undefined';
|
|
7
|
+
|
|
8
|
+
async function poseidon2HashFields(inputFields: Fr[]): Promise<Fr> {
|
|
9
|
+
if (IS_BROWSER) {
|
|
10
|
+
await BarretenbergSync.initSingleton();
|
|
11
|
+
const api = BarretenbergSync.getSingleton();
|
|
12
|
+
const response = api.poseidon2Hash({
|
|
13
|
+
inputs: inputFields.map(i => i.toBuffer()),
|
|
14
|
+
});
|
|
15
|
+
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
16
|
+
} else {
|
|
17
|
+
await Barretenberg.initSingleton();
|
|
18
|
+
const api = Barretenberg.getSingleton();
|
|
19
|
+
const response = await api.poseidon2Hash({
|
|
20
|
+
inputs: inputFields.map(i => i.toBuffer()),
|
|
21
|
+
});
|
|
22
|
+
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
6
26
|
/**
|
|
7
27
|
* Create a poseidon hash (field) from an array of input fields.
|
|
8
28
|
* @param input - The input fields to hash.
|
|
9
29
|
* @returns The poseidon hash.
|
|
10
30
|
*/
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
await BarretenbergSync.initSingleton();
|
|
14
|
-
const api = BarretenbergSync.getSingleton();
|
|
15
|
-
const response = api.poseidon2Hash({
|
|
16
|
-
inputs: inputFields.map(i => i.toBuffer()),
|
|
17
|
-
});
|
|
18
|
-
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
31
|
+
export function poseidon2Hash(input: Fieldable[]): Promise<Fr> {
|
|
32
|
+
return poseidon2HashFields(serializeToFields(input));
|
|
19
33
|
}
|
|
20
34
|
|
|
21
35
|
/**
|
|
@@ -24,25 +38,10 @@ export async function poseidon2Hash(input: Fieldable[]): Promise<Fr> {
|
|
|
24
38
|
* @param separator - The domain separator.
|
|
25
39
|
* @returns The poseidon hash.
|
|
26
40
|
*/
|
|
27
|
-
export
|
|
41
|
+
export function poseidon2HashWithSeparator(input: Fieldable[], separator: number): Promise<Fr> {
|
|
28
42
|
const inputFields = serializeToFields(input);
|
|
29
43
|
inputFields.unshift(new Fr(separator));
|
|
30
|
-
|
|
31
|
-
const api = BarretenbergSync.getSingleton();
|
|
32
|
-
const response = api.poseidon2Hash({
|
|
33
|
-
inputs: inputFields.map(i => i.toBuffer()),
|
|
34
|
-
});
|
|
35
|
-
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export async function poseidon2HashAccumulate(input: Fieldable[]): Promise<Fr> {
|
|
39
|
-
const inputFields = serializeToFields(input);
|
|
40
|
-
await BarretenbergSync.initSingleton();
|
|
41
|
-
const api = BarretenbergSync.getSingleton();
|
|
42
|
-
const response = api.poseidon2HashAccumulate({
|
|
43
|
-
inputs: inputFields.map(i => i.toBuffer()),
|
|
44
|
-
});
|
|
45
|
-
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
44
|
+
return poseidon2HashFields(inputFields);
|
|
46
45
|
}
|
|
47
46
|
|
|
48
47
|
/**
|
|
@@ -52,19 +51,24 @@ export async function poseidon2HashAccumulate(input: Fieldable[]): Promise<Fr> {
|
|
|
52
51
|
*/
|
|
53
52
|
export async function poseidon2Permutation(input: Fieldable[]): Promise<Fr[]> {
|
|
54
53
|
const inputFields = serializeToFields(input);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
54
|
+
if (IS_BROWSER) {
|
|
55
|
+
await BarretenbergSync.initSingleton();
|
|
56
|
+
const api = BarretenbergSync.getSingleton();
|
|
57
|
+
const response = api.poseidon2Permutation({
|
|
58
|
+
inputs: inputFields.map(i => i.toBuffer()),
|
|
59
|
+
});
|
|
60
|
+
return response.outputs.map(o => Fr.fromBuffer(Buffer.from(o)));
|
|
61
|
+
} else {
|
|
62
|
+
await Barretenberg.initSingleton();
|
|
63
|
+
const api = Barretenberg.getSingleton();
|
|
64
|
+
const response = await api.poseidon2Permutation({
|
|
65
|
+
inputs: inputFields.map(i => i.toBuffer()),
|
|
66
|
+
});
|
|
67
|
+
return response.outputs.map(o => Fr.fromBuffer(Buffer.from(o)));
|
|
68
|
+
}
|
|
65
69
|
}
|
|
66
70
|
|
|
67
|
-
export
|
|
71
|
+
export function poseidon2HashBytes(input: Buffer): Promise<Fr> {
|
|
68
72
|
const inputFields = [];
|
|
69
73
|
for (let i = 0; i < input.length; i += 31) {
|
|
70
74
|
const fieldBytes = Buffer.alloc(32, 0);
|
|
@@ -75,11 +79,5 @@ export async function poseidon2HashBytes(input: Buffer): Promise<Fr> {
|
|
|
75
79
|
inputFields.push(Fr.fromBuffer(fieldBytes));
|
|
76
80
|
}
|
|
77
81
|
|
|
78
|
-
|
|
79
|
-
const api = BarretenbergSync.getSingleton();
|
|
80
|
-
const response = api.poseidon2Hash({
|
|
81
|
-
inputs: inputFields.map(i => i.toBuffer()),
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
82
|
+
return poseidon2HashFields(inputFields);
|
|
85
83
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createLogger } from '../../log/pino-logger.js';
|
|
1
|
+
import { type Logger, type LoggerBindings, createLogger } from '../../log/pino-logger.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* A number generator which is used as a source of randomness in the system. If the SEED env variable is set, the
|
|
@@ -12,9 +12,13 @@ export class RandomnessSingleton {
|
|
|
12
12
|
private static instance: RandomnessSingleton;
|
|
13
13
|
|
|
14
14
|
private counter = 0;
|
|
15
|
-
private
|
|
15
|
+
private log: Logger;
|
|
16
16
|
|
|
17
|
-
private constructor(
|
|
17
|
+
private constructor(
|
|
18
|
+
private readonly seed?: number,
|
|
19
|
+
bindings?: LoggerBindings,
|
|
20
|
+
) {
|
|
21
|
+
this.log = createLogger('foundation:randomness_singleton', bindings);
|
|
18
22
|
if (seed !== undefined) {
|
|
19
23
|
this.log.debug(`Using pseudo-randomness with seed: ${seed}`);
|
|
20
24
|
this.counter = seed;
|
|
@@ -23,10 +27,10 @@ export class RandomnessSingleton {
|
|
|
23
27
|
}
|
|
24
28
|
}
|
|
25
29
|
|
|
26
|
-
public static getInstance(): RandomnessSingleton {
|
|
30
|
+
public static getInstance(bindings?: LoggerBindings): RandomnessSingleton {
|
|
27
31
|
if (!RandomnessSingleton.instance) {
|
|
28
32
|
const seed = process.env.SEED ? Number(process.env.SEED) : undefined;
|
|
29
|
-
RandomnessSingleton.instance = new RandomnessSingleton(seed);
|
|
33
|
+
RandomnessSingleton.instance = new RandomnessSingleton(seed, bindings);
|
|
30
34
|
}
|
|
31
35
|
|
|
32
36
|
return RandomnessSingleton.instance;
|
|
@@ -210,3 +210,35 @@ export function recoverPublicKey(hash: Buffer32, signature: Signature, opts: Rec
|
|
|
210
210
|
const publicKey = sig.recoverPublicKey(hash.buffer).toHex(false);
|
|
211
211
|
return Buffer.from(publicKey, 'hex');
|
|
212
212
|
}
|
|
213
|
+
|
|
214
|
+
/** Arbitrary hash used for testing signature recoverability. */
|
|
215
|
+
const PROBE_HASH = Buffer32.fromBuffer(keccak256(Buffer.from('signature-recoverability-probe')));
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Generates a random valid ECDSA signature that is recoverable to some address.
|
|
219
|
+
* Since Signature.random() produces real signatures via secp256k1 signing, the result is always
|
|
220
|
+
* recoverable, but we verify defensively by checking tryRecoverAddress.
|
|
221
|
+
*/
|
|
222
|
+
export function generateRecoverableSignature(): Signature {
|
|
223
|
+
for (let i = 0; i < 100; i++) {
|
|
224
|
+
const sig = Signature.random();
|
|
225
|
+
if (tryRecoverAddress(PROBE_HASH, sig) !== undefined) {
|
|
226
|
+
return sig;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
throw new Secp256k1Error('Failed to generate a recoverable signature after 100 attempts');
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Generates a random signature where ECDSA address recovery fails.
|
|
234
|
+
* Uses random r/s values (not from real signing) so that r is unlikely to be a valid secp256k1 x-coordinate.
|
|
235
|
+
*/
|
|
236
|
+
export function generateUnrecoverableSignature(): Signature {
|
|
237
|
+
for (let i = 0; i < 100; i++) {
|
|
238
|
+
const sig = new Signature(Buffer32.random(), Buffer32.random(), 27);
|
|
239
|
+
if (tryRecoverAddress(PROBE_HASH, sig) === undefined) {
|
|
240
|
+
return sig;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
throw new Secp256k1Error('Failed to generate an unrecoverable signature after 100 attempts');
|
|
244
|
+
}
|
|
@@ -34,15 +34,6 @@ export function poseidon2HashWithSeparator(input: Fieldable[], separator: number
|
|
|
34
34
|
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
export function poseidon2HashAccumulate(input: Fieldable[]): Fr {
|
|
38
|
-
const inputFields = serializeToFields(input);
|
|
39
|
-
const api = BarretenbergSync.getSingleton();
|
|
40
|
-
const response = api.poseidon2HashAccumulate({
|
|
41
|
-
inputs: inputFields.map(i => i.toBuffer()),
|
|
42
|
-
});
|
|
43
|
-
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
44
|
-
}
|
|
45
|
-
|
|
46
37
|
/**
|
|
47
38
|
* Runs a Poseidon2 permutation.
|
|
48
39
|
* @param input the input state. Expected to be of size 4.
|
|
@@ -6,7 +6,6 @@ import { toBigIntBE, toBufferBE } from '../../bigint-buffer/index.js';
|
|
|
6
6
|
import { randomBytes } from '../../crypto/random/index.js';
|
|
7
7
|
import { hexSchemaFor } from '../../schemas/utils.js';
|
|
8
8
|
import { BufferReader } from '../../serialize/buffer_reader.js';
|
|
9
|
-
import { TypeRegistry } from '../../serialize/type_registry.js';
|
|
10
9
|
import { Fr } from '../bn254/field.js';
|
|
11
10
|
|
|
12
11
|
/**
|
|
@@ -323,9 +322,6 @@ export class BLS12Fr extends BLS12Field {
|
|
|
323
322
|
}
|
|
324
323
|
}
|
|
325
324
|
|
|
326
|
-
// For deserializing JSON.
|
|
327
|
-
TypeRegistry.register('BLS12Fr', BLS12Fr);
|
|
328
|
-
|
|
329
325
|
/**
|
|
330
326
|
* Fq field class.
|
|
331
327
|
* @dev This class is used to represent elements of BLS12-381 base field.
|
|
@@ -458,6 +454,3 @@ export class BLS12Fq extends BLS12Field {
|
|
|
458
454
|
return hexSchemaFor(BLS12Fq);
|
|
459
455
|
}
|
|
460
456
|
}
|
|
461
|
-
|
|
462
|
-
// For deserializing JSON.
|
|
463
|
-
TypeRegistry.register('BLS12Fq', BLS12Fq);
|