@aztec/foundation 3.0.3 → 3.9.9-nightly.20260312

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 (226) hide show
  1. package/dest/array/index.d.ts +2 -1
  2. package/dest/array/index.d.ts.map +1 -1
  3. package/dest/array/index.js +1 -0
  4. package/dest/array/sorted_array.d.ts +15 -0
  5. package/dest/array/sorted_array.d.ts.map +1 -0
  6. package/dest/array/sorted_array.js +109 -0
  7. package/dest/branded-types/block_number.d.ts +4 -1
  8. package/dest/branded-types/block_number.d.ts.map +1 -1
  9. package/dest/branded-types/block_number.js +3 -0
  10. package/dest/branded-types/checkpoint_number.d.ts +10 -2
  11. package/dest/branded-types/checkpoint_number.d.ts.map +1 -1
  12. package/dest/branded-types/checkpoint_number.js +17 -8
  13. package/dest/branded-types/index.d.ts +3 -2
  14. package/dest/branded-types/index.d.ts.map +1 -1
  15. package/dest/branded-types/index.js +2 -1
  16. package/dest/branded-types/index_within_checkpoint.d.ts +42 -0
  17. package/dest/branded-types/index_within_checkpoint.d.ts.map +1 -0
  18. package/dest/branded-types/index_within_checkpoint.js +59 -0
  19. package/dest/buffer/buffer16.d.ts +4 -1
  20. package/dest/buffer/buffer16.d.ts.map +1 -1
  21. package/dest/buffer/buffer16.js +3 -1
  22. package/dest/buffer/buffer32.d.ts +4 -1
  23. package/dest/buffer/buffer32.d.ts.map +1 -1
  24. package/dest/buffer/buffer32.js +3 -1
  25. package/dest/collection/array.d.ts +12 -1
  26. package/dest/collection/array.d.ts.map +1 -1
  27. package/dest/collection/array.js +51 -0
  28. package/dest/config/env_var.d.ts +2 -2
  29. package/dest/config/env_var.d.ts.map +1 -1
  30. package/dest/config/index.d.ts +6 -3
  31. package/dest/config/index.d.ts.map +1 -1
  32. package/dest/config/index.js +31 -7
  33. package/dest/config/network_config.d.ts +31 -1
  34. package/dest/config/network_config.d.ts.map +1 -1
  35. package/dest/config/network_config.js +6 -1
  36. package/dest/config/parse-env.d.ts +3 -0
  37. package/dest/config/parse-env.d.ts.map +1 -0
  38. package/dest/config/parse-env.js +7 -0
  39. package/dest/config/secret_value.js +3 -1
  40. package/dest/crypto/ecdsa/signature.d.ts +10 -1
  41. package/dest/crypto/ecdsa/signature.d.ts.map +1 -1
  42. package/dest/crypto/poseidon/index.d.ts +1 -2
  43. package/dest/crypto/poseidon/index.d.ts.map +1 -1
  44. package/dest/crypto/poseidon/index.js +13 -22
  45. package/dest/crypto/random/randomness_singleton.d.ts +4 -3
  46. package/dest/crypto/random/randomness_singleton.d.ts.map +1 -1
  47. package/dest/crypto/random/randomness_singleton.js +5 -5
  48. package/dest/crypto/secp256k1-signer/utils.d.ts +12 -1
  49. package/dest/crypto/secp256k1-signer/utils.d.ts.map +1 -1
  50. package/dest/crypto/secp256k1-signer/utils.js +26 -0
  51. package/dest/crypto/sync/poseidon/index.d.ts +1 -2
  52. package/dest/crypto/sync/poseidon/index.d.ts.map +1 -1
  53. package/dest/crypto/sync/poseidon/index.js +0 -8
  54. package/dest/curves/bls12/field.js +6 -3
  55. package/dest/curves/bls12/point.d.ts +10 -1
  56. package/dest/curves/bls12/point.d.ts.map +1 -1
  57. package/dest/curves/bls12/point.js +3 -1
  58. package/dest/curves/bn254/field.d.ts +7 -7
  59. package/dest/curves/bn254/field.d.ts.map +1 -1
  60. package/dest/curves/bn254/field.js +33 -43
  61. package/dest/curves/grumpkin/point.d.ts +11 -2
  62. package/dest/curves/grumpkin/point.d.ts.map +1 -1
  63. package/dest/error/index.d.ts +4 -4
  64. package/dest/error/index.d.ts.map +1 -1
  65. package/dest/eth-address/index.js +4 -2
  66. package/dest/eth-signature/eth_signature.d.ts +5 -1
  67. package/dest/eth-signature/eth_signature.d.ts.map +1 -1
  68. package/dest/eth-signature/eth_signature.js +7 -2
  69. package/dest/iterator/filter.d.ts +3 -0
  70. package/dest/iterator/filter.d.ts.map +1 -0
  71. package/dest/iterator/filter.js +7 -0
  72. package/dest/iterator/index.d.ts +2 -0
  73. package/dest/iterator/index.d.ts.map +1 -0
  74. package/dest/iterator/index.js +1 -0
  75. package/dest/jest/setup.js +4 -1
  76. package/dest/json-rpc/client/safe_json_rpc_client.d.ts +2 -1
  77. package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -1
  78. package/dest/json-rpc/client/safe_json_rpc_client.js +1 -1
  79. package/dest/json-rpc/client/undici.d.ts +1 -1
  80. package/dest/json-rpc/client/undici.d.ts.map +1 -1
  81. package/dest/json-rpc/client/undici.js +21 -4
  82. package/dest/json-rpc/fixtures/class_a.d.ts +3 -3
  83. package/dest/json-rpc/fixtures/class_a.d.ts.map +1 -1
  84. package/dest/json-rpc/fixtures/class_b.d.ts +3 -3
  85. package/dest/json-rpc/fixtures/class_b.d.ts.map +1 -1
  86. package/dest/json-rpc/server/api_key_auth.d.ts +19 -0
  87. package/dest/json-rpc/server/api_key_auth.d.ts.map +1 -0
  88. package/dest/json-rpc/server/api_key_auth.js +57 -0
  89. package/dest/json-rpc/server/index.d.ts +2 -1
  90. package/dest/json-rpc/server/index.d.ts.map +1 -1
  91. package/dest/json-rpc/server/index.js +1 -0
  92. package/dest/json-rpc/server/safe_json_rpc_server.js +1 -1
  93. package/dest/log/bigint-utils.d.ts +5 -0
  94. package/dest/log/bigint-utils.d.ts.map +1 -0
  95. package/dest/log/bigint-utils.js +21 -0
  96. package/dest/log/gcloud-logger-config.d.ts +1 -1
  97. package/dest/log/gcloud-logger-config.d.ts.map +1 -1
  98. package/dest/log/gcloud-logger-config.js +3 -0
  99. package/dest/log/libp2p_logger.d.ts +5 -2
  100. package/dest/log/libp2p_logger.d.ts.map +1 -1
  101. package/dest/log/libp2p_logger.js +14 -4
  102. package/dest/log/log-filters.d.ts +17 -4
  103. package/dest/log/log-filters.d.ts.map +1 -1
  104. package/dest/log/log-filters.js +26 -12
  105. package/dest/log/pino-logger-server.d.ts +9 -0
  106. package/dest/log/pino-logger-server.d.ts.map +1 -0
  107. package/dest/log/pino-logger-server.js +18 -0
  108. package/dest/log/pino-logger.d.ts +37 -8
  109. package/dest/log/pino-logger.d.ts.map +1 -1
  110. package/dest/log/pino-logger.js +122 -29
  111. package/dest/queue/base_memory_queue.d.ts +2 -2
  112. package/dest/queue/base_memory_queue.d.ts.map +1 -1
  113. package/dest/queue/semaphore.d.ts +5 -1
  114. package/dest/queue/semaphore.d.ts.map +1 -1
  115. package/dest/retry/index.d.ts +11 -1
  116. package/dest/retry/index.d.ts.map +1 -1
  117. package/dest/retry/index.js +11 -0
  118. package/dest/schemas/schemas.d.ts +3 -1
  119. package/dest/schemas/schemas.d.ts.map +1 -1
  120. package/dest/schemas/schemas.js +5 -0
  121. package/dest/schemas/types.d.ts +31 -1
  122. package/dest/schemas/types.d.ts.map +1 -1
  123. package/dest/schemas/types.js +25 -1
  124. package/dest/serialize/buffer_reader.d.ts +14 -4
  125. package/dest/serialize/buffer_reader.d.ts.map +1 -1
  126. package/dest/serialize/buffer_reader.js +26 -4
  127. package/dest/serialize/serialize.d.ts +19 -1
  128. package/dest/serialize/serialize.d.ts.map +1 -1
  129. package/dest/serialize/serialize.js +31 -0
  130. package/dest/sleep/index.d.ts +3 -1
  131. package/dest/sleep/index.d.ts.map +1 -1
  132. package/dest/sleep/index.js +4 -0
  133. package/dest/timer/date.d.ts +24 -1
  134. package/dest/timer/date.d.ts.map +1 -1
  135. package/dest/timer/date.js +32 -0
  136. package/dest/transport/transport_client.js +2 -2
  137. package/dest/trees/balanced_merkle_tree_root.d.ts +17 -0
  138. package/dest/trees/balanced_merkle_tree_root.d.ts.map +1 -0
  139. package/dest/trees/{balanced_merkle_tree.js → balanced_merkle_tree_root.js} +2 -17
  140. package/dest/trees/hasher.d.ts +3 -1
  141. package/dest/trees/hasher.d.ts.map +1 -1
  142. package/dest/trees/hasher.js +10 -5
  143. package/dest/trees/index.d.ts +4 -4
  144. package/dest/trees/index.d.ts.map +1 -1
  145. package/dest/trees/index.js +3 -3
  146. package/dest/trees/membership_witness.d.ts +11 -1
  147. package/dest/trees/membership_witness.d.ts.map +1 -1
  148. package/dest/trees/membership_witness.js +9 -0
  149. package/dest/trees/merkle_tree_calculator.d.ts +1 -1
  150. package/dest/trees/merkle_tree_calculator.d.ts.map +1 -1
  151. package/dest/trees/merkle_tree_calculator.js +2 -2
  152. package/dest/trees/sibling_path.d.ts +2 -1
  153. package/dest/trees/sibling_path.d.ts.map +1 -1
  154. package/dest/trees/sibling_path.js +2 -2
  155. package/dest/trees/unbalanced_merkle_tree_calculator.d.ts +2 -3
  156. package/dest/trees/unbalanced_merkle_tree_calculator.d.ts.map +1 -1
  157. package/dest/trees/unbalanced_merkle_tree_calculator.js +1 -5
  158. package/dest/trees/{unbalanced_merkle_tree.d.ts → unbalanced_merkle_tree_root.d.ts} +3 -5
  159. package/dest/trees/unbalanced_merkle_tree_root.d.ts.map +1 -0
  160. package/dest/trees/{unbalanced_merkle_tree.js → unbalanced_merkle_tree_root.js} +11 -49
  161. package/dest/trees/unbalanced_tree_store.d.ts +5 -1
  162. package/dest/trees/unbalanced_tree_store.d.ts.map +1 -1
  163. package/dest/trees/unbalanced_tree_store.js +49 -1
  164. package/dest/types/index.d.ts +6 -2
  165. package/dest/types/index.d.ts.map +1 -1
  166. package/dest/types/index.js +6 -0
  167. package/package.json +26 -4
  168. package/src/array/index.ts +1 -0
  169. package/src/array/sorted_array.ts +138 -0
  170. package/src/branded-types/block_number.ts +5 -0
  171. package/src/branded-types/checkpoint_number.ts +22 -7
  172. package/src/branded-types/index.ts +2 -1
  173. package/src/branded-types/index_within_checkpoint.ts +88 -0
  174. package/src/collection/array.ts +52 -0
  175. package/src/config/env_var.ts +75 -15
  176. package/src/config/index.ts +34 -4
  177. package/src/config/network_config.ts +5 -0
  178. package/src/config/parse-env.ts +4 -0
  179. package/src/crypto/poseidon/index.ts +13 -23
  180. package/src/crypto/random/randomness_singleton.ts +6 -4
  181. package/src/crypto/secp256k1-signer/utils.ts +32 -0
  182. package/src/crypto/sync/poseidon/index.ts +0 -9
  183. package/src/curves/bn254/field.ts +32 -43
  184. package/src/eth-address/index.ts +1 -1
  185. package/src/eth-signature/eth_signature.ts +7 -1
  186. package/src/iterator/filter.ts +11 -0
  187. package/src/iterator/index.ts +1 -0
  188. package/src/jest/setup.mjs +4 -1
  189. package/src/json-rpc/client/safe_json_rpc_client.ts +2 -0
  190. package/src/json-rpc/client/undici.ts +21 -3
  191. package/src/json-rpc/server/api_key_auth.ts +63 -0
  192. package/src/json-rpc/server/index.ts +1 -0
  193. package/src/json-rpc/server/safe_json_rpc_server.ts +1 -1
  194. package/src/log/bigint-utils.ts +25 -0
  195. package/src/log/gcloud-logger-config.ts +5 -0
  196. package/src/log/libp2p_logger.ts +12 -5
  197. package/src/log/log-filters.ts +29 -11
  198. package/src/log/pino-logger-server.ts +25 -0
  199. package/src/log/pino-logger.ts +144 -39
  200. package/src/queue/base_memory_queue.ts +1 -1
  201. package/src/queue/semaphore.ts +5 -0
  202. package/src/retry/index.ts +18 -0
  203. package/src/schemas/schemas.ts +8 -0
  204. package/src/schemas/types.ts +33 -0
  205. package/src/serialize/buffer_reader.ts +36 -9
  206. package/src/serialize/serialize.ts +32 -0
  207. package/src/sleep/index.ts +6 -0
  208. package/src/timer/date.ts +46 -0
  209. package/src/transport/transport_client.ts +2 -2
  210. package/src/trees/{balanced_merkle_tree.ts → balanced_merkle_tree_root.ts} +2 -18
  211. package/src/trees/hasher.ts +9 -0
  212. package/src/trees/index.ts +3 -3
  213. package/src/trees/membership_witness.ts +8 -0
  214. package/src/trees/merkle_tree_calculator.ts +2 -2
  215. package/src/trees/sibling_path.ts +2 -2
  216. package/src/trees/unbalanced_merkle_tree_calculator.ts +1 -12
  217. package/src/trees/{unbalanced_merkle_tree.ts → unbalanced_merkle_tree_root.ts} +17 -61
  218. package/src/trees/unbalanced_tree_store.ts +57 -2
  219. package/src/types/index.ts +11 -1
  220. package/dest/json-rpc/server/telemetry.d.ts +0 -2
  221. package/dest/json-rpc/server/telemetry.d.ts.map +0 -1
  222. package/dest/json-rpc/server/telemetry.js +0 -0
  223. package/dest/trees/balanced_merkle_tree.d.ts +0 -22
  224. package/dest/trees/balanced_merkle_tree.d.ts.map +0 -1
  225. package/dest/trees/unbalanced_merkle_tree.d.ts.map +0 -1
  226. package/src/json-rpc/server/telemetry.ts +0 -0
@@ -250,6 +250,58 @@ export function chunk<T>(items: T[], chunkSize: number): T[][] {
250
250
  return chunks;
251
251
  }
252
252
 
253
+ /**
254
+ * Splits the given array into chunks of the given size, wrapping around to the beginning
255
+ * if the last chunk would be smaller than the requested size.
256
+ * Returns empty array for empty input. Returns single chunk with all items if chunkSize <= 0.
257
+ */
258
+ export function chunkWrapAround<T>(items: T[], chunkSize: number): T[][] {
259
+ if (items.length === 0) {
260
+ return [];
261
+ }
262
+ if (chunkSize <= 0 || items.length <= chunkSize) {
263
+ return [items];
264
+ }
265
+ const remainder = items.length % chunkSize;
266
+ if (remainder === 0) {
267
+ return chunk(items, chunkSize);
268
+ }
269
+ const wrapAroundCount = chunkSize - remainder;
270
+ const wrappedItems = [...items, ...items.slice(0, wrapAroundCount)];
271
+ return chunk(wrappedItems, chunkSize);
272
+ }
273
+
274
+ const UNINITIALIZED = Symbol('uninitialized');
275
+
276
+ /**
277
+ * Splits the given iterable into chunks based on the key returned by the given function.
278
+ * Items must be contiguous to be included in the same chunk.
279
+ */
280
+ export function chunkBy<T, U>(items: T[], fn: (item: T) => U): T[][] {
281
+ const chunks: T[][] = [];
282
+ let currentChunk: T[] = [];
283
+ let currentKey: U | typeof UNINITIALIZED = UNINITIALIZED;
284
+
285
+ for (const item of items) {
286
+ const key = fn(item);
287
+ if (currentKey === UNINITIALIZED || key !== currentKey) {
288
+ if (currentChunk.length > 0) {
289
+ chunks.push(currentChunk);
290
+ }
291
+ currentChunk = [item];
292
+ currentKey = key;
293
+ } else {
294
+ currentChunk.push(item);
295
+ }
296
+ }
297
+
298
+ if (currentChunk.length > 0) {
299
+ chunks.push(currentChunk);
300
+ }
301
+
302
+ return chunks;
303
+ }
304
+
253
305
  /** Partitions the given iterable into two arrays based on the predicate. */
254
306
  export function partition<T>(items: T[], predicate: (item: T) => boolean): [T[], T[]] {
255
307
  const pass: T[] = [];
@@ -12,6 +12,9 @@ export type EnvVar =
12
12
  | 'ARCHIVER_VIEM_POLLING_INTERVAL_MS'
13
13
  | 'ARCHIVER_BATCH_SIZE'
14
14
  | 'AZTEC_ADMIN_PORT'
15
+ | 'AZTEC_ADMIN_API_KEY_HASH'
16
+ | 'AZTEC_DISABLE_ADMIN_API_KEY'
17
+ | 'AZTEC_RESET_ADMIN_API_KEY'
15
18
  | 'AZTEC_NODE_ADMIN_URL'
16
19
  | 'AZTEC_NODE_URL'
17
20
  | 'AZTEC_PORT'
@@ -21,12 +24,13 @@ export type EnvVar =
21
24
  | 'BB_NUM_IVC_VERIFIERS'
22
25
  | 'BB_IVC_CONCURRENCY'
23
26
  | 'BOOTSTRAP_NODES'
24
- | 'BLOB_SINK_ARCHIVE_API_URL'
25
- | 'BLOB_SINK_PORT'
26
- | 'BLOB_SINK_URL'
27
+ | 'BLOB_ARCHIVE_API_URL'
28
+ | 'BLOB_FILE_STORE_URLS'
29
+ | 'BLOB_FILE_STORE_UPLOAD_URL'
30
+ | 'BLOB_HEALTHCHECK_UPLOAD_INTERVAL_MINUTES'
27
31
  | 'BOT_DA_GAS_LIMIT'
28
32
  | 'BOT_FEE_PAYMENT_METHOD'
29
- | 'BOT_BASE_FEE_PADDING'
33
+ | 'BOT_MIN_FEE_PADDING'
30
34
  | 'BOT_FLUSH_SETUP_TRANSACTIONS'
31
35
  | 'BOT_FOLLOW_CHAIN'
32
36
  | 'BOT_L2_GAS_LIMIT'
@@ -46,7 +50,10 @@ export type EnvVar =
46
50
  | 'BOT_TX_MINED_WAIT_SECONDS'
47
51
  | 'BOT_MAX_CONSECUTIVE_ERRORS'
48
52
  | 'BOT_STOP_WHEN_UNHEALTHY'
49
- | 'BOT_AMM_TXS'
53
+ | 'BOT_MODE'
54
+ | 'BOT_L2_TO_L1_MESSAGES_PER_TX'
55
+ | 'BOT_L1_TO_L2_SEED_COUNT'
56
+ | 'BOT_L1_TO_L2_SEED_INTERVAL'
50
57
  | 'COINBASE'
51
58
  | 'CRS_PATH'
52
59
  | 'DATA_DIRECTORY'
@@ -63,6 +70,7 @@ export type EnvVar =
63
70
  | 'PUBLIC_DATA_TREE_MAP_SIZE_KB'
64
71
  | 'DEBUG'
65
72
  | 'DEBUG_P2P_DISABLE_COLOCATION_PENALTY'
73
+ | 'ENABLE_PROVER_NODE'
66
74
  | 'ETHEREUM_HOSTS'
67
75
  | 'ETHEREUM_DEBUG_HOSTS'
68
76
  | 'ETHEREUM_ALLOW_NO_DEBUG_HOSTS'
@@ -76,6 +84,7 @@ export type EnvVar =
76
84
  | 'L1_CONSENSUS_HOST_API_KEY_HEADERS'
77
85
  | 'LOG_JSON'
78
86
  | 'LOG_MULTILINE'
87
+ | 'LOG_NO_COLOR_PER_ACTOR'
79
88
  | 'LOG_LEVEL'
80
89
  | 'MNEMONIC'
81
90
  | 'NETWORK'
@@ -93,7 +102,12 @@ export type EnvVar =
93
102
  | 'PUBLIC_OTEL_INCLUDE_METRICS'
94
103
  | 'PUBLIC_OTEL_COLLECT_FROM'
95
104
  | 'PUBLIC_OTEL_OPT_OUT'
105
+ | 'P2P_BATCH_TX_REQUESTER_SMART_PARALLEL_WORKER_COUNT'
106
+ | 'P2P_BATCH_TX_REQUESTER_DUMB_PARALLEL_WORKER_COUNT'
107
+ | 'P2P_BATCH_TX_REQUESTER_TX_BATCH_SIZE'
108
+ | 'P2P_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD'
96
109
  | 'P2P_BLOCK_CHECK_INTERVAL_MS'
110
+ | 'P2P_SLOT_CHECK_INTERVAL_MS'
97
111
  | 'P2P_BLOCK_REQUEST_BATCH_SIZE'
98
112
  | 'P2P_BOOTSTRAP_NODE_ENR_VERSION_CHECK'
99
113
  | 'P2P_BOOTSTRAP_NODES_AS_FULL_PEERS'
@@ -132,12 +146,13 @@ export type EnvVar =
132
146
  | 'P2P_TRUSTED_PEERS'
133
147
  | 'P2P_PRIVATE_PEERS'
134
148
  | 'P2P_PREFERRED_PEERS'
135
- | 'P2P_MAX_TX_POOL_SIZE'
136
- | 'P2P_TX_POOL_OVERFLOW_FACTOR'
149
+ | 'P2P_MAX_PENDING_TX_COUNT'
137
150
  | 'P2P_SEEN_MSG_CACHE_SIZE'
138
151
  | 'P2P_DROP_TX'
139
152
  | 'P2P_DROP_TX_CHANCE'
140
153
  | 'P2P_TX_POOL_DELETE_TXS_AFTER_REORG'
154
+ | 'P2P_MIN_TX_POOL_AGE_MS'
155
+ | 'P2P_RPC_PRICE_BUMP_PERCENTAGE'
141
156
  | 'DEBUG_P2P_INSTRUMENT_MESSAGES'
142
157
  | 'PEER_ID_PRIVATE_KEY'
143
158
  | 'PEER_ID_PRIVATE_KEY_PATH'
@@ -151,7 +166,11 @@ export type EnvVar =
151
166
  | 'PROVER_BROKER_BATCH_INTERVAL_MS'
152
167
  | 'PROVER_BROKER_BATCH_SIZE'
153
168
  | 'PROVER_BROKER_MAX_EPOCHS_TO_KEEP_RESULTS_FOR'
169
+ | 'PROVER_BROKER_DEBUG_REPLAY_ENABLED'
170
+ | 'PROVER_CANCEL_JOBS_ON_STOP'
171
+ | 'PROVER_ENQUEUE_CONCURRENCY'
154
172
  | 'PROVER_COORDINATION_NODE_URLS'
173
+ | 'PROVER_PROOF_STORE'
155
174
  | 'PROVER_FAILED_PROOF_STORE'
156
175
  | 'PROVER_NODE_FAILED_EPOCH_STORE'
157
176
  | 'PROVER_NODE_DISABLE_PROOF_PUBLISH'
@@ -175,6 +194,7 @@ export type EnvVar =
175
194
  | 'PROVER_TEST_VERIFICATION_DELAY_MS'
176
195
  | 'PXE_L2_BLOCK_BATCH_SIZE'
177
196
  | 'PXE_PROVER_ENABLED'
197
+ | 'PXE_SYNC_CHAIN_TIP'
178
198
  | 'RPC_MAX_BATCH_SIZE'
179
199
  | 'RPC_MAX_BODY_SIZE'
180
200
  | 'RPC_SIMULATE_PUBLIC_MAX_GAS_LIMIT'
@@ -182,23 +202,29 @@ export type EnvVar =
182
202
  | 'SENTINEL_ENABLED'
183
203
  | 'SENTINEL_HISTORY_LENGTH_IN_EPOCHS'
184
204
  | 'SENTINEL_HISTORIC_PROVEN_PERFORMANCE_LENGTH_IN_EPOCHS'
185
- | 'SEQ_MAX_BLOCK_SIZE_IN_BYTES'
186
205
  | 'SEQ_MAX_TX_PER_BLOCK'
206
+ | 'SEQ_MAX_TX_PER_CHECKPOINT'
187
207
  | 'SEQ_MIN_TX_PER_BLOCK'
188
208
  | 'SEQ_PUBLISH_TXS_WITH_PROPOSALS'
189
209
  | 'SEQ_MAX_DA_BLOCK_GAS'
190
210
  | 'SEQ_MAX_L2_BLOCK_GAS'
211
+ | 'SEQ_PER_BLOCK_ALLOCATION_MULTIPLIER'
212
+ | 'SEQ_REDISTRIBUTE_CHECKPOINT_BUDGET'
191
213
  | 'SEQ_PUBLISHER_PRIVATE_KEY'
192
214
  | 'SEQ_PUBLISHER_PRIVATE_KEYS'
193
215
  | 'SEQ_PUBLISHER_ADDRESSES'
194
216
  | 'SEQ_PUBLISHER_ALLOW_INVALID_STATES'
195
217
  | 'SEQ_PUBLISHER_FORWARDER_ADDRESS'
196
- | 'SEQ_TX_POLLING_INTERVAL_MS'
218
+ | 'SEQ_POLLING_INTERVAL_MS'
197
219
  | 'SEQ_ENFORCE_TIME_TABLE'
198
- | 'SEQ_MAX_L1_TX_INCLUSION_TIME_INTO_SLOT'
220
+ | 'SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT'
199
221
  | 'SEQ_ATTESTATION_PROPAGATION_TIME'
222
+ | 'SEQ_BLOCK_DURATION_MS'
223
+ | 'SEQ_EXPECTED_BLOCK_PROPOSALS_PER_SLOT'
224
+ | 'SEQ_BUILD_CHECKPOINT_IF_EMPTY'
200
225
  | 'SEQ_SECONDS_BEFORE_INVALIDATING_BLOCK_AS_COMMITTEE_MEMBER'
201
226
  | 'SEQ_SECONDS_BEFORE_INVALIDATING_BLOCK_AS_NON_COMMITTEE_MEMBER'
227
+ | 'SEQ_SKIP_CHECKPOINT_PUBLISH_PERCENT'
202
228
  | 'SLASH_MIN_PENALTY_PERCENTAGE'
203
229
  | 'SLASH_MAX_PENALTY_PERCENTAGE'
204
230
  | 'SLASH_VALIDATORS_ALWAYS'
@@ -209,6 +235,8 @@ export type EnvVar =
209
235
  | 'SLASH_INACTIVITY_TARGET_PERCENTAGE'
210
236
  | 'SLASH_INACTIVITY_CONSECUTIVE_EPOCH_THRESHOLD'
211
237
  | 'SLASH_INVALID_BLOCK_PENALTY'
238
+ | 'SLASH_DUPLICATE_PROPOSAL_PENALTY'
239
+ | 'SLASH_DUPLICATE_ATTESTATION_PENALTY'
212
240
  | 'SLASH_OVERRIDE_PAYLOAD'
213
241
  | 'SLASH_PROPOSE_INVALID_ATTESTATIONS_PENALTY'
214
242
  | 'SLASH_ATTEST_DESCENDANT_OF_INVALID_PENALTY'
@@ -223,6 +251,7 @@ export type EnvVar =
223
251
  | 'TELEMETRY'
224
252
  | 'TEST_ACCOUNTS'
225
253
  | 'SPONSORED_FPC'
254
+ | 'PREFUND_ADDRESSES'
226
255
  | 'TX_COLLECTION_FAST_NODES_TIMEOUT_BEFORE_REQ_RESP_MS'
227
256
  | 'TX_COLLECTION_SLOW_NODES_INTERVAL_MS'
228
257
  | 'TX_COLLECTION_SLOW_REQ_RESP_INTERVAL_MS'
@@ -233,21 +262,39 @@ export type EnvVar =
233
262
  | 'TX_COLLECTION_FAST_MAX_PARALLEL_REQUESTS_PER_NODE'
234
263
  | 'TX_COLLECTION_NODE_RPC_MAX_BATCH_SIZE'
235
264
  | 'TX_COLLECTION_NODE_RPC_URLS'
265
+ | 'TX_COLLECTION_MISSING_TXS_COLLECTOR_TYPE'
266
+ | 'TX_COLLECTION_FILE_STORE_URLS'
267
+ | 'TX_COLLECTION_FILE_STORE_SLOW_DELAY_MS'
268
+ | 'TX_COLLECTION_FILE_STORE_FAST_DELAY_MS'
269
+ | 'TX_COLLECTION_FILE_STORE_FAST_WORKER_COUNT'
270
+ | 'TX_COLLECTION_FILE_STORE_SLOW_WORKER_COUNT'
271
+ | 'TX_COLLECTION_FILE_STORE_FAST_BACKOFF_BASE_MS'
272
+ | 'TX_COLLECTION_FILE_STORE_SLOW_BACKOFF_BASE_MS'
273
+ | 'TX_COLLECTION_FILE_STORE_FAST_BACKOFF_MAX_MS'
274
+ | 'TX_COLLECTION_FILE_STORE_SLOW_BACKOFF_MAX_MS'
275
+ | 'TX_FILE_STORE_URL'
276
+ | 'TX_FILE_STORE_UPLOAD_CONCURRENCY'
277
+ | 'TX_FILE_STORE_MAX_QUEUE_SIZE'
278
+ | 'TX_FILE_STORE_ENABLED'
236
279
  | 'TX_PUBLIC_SETUP_ALLOWLIST'
237
280
  | 'TXE_PORT'
238
281
  | 'TRANSACTIONS_DISABLED'
239
282
  | 'VALIDATOR_ATTESTATIONS_POLLING_INTERVAL_MS'
240
283
  | 'VALIDATOR_DISABLED'
284
+ | 'VALIDATOR_MAX_DA_BLOCK_GAS'
285
+ | 'VALIDATOR_MAX_L2_BLOCK_GAS'
286
+ | 'VALIDATOR_MAX_TX_PER_BLOCK'
287
+ | 'VALIDATOR_MAX_TX_PER_CHECKPOINT'
241
288
  | 'VALIDATOR_PRIVATE_KEYS'
242
289
  | 'VALIDATOR_PRIVATE_KEY'
243
290
  | 'VALIDATOR_REEXECUTE'
244
291
  | 'VALIDATOR_ADDRESSES'
245
292
  | 'ROLLUP_VERSION'
246
293
  | 'WS_BLOCK_CHECK_INTERVAL_MS'
247
- | 'WS_PROVEN_BLOCKS_ONLY'
248
294
  | 'WS_BLOCK_REQUEST_BATCH_SIZE'
249
295
  | 'L1_READER_VIEM_POLLING_INTERVAL_MS'
250
296
  | 'WS_DATA_DIRECTORY'
297
+ | 'WS_NUM_HISTORIC_CHECKPOINTS'
251
298
  | 'WS_NUM_HISTORIC_BLOCKS'
252
299
  | 'ETHEREUM_SLOT_DURATION'
253
300
  | 'AZTEC_SLOT_DURATION'
@@ -255,12 +302,14 @@ export type EnvVar =
255
302
  | 'AZTEC_TARGET_COMMITTEE_SIZE'
256
303
  | 'AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET'
257
304
  | 'AZTEC_LAG_IN_EPOCHS_FOR_RANDAO'
305
+ | 'AZTEC_INBOX_LAG'
258
306
  | 'AZTEC_PROOF_SUBMISSION_EPOCHS'
259
307
  | 'AZTEC_ACTIVATION_THRESHOLD'
260
308
  | 'AZTEC_EJECTION_THRESHOLD'
261
309
  | 'AZTEC_LOCAL_EJECTION_THRESHOLD'
262
310
  | 'AZTEC_MANA_TARGET'
263
311
  | 'AZTEC_PROVING_COST_PER_MANA'
312
+ | 'AZTEC_INITIAL_ETH_PER_FEE_ASSET'
264
313
  | 'AZTEC_SLASHING_QUORUM'
265
314
  | 'AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS'
266
315
  | 'AZTEC_SLASHING_LIFETIME_IN_ROUNDS'
@@ -274,6 +323,7 @@ export type EnvVar =
274
323
  | 'AZTEC_SLASHER_FLAVOR'
275
324
  | 'AZTEC_GOVERNANCE_PROPOSER_QUORUM'
276
325
  | 'AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE'
326
+ | 'AZTEC_GOVERNANCE_VOTING_DURATION'
277
327
  | 'AZTEC_EXIT_DELAY_SECONDS'
278
328
  | 'L1_GAS_LIMIT_BUFFER_PERCENTAGE'
279
329
  | 'L1_GAS_PRICE_MAX'
@@ -299,14 +349,24 @@ export type EnvVar =
299
349
  | 'K8S_POD_NAME'
300
350
  | 'K8S_POD_UID'
301
351
  | 'K8S_NAMESPACE_NAME'
352
+ | 'ENABLE_VERSION_CHECK'
302
353
  | 'VALIDATOR_REEXECUTE_DEADLINE_MS'
303
- | 'ALWAYS_REEXECUTE_BLOCK_PROPOSALS'
304
- | 'AUTO_UPDATE'
305
- | 'AUTO_UPDATE_URL'
306
354
  | 'WEB3_SIGNER_URL'
307
355
  | 'SKIP_ARCHIVER_INITIAL_SYNC'
308
356
  | 'BLOB_ALLOW_EMPTY_SOURCES'
309
357
  | 'FISHERMAN_MODE'
310
358
  | 'MAX_ALLOWED_ETH_CLIENT_DRIFT_SECONDS'
311
359
  | 'LEGACY_BLS_CLI'
312
- | 'DEBUG_FORCE_TX_PROOF_VERIFICATION';
360
+ | 'DEBUG_FORCE_TX_PROOF_VERIFICATION'
361
+ | 'VALIDATOR_HA_SIGNING_ENABLED'
362
+ | 'VALIDATOR_HA_NODE_ID'
363
+ | 'VALIDATOR_HA_POLLING_INTERVAL_MS'
364
+ | 'VALIDATOR_HA_SIGNING_TIMEOUT_MS'
365
+ | 'VALIDATOR_HA_MAX_STUCK_DUTIES_AGE_MS'
366
+ | 'VALIDATOR_HA_OLD_DUTIES_MAX_AGE_H'
367
+ | 'VALIDATOR_HA_DATABASE_URL'
368
+ | 'VALIDATOR_HA_RUN_MIGRATIONS'
369
+ | 'VALIDATOR_HA_POOL_MAX'
370
+ | 'VALIDATOR_HA_POOL_MIN'
371
+ | 'VALIDATOR_HA_POOL_IDLE_TIMEOUT_MS'
372
+ | 'VALIDATOR_HA_POOL_CONNECTION_TIMEOUT_MS';
@@ -2,6 +2,7 @@ import { Fq, Fr } from '../curves/bn254/field.js';
2
2
  import { createConsoleLogger } from '../log/console.js';
3
3
  import type { EnvVar } from './env_var.js';
4
4
  import { type NetworkNames, getActiveNetworkName } from './network_name.js';
5
+ import { parseBooleanEnv } from './parse-env.js';
5
6
  import { SecretValue } from './secret_value.js';
6
7
 
7
8
  export { SecretValue, getActiveNetworkName };
@@ -148,6 +149,23 @@ export function floatConfigHelper(
148
149
  };
149
150
  }
150
151
 
152
+ /**
153
+ * Parses an environment variable to a 0-1 percentage value
154
+ */
155
+ export function percentageConfigHelper(defaultVal: number): Pick<ConfigMapping, 'parseEnv' | 'defaultValue'> {
156
+ return {
157
+ parseEnv: (val: string): number => {
158
+ const parsed = safeParseFloat(val, defaultVal);
159
+ if (parsed < 0 || parsed > 1) {
160
+ throw new TypeError(`Invalid percentage value: ${parsed} should be between 0 and 1`);
161
+ }
162
+
163
+ return parsed;
164
+ },
165
+ defaultValue: defaultVal,
166
+ };
167
+ }
168
+
151
169
  /**
152
170
  * Generates parseEnv and default values for a numerical config value.
153
171
  * @param defaultVal - The default numerical value to use if the environment variable is not set or is invalid
@@ -159,6 +177,21 @@ export function bigintConfigHelper(defaultVal?: bigint): Pick<ConfigMapping, 'pa
159
177
  if (val === '') {
160
178
  return defaultVal;
161
179
  }
180
+ // Handle scientific notation (e.g. "1e+23", "2E23") which BigInt() doesn't accept directly.
181
+ // We parse it losslessly using bigint arithmetic instead of going through float64.
182
+ if (/[eE]/.test(val)) {
183
+ const match = val.match(/^(-?\d+(?:\.(\d+))?)[eE]([+-]?\d+)$/);
184
+ if (!match) {
185
+ throw new Error(`Cannot convert '${val}' to a BigInt`);
186
+ }
187
+ const digits = match[1].replace('.', '');
188
+ const decimalPlaces = match[2]?.length ?? 0;
189
+ const exponent = parseInt(match[3], 10) - decimalPlaces;
190
+ if (exponent < 0) {
191
+ throw new Error(`Cannot convert '${val}' to a BigInt: result is not an integer`);
192
+ }
193
+ return BigInt(digits) * 10n ** BigInt(exponent);
194
+ }
162
195
  return BigInt(val);
163
196
  },
164
197
  defaultValue: defaultVal,
@@ -231,10 +264,7 @@ export function secretValueConfigHelper<T>(parse: (val: string | undefined) => T
231
264
  };
232
265
  }
233
266
 
234
- /** Parses an env var as boolean. Returns true only if value is 1, true, or TRUE. */
235
- export function parseBooleanEnv(val: string | undefined): boolean {
236
- return val !== undefined && ['1', 'true', 'TRUE'].includes(val);
237
- }
267
+ export { parseBooleanEnv } from './parse-env.js';
238
268
 
239
269
  export function secretStringConfigHelper(): Required<
240
270
  Pick<ConfigMapping, 'parseEnv' | 'defaultValue' | 'isBoolean'> & {
@@ -4,9 +4,14 @@ export const NetworkConfigSchema = z
4
4
  .object({
5
5
  bootnodes: z.array(z.string()),
6
6
  snapshots: z.array(z.string()),
7
+ blobFileStoreUrls: z.array(z.string()).optional(),
8
+ txCollectionFileStoreUrls: z.array(z.string()).optional(),
7
9
  registryAddress: z.string(),
8
10
  feeAssetHandlerAddress: z.string().optional(),
9
11
  l1ChainId: z.number(),
12
+ blockDurationMs: z.number().positive().optional(),
13
+ nodeVersion: z.string().optional(),
14
+ txPublicSetupAllowListExtend: z.string().optional(),
10
15
  })
11
16
  .passthrough(); // Allow additional unknown fields to pass through
12
17
 
@@ -0,0 +1,4 @@
1
+ /** Parses an env var as boolean. Returns true only if value is 1, true, or TRUE. */
2
+ export function parseBooleanEnv(val: string | undefined): boolean {
3
+ return val !== undefined && ['1', 'true', 'TRUE'].includes(val);
4
+ }
@@ -1,4 +1,4 @@
1
- import { BarretenbergSync } from '@aztec/bb.js';
1
+ import { Barretenberg } 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';
@@ -10,9 +10,9 @@ import { type Fieldable, serializeToFields } from '../../serialize/serialize.js'
10
10
  */
11
11
  export async function poseidon2Hash(input: Fieldable[]): Promise<Fr> {
12
12
  const inputFields = serializeToFields(input);
13
- await BarretenbergSync.initSingleton();
14
- const api = BarretenbergSync.getSingleton();
15
- const response = api.poseidon2Hash({
13
+ await Barretenberg.initSingleton();
14
+ const api = Barretenberg.getSingleton();
15
+ const response = await api.poseidon2Hash({
16
16
  inputs: inputFields.map(i => i.toBuffer()),
17
17
  });
18
18
  return Fr.fromBuffer(Buffer.from(response.hash));
@@ -27,19 +27,9 @@ export async function poseidon2Hash(input: Fieldable[]): Promise<Fr> {
27
27
  export async function poseidon2HashWithSeparator(input: Fieldable[], separator: number): Promise<Fr> {
28
28
  const inputFields = serializeToFields(input);
29
29
  inputFields.unshift(new Fr(separator));
30
- await BarretenbergSync.initSingleton();
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({
30
+ await Barretenberg.initSingleton();
31
+ const api = Barretenberg.getSingleton();
32
+ const response = await api.poseidon2Hash({
43
33
  inputs: inputFields.map(i => i.toBuffer()),
44
34
  });
45
35
  return Fr.fromBuffer(Buffer.from(response.hash));
@@ -54,9 +44,9 @@ export async function poseidon2Permutation(input: Fieldable[]): Promise<Fr[]> {
54
44
  const inputFields = serializeToFields(input);
55
45
  // We'd like this assertion but it's not possible to use it in the browser.
56
46
  // assert(input.length === 4, 'Input state must be of size 4');
57
- await BarretenbergSync.initSingleton();
58
- const api = BarretenbergSync.getSingleton();
59
- const response = api.poseidon2Permutation({
47
+ await Barretenberg.initSingleton();
48
+ const api = Barretenberg.getSingleton();
49
+ const response = await api.poseidon2Permutation({
60
50
  inputs: inputFields.map(i => i.toBuffer()),
61
51
  });
62
52
  // We'd like this assertion but it's not possible to use it in the browser.
@@ -75,9 +65,9 @@ export async function poseidon2HashBytes(input: Buffer): Promise<Fr> {
75
65
  inputFields.push(Fr.fromBuffer(fieldBytes));
76
66
  }
77
67
 
78
- await BarretenbergSync.initSingleton();
79
- const api = BarretenbergSync.getSingleton();
80
- const response = api.poseidon2Hash({
68
+ await Barretenberg.initSingleton();
69
+ const api = Barretenberg.getSingleton();
70
+ const response = await api.poseidon2Hash({
81
71
  inputs: inputFields.map(i => i.toBuffer()),
82
72
  });
83
73
 
@@ -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,11 +12,13 @@ export class RandomnessSingleton {
12
12
  private static instance: RandomnessSingleton;
13
13
 
14
14
  private counter = 0;
15
+ private log: Logger;
15
16
 
16
17
  private constructor(
17
18
  private readonly seed?: number,
18
- private readonly log = createLogger('foundation:randomness_singleton'),
19
+ bindings?: LoggerBindings,
19
20
  ) {
21
+ this.log = createLogger('foundation:randomness_singleton', bindings);
20
22
  if (seed !== undefined) {
21
23
  this.log.debug(`Using pseudo-randomness with seed: ${seed}`);
22
24
  this.counter = seed;
@@ -25,10 +27,10 @@ export class RandomnessSingleton {
25
27
  }
26
28
  }
27
29
 
28
- public static getInstance(): RandomnessSingleton {
30
+ public static getInstance(bindings?: LoggerBindings): RandomnessSingleton {
29
31
  if (!RandomnessSingleton.instance) {
30
32
  const seed = process.env.SEED ? Number(process.env.SEED) : undefined;
31
- RandomnessSingleton.instance = new RandomnessSingleton(seed);
33
+ RandomnessSingleton.instance = new RandomnessSingleton(seed, bindings);
32
34
  }
33
35
 
34
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.