@aztec-foundation/constants-codegen 0.0.1-commit.b66364b

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.
@@ -0,0 +1,1447 @@
1
+ use crate::{address::AztecAddress, traits::FromField};
2
+
3
+ pub global MAX_FIELD_VALUE: Field =
4
+ 21888242871839275222246405745257275088548364400416034343698204186575808495616;
5
+ pub global MAX_ETH_ADDRESS_BIT_SIZE: u32 = 160; // 20 bytes
6
+ pub global MAX_ETH_ADDRESS_VALUE: Field = 0xffffffffffffffffffffffffffffffffffffffff;
7
+ pub global MAX_U64_VALUE: u64 = 0xffffffffffffffff;
8
+ pub global MAX_U32_VALUE: u32 = 0xffffffff;
9
+
10
+ // WARNING: do not change without consulting AVM which this constant affects
11
+ pub global MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS: u32 = 16_000;
12
+
13
+ /**
14
+ * Convention for constant array lengths are mainly divided in 2 classes:
15
+ * - FUNCTION CALL
16
+ * - TRANSACTION
17
+ *
18
+ * Agreed convention is to use MAX_XXX_PER_CALL resp. MAX_XXX_PER_TX, where XXX denotes a type of element such as
19
+ * commitment, or nullifier, e.g.,:
20
+ * - MAX_NULLIFIERS_PER_CALL
21
+ * - MAX_NOTE_HASHES_PER_TX
22
+ *
23
+ * In the kernel circuits, we accumulate elements such as note hashes and the nullifiers from all functions calls in a
24
+ * transaction. Therefore, we always must have:
25
+ * MAX_XXX_PER_TX >= MAX_XXX_PER_CALL
26
+ *
27
+ * For instance:
28
+ * MAX_NOTE_HASHES_PER_TX >= MAX_NOTE_HASHES_PER_CALL
29
+ * MAX_NULLIFIERS_PER_TX >= MAX_NULLIFIERS_PER_CALL
30
+ *
31
+ */
32
+
33
+ // docs:start:constants
34
+ // TREES RELATED CONSTANTS
35
+ pub global ARCHIVE_HEIGHT: u32 = 30; // 4-second blocks for 100 years.
36
+ pub global VK_TREE_HEIGHT: u32 = 7;
37
+ pub global FUNCTION_TREE_HEIGHT: u32 = 7; // The number of private functions in a contract is therefore 128.
38
+ pub global NOTE_HASH_TREE_HEIGHT: u32 = 42; // 64 notes/tx (static because of base rollup insertion), 15tps, for 100 years.
39
+ pub global PUBLIC_DATA_TREE_HEIGHT: u32 = 40; // Average of 16 updates/tx (guess), 15tps, 100 years.
40
+ pub global NULLIFIER_TREE_HEIGHT: u32 = NOTE_HASH_TREE_HEIGHT;
41
+ pub global L1_TO_L2_MSG_TREE_HEIGHT: u32 = 36; // 1024 messages per checkpoint, with 72 seconds per checkpoint, for 100 years.
42
+ pub global OUT_HASH_TREE_HEIGHT: u32 = 5; // 32 (MAX_CHECKPOINTS_PER_EPOCH) checkpoints per epoch, each has 1 out hash.
43
+ pub global ARTIFACT_FUNCTION_TREE_MAX_HEIGHT: u32 = FUNCTION_TREE_HEIGHT; // The number of unconstrained functions in a contract. Set to equal the number of private functions in a contract.
44
+
45
+ pub global NULLIFIER_TREE_ID: Field = 0;
46
+ pub global NOTE_HASH_TREE_ID: Field = 1;
47
+ pub global PUBLIC_DATA_TREE_ID: Field = 2;
48
+ pub global L1_TO_L2_MESSAGE_TREE_ID: Field = 3;
49
+ pub global ARCHIVE_TREE_ID: Field = 4;
50
+
51
+ pub global NOTE_HASH_TREE_LEAF_COUNT: u64 = 1 << (NOTE_HASH_TREE_HEIGHT as u64);
52
+ pub global L1_TO_L2_MSG_TREE_LEAF_COUNT: u64 = 1 << (L1_TO_L2_MSG_TREE_HEIGHT as u64);
53
+ pub global OUT_HASH_TREE_LEAF_COUNT: u32 = 1 << OUT_HASH_TREE_HEIGHT;
54
+
55
+ // SUB-TREES RELATED CONSTANTS
56
+ pub global NOTE_HASH_SUBTREE_HEIGHT: u32 = 6;
57
+ pub global NULLIFIER_SUBTREE_HEIGHT: u32 = 6;
58
+ pub global PUBLIC_DATA_SUBTREE_HEIGHT: u32 = 6;
59
+ pub global L1_TO_L2_MSG_SUBTREE_HEIGHT: u32 = 10;
60
+ pub global NOTE_HASH_SUBTREE_ROOT_SIBLING_PATH_LENGTH: u32 =
61
+ NOTE_HASH_TREE_HEIGHT - NOTE_HASH_SUBTREE_HEIGHT;
62
+ pub global NULLIFIER_SUBTREE_ROOT_SIBLING_PATH_LENGTH: u32 =
63
+ NULLIFIER_TREE_HEIGHT - NULLIFIER_SUBTREE_HEIGHT;
64
+ // Cap on L1-to-L2 messages bundled into a single L2 block. One quarter of the per-checkpoint
65
+ // cap: a checkpoint drains its Inbox consumption across up to four message-bearing blocks.
66
+ pub global MAX_L1_TO_L2_MSGS_PER_BLOCK: u32 = 256;
67
+ // Cap on L1-to-L2 messages consumed by a single checkpoint.
68
+ pub global MAX_L1_TO_L2_MSGS_PER_CHECKPOINT: u32 = 1024;
69
+ // Maximum number of subtrees a L2ToL1Msg unbalanced tree can have. Used when calculating the out hash of a tx.
70
+ pub global MAX_L2_TO_L1_MSG_SUBTREES_PER_TX: u32 = 3; // ceil(log2(MAX_L2_TO_L1_MSGS_PER_TX))
71
+
72
+ // "PER TRANSACTION" CONSTANTS
73
+ pub global MAX_NOTE_HASHES_PER_TX: u32 = 1 << NOTE_HASH_SUBTREE_HEIGHT;
74
+ pub global MAX_NULLIFIERS_PER_TX: u32 = 1 << NULLIFIER_SUBTREE_HEIGHT;
75
+ pub global MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX: u32 = 16;
76
+ pub global MAX_ENQUEUED_CALLS_PER_TX: u32 = 32;
77
+ pub global PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 1; // This is the fee_payer's fee juice balance.
78
+ pub global MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 =
79
+ (1 as u8 << PUBLIC_DATA_SUBTREE_HEIGHT as u8) as u32;
80
+ pub global MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 =
81
+ MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX - PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX;
82
+ pub global MAX_L2_TO_L1_MSGS_PER_TX: u32 = 8; // Leave at 8, because it results in sha256 hashing in the Tx Base Rollup
83
+ pub global MAX_PRIVATE_LOGS_PER_TX: u32 = MAX_NOTE_HASHES_PER_TX;
84
+ pub global MAX_CONTRACT_CLASS_LOGS_PER_TX: u32 = 1;
85
+ pub global MAX_NOTE_HASH_READ_REQUESTS_PER_TX: u32 = 64;
86
+ pub global MAX_NULLIFIER_READ_REQUESTS_PER_TX: u32 = 64;
87
+ // Key validation requests are not only for app-siloed _nullifier_ secret keys: app-siloed tagging shared secrets might require this mechanism,
88
+ // hence why it's higher than you might expect (roughly (but not quite) enough for a tagging shared secret per private log + 1 nsk).
89
+ pub global MAX_KEY_VALIDATION_REQUESTS_PER_TX: u32 = MAX_PRIVATE_LOGS_PER_TX;
90
+
91
+ // "PER CALL" CONSTANTS
92
+ pub global MAX_NOTE_HASHES_PER_CALL: u32 = 16;
93
+ pub global MAX_NULLIFIERS_PER_CALL: u32 = 16;
94
+ pub global MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL: u32 = 8;
95
+ pub global MAX_ENQUEUED_CALLS_PER_CALL: u32 = MAX_ENQUEUED_CALLS_PER_TX;
96
+ pub global MAX_L2_TO_L1_MSGS_PER_CALL: u32 = MAX_L2_TO_L1_MSGS_PER_TX;
97
+ pub global MAX_PRIVATE_LOGS_PER_CALL: u32 = MAX_NOTE_HASHES_PER_CALL;
98
+ pub global MAX_CONTRACT_CLASS_LOGS_PER_CALL: u32 = 1;
99
+ pub global MAX_NOTE_HASH_READ_REQUESTS_PER_CALL: u32 = 16;
100
+ pub global MAX_NULLIFIER_READ_REQUESTS_PER_CALL: u32 = 16;
101
+ pub global MAX_KEY_VALIDATION_REQUESTS_PER_CALL: u32 = MAX_PRIVATE_LOGS_PER_CALL;
102
+ // docs:end:constants
103
+
104
+ // VK TREE CONSTANTS
105
+ pub global PRIVATE_KERNEL_INIT_VK_INDEX: u32 = 0;
106
+ pub global PRIVATE_KERNEL_INNER_VK_INDEX: u32 = 1;
107
+ // VK indices 2 and 3 are intentionally unallocated.
108
+ pub global HIDING_KERNEL_TO_ROLLUP_VK_INDEX: u32 = 4;
109
+ pub global HIDING_KERNEL_TO_PUBLIC_VK_INDEX: u32 = 5;
110
+ pub global PUBLIC_CHONK_VERIFIER_VK_INDEX: u32 = 6;
111
+ pub global PRIVATE_TX_BASE_ROLLUP_VK_INDEX: u32 = 7;
112
+ pub global PUBLIC_TX_BASE_ROLLUP_VK_INDEX: u32 = 8;
113
+ pub global TX_MERGE_ROLLUP_VK_INDEX: u32 = 9;
114
+ // VK indices 10 and 11 are intentionally unallocated: they were the first-block block roots, merged into the
115
+ // variants below (which now cover both the first and non-first cases).
116
+ pub global BLOCK_ROOT_NO_TXS_ROLLUP_VK_INDEX: u32 = 12;
117
+ pub global BLOCK_ROOT_ROLLUP_VK_INDEX: u32 = 13;
118
+ pub global BLOCK_ROOT_SINGLE_TX_ROLLUP_VK_INDEX: u32 = 14;
119
+ pub global BLOCK_MERGE_ROLLUP_VK_INDEX: u32 = 15;
120
+ pub global CHECKPOINT_ROOT_ROLLUP_VK_INDEX: u32 = 16;
121
+ pub global CHECKPOINT_ROOT_SINGLE_BLOCK_ROLLUP_VK_INDEX: u32 = 17;
122
+ pub global CHECKPOINT_PADDING_ROLLUP_VK_INDEX: u32 = 18;
123
+ pub global CHECKPOINT_MERGE_ROLLUP_VK_INDEX: u32 = 19;
124
+ pub global ROOT_ROLLUP_VK_INDEX: u32 = 20;
125
+ // VK indices 21 and 22 are intentionally unallocated: they were the parity base / parity root, replaced by the
126
+ // InboxParity size ladder (appended at 74-76 below, since the reset range 23-64 is reserved).
127
+ // The three families below carve up the reset-family range (23-42). Each base is the VK index
128
+ // of its family's first variant; subsequent variants occupy successive indices. Bases must
129
+ // stay ascending; `validate_vk_in_vk_tree` depends on this ordering.
130
+ // inner : 23 + i (mid-tx resets, no siloing)
131
+ // finalTail : 31 + i (terminal reset+tail, rollup-bound)
132
+ // finalTailToPublic : 37 + i (terminal reset+tail-to-public, public-bound)
133
+ pub global PRIVATE_KERNEL_RESET_VK_INDEX: u32 = 23;
134
+ pub global PRIVATE_KERNEL_RESET_TAIL_VK_INDEX: u32 = 31;
135
+ pub global PRIVATE_KERNEL_RESET_TAIL_TO_PUBLIC_VK_INDEX: u32 = 37;
136
+ // Upper bound (exclusive) of the generated reset-family VK-tree range; used by VK-index normalisation
137
+ // to know when to stop family-base matching.
138
+ pub global PRIVATE_KERNEL_RESET_BLOCK_END: u32 = 43;
139
+ // Important: Do not define indexes between 23 and 42 except via the three reset families above.
140
+ // Indices 43-64 are intentionally unallocated; add new non-reset kernel indices at 65+.
141
+ pub global PRIVATE_KERNEL_INIT_2_VK_INDEX: u32 = 65;
142
+ pub global PRIVATE_KERNEL_INIT_3_VK_INDEX: u32 = 66;
143
+ pub global PRIVATE_KERNEL_INIT_4_VK_INDEX: u32 = 67;
144
+ pub global PRIVATE_KERNEL_INIT_5_VK_INDEX: u32 = 68;
145
+ pub global PRIVATE_KERNEL_INNER_2_VK_INDEX: u32 = 69;
146
+ pub global PRIVATE_KERNEL_INNER_3_VK_INDEX: u32 = 70;
147
+ pub global PRIVATE_KERNEL_INNER_4_VK_INDEX: u32 = 71;
148
+ pub global PRIVATE_KERNEL_INNER_5_VK_INDEX: u32 = 72;
149
+ // VK index 73 is intentionally unallocated: it was the message-only block root, merged into the no-txs block root.
150
+ // The InboxParity size ladder: one VK per size, checked as an allowed set by the checkpoint root. Appended here
151
+ // (rather than reusing the freed 21/22) so the three sizes stay contiguous and read in order.
152
+ pub global INBOX_PARITY_64_VK_INDEX: u32 = 74;
153
+ pub global INBOX_PARITY_256_VK_INDEX: u32 = 75;
154
+ pub global INBOX_PARITY_1024_VK_INDEX: u32 = 76;
155
+
156
+ // Maximum number of apps absorbed by a single private kernel iteration.
157
+ pub global MAX_APPS_PER_KERNEL: u32 = 5;
158
+
159
+ // SIDE EFFECT RELATED CONSTANTS
160
+ // Global indices allow us to uniquely index side effects in PrivateCircuitPublicInputs
161
+ pub global GLOBAL_INDEX_NOTE_HASH_READ_REQUEST_OFFSET: u32 = 0;
162
+ pub global GLOBAL_INDEX_NULLIFIER_READ_REQUEST_OFFSET: u32 =
163
+ GLOBAL_INDEX_NOTE_HASH_READ_REQUEST_OFFSET + MAX_NOTE_HASH_READ_REQUESTS_PER_CALL;
164
+ pub global GLOBAL_INDEX_NOTE_HASH_OFFSET: u32 =
165
+ GLOBAL_INDEX_NULLIFIER_READ_REQUEST_OFFSET + MAX_NULLIFIER_READ_REQUESTS_PER_CALL;
166
+ pub global GLOBAL_INDEX_NULLIFIER_OFFSET: u32 =
167
+ GLOBAL_INDEX_NOTE_HASH_OFFSET + MAX_NOTE_HASHES_PER_CALL;
168
+ pub global GLOBAL_INDEX_PRIVATE_CALL_REQUEST_START_OFFSET: u32 =
169
+ GLOBAL_INDEX_NULLIFIER_OFFSET + MAX_NULLIFIERS_PER_CALL;
170
+ pub global GLOBAL_INDEX_PRIVATE_CALL_REQUEST_END_OFFSET: u32 =
171
+ GLOBAL_INDEX_PRIVATE_CALL_REQUEST_START_OFFSET + MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL;
172
+ pub global GLOBAL_INDEX_PUBLIC_CALL_REQUEST_OFFSET: u32 =
173
+ GLOBAL_INDEX_PRIVATE_CALL_REQUEST_END_OFFSET + MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL;
174
+ pub global GLOBAL_INDEX_L2_TO_L1_MSG_OFFSET: u32 =
175
+ GLOBAL_INDEX_PUBLIC_CALL_REQUEST_OFFSET + MAX_ENQUEUED_CALLS_PER_CALL;
176
+ pub global GLOBAL_INDEX_PRIVATE_LOG_OFFSET: u32 =
177
+ GLOBAL_INDEX_L2_TO_L1_MSG_OFFSET + MAX_L2_TO_L1_MSGS_PER_CALL;
178
+ pub global GLOBAL_INDEX_CONTRACT_CLASS_LOG_HASH_OFFSET: u32 =
179
+ GLOBAL_INDEX_PRIVATE_LOG_OFFSET + MAX_PRIVATE_LOGS_PER_CALL;
180
+ pub global GLOBAL_INDEX_CONTRACT_MIN_REVERTIBLE_SIDE_EFFECT_COUNTER_OFFSET: u32 =
181
+ GLOBAL_INDEX_CONTRACT_CLASS_LOG_HASH_OFFSET + MAX_CONTRACT_CLASS_LOGS_PER_CALL;
182
+
183
+ pub global TOTAL_COUNTED_SIDE_EFFECTS_PER_CALL: u32 = GLOBAL_INDEX_CONTRACT_MIN_REVERTIBLE_SIDE_EFFECT_COUNTER_OFFSET
184
+ + 1 /* min_revertible_side_effect_counter */;
185
+
186
+ // MISC CONSTANTS
187
+ pub global INITIAL_CHECKPOINT_NUMBER: Field = 1;
188
+ pub global INITIAL_L2_BLOCK_NUM: Field = 1;
189
+ pub global FIELDS_PER_BLOB: u32 = 4096;
190
+ pub global BLOBS_PER_CHECKPOINT: u32 = 6;
191
+ pub global MAX_CHECKPOINTS_PER_EPOCH: u32 = 32;
192
+ // Cap on the number of L2 blocks a single checkpoint may contain, asserted in the checkpoint root circuit. It bounds
193
+ // the epoch prover's worst case at `MAX_BLOCKS_PER_CHECKPOINT` block-root proofs plus one fewer block merges, which is
194
+ // what makes fully empty blocks safe to allow at any position in a checkpoint. The value is one block per second over
195
+ // the production slot length.
196
+ pub global MAX_BLOCKS_PER_CHECKPOINT: u32 = 72;
197
+ pub global MAX_TX_LIFETIME: u64 = 86400; // 1 day. Arbitrarily chosen.
198
+ // The genesis values are taken from world_state.test.cpp > WorldStateTest.GetInitialTreeInfoForAllTrees
199
+ pub global GENESIS_BLOCK_HEADER_HASH: Field =
200
+ 0x0e7bf88e8833c27b0fca6be614ecc2c63def7bffa35b3ccfa1caff3e39e0c0d2;
201
+ pub global GENESIS_ARCHIVE_ROOT: Field =
202
+ 0x177a4955b31ecaafad999753938a44e526b54c5ba5d536688227f85f15cfbdf5;
203
+ pub global EMPTY_EPOCH_OUT_HASH: Field =
204
+ 0xc95e0ceb41951039e1592745ec2faea9866f6eaf01bf189a4463b4143af093;
205
+
206
+ // CONTRACT CLASS CONSTANTS
207
+ pub global MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS: u32 = 3000; // Arbitrary.
208
+ // Bytecode size for private functions is per function, not for the entire contract.
209
+ // Note that private functions bytecode includes a mix of acir and brillig.
210
+ pub global MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS: u32 = 3000; // Arbitrary.
211
+
212
+ // How many fields are on the serialized ClassPrivateFunctionBroadcasted event in addition to MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS.
213
+ pub global CLASS_REGISTRY_PRIVATE_FUNCTION_BROADCASTED_ADDITIONAL_FIELDS: u32 =/* magic value */ 1
214
+ + 1 /* contract_class_id */
215
+ + 1 /* artifact_metadata_hash */
216
+ + 1 /* utility_functions_artifact_tree_root */
217
+ + FUNCTION_TREE_HEIGHT /* private_function_tree_sibling_path */
218
+ + 1 /* private_function_tree_leaf_index */
219
+ + ARTIFACT_FUNCTION_TREE_MAX_HEIGHT /* artifact_function_tree_sibling_path */
220
+ + 1 /* artifact_function_tree_leaf_index */
221
+ + 1 /* function selector */
222
+ + 1 /* function metadata_hash */
223
+ + 1 /* function vk_hash */;
224
+
225
+ // We use these magic values to identify events emitted by the ContractClassRegistry and ContractInstanceRegistry.
226
+ // The values were generated and checked in `constants_tests.nr`.
227
+ pub global CONTRACT_CLASS_PUBLISHED_MAGIC_VALUE: Field =
228
+ 0x20f5895a4e837356c2d551743df6bf642756dcd93cd31cbd37c556c90bf7f244;
229
+ pub global CONTRACT_INSTANCE_PUBLISHED_MAGIC_VALUE: Field =
230
+ 0x174c6b3d0fd14728e4fc5e53f7b262ab943546a7e125e2ed5e9fde3cf0b3e22f;
231
+ pub global CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE: Field =
232
+ 0x2dcffa53cd0e71da7b4a22677b3342bfc3b9043f5081bea58368ad008eaa6f37;
233
+
234
+ // CANONICAL CONTRACT ADDRESSES
235
+ // The maximum number of protocol contracts that can be supported.
236
+ // Chosen to be a multiple of 3 (-1 to account for the separator), to optimize the poseidon2 hash.
237
+ pub global MAX_PROTOCOL_CONTRACTS: u32 = 11;
238
+ // Address 0 is not a protocol contract.
239
+ pub global CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS: AztecAddress = AztecAddress::from_field(1);
240
+ pub global CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS: AztecAddress = AztecAddress::from_field(2);
241
+ pub global FEE_JUICE_ADDRESS: AztecAddress = AztecAddress::from_field(3);
242
+
243
+ // `SIDE_EFFECT_MASKING_ADDRESS` is used by the protocol circuits to silo the padding side effects. It's not a protocol
244
+ // contract (hence its address is greater than `MAX_PROTOCOL_CONTRACTS`).
245
+ // Padding items must be siloed with a contract address which cannot be deployed nor impersonated by any user,
246
+ // because we don't want any malicious user to be able to push malicious state for actual contracts through this
247
+ // padding feature.
248
+ // It's not possible to create an actual contract whose address equals this value. If it were possible, it would mean
249
+ // that anyone can freely change the state of the contract by adding padding side effects to their transactions.
250
+ // The value was generated and checked in `constants_tests.nr`.
251
+ pub global SIDE_EFFECT_MASKING_ADDRESS: AztecAddress = AztecAddress::from_field(
252
+ 0x2b29b6b962034f217d620700c44845d2a3c7d208d7e23328286124f4c6eb11e3,
253
+ );
254
+
255
+ // NULL MSG_SENDER CONTRACT ADDRESS (not part of the protocol contracts tree).
256
+ pub global NULL_MSG_SENDER_CONTRACT_ADDRESS: AztecAddress = AztecAddress::from_field(
257
+ 21888242871839275222246405745257275088548364400416034343698204186575808495616,
258
+ ); // This is `-1`.
259
+
260
+ // Randomly chosen slot for the bytecode capsule.
261
+ // The value was generated and checked in `constants_tests.nr`.
262
+ pub global CONTRACT_CLASS_REGISTRY_BYTECODE_CAPSULE_SLOT: Field =
263
+ 0x1f61038721b052d5389449bf44f73c817146aedfab1ef13d37f16ce928df1fb7;
264
+
265
+ // Slot of the balances map to be hashed with an AztecAddress (map key) to get an actual storage slot.
266
+ // TODO: document the fee_juice contract, documenting where all of the logic and constants live, because it's all over the place.
267
+ pub global FEE_JUICE_BALANCES_SLOT: u32 = 1;
268
+
269
+ // Slot of the updated_class_ids map to be hashed with an AztecAddress (map key) to get an actual storage slot.
270
+ // TODO: document the contract class registry contract, documenting where all of the logic and constants live, because it's all over the place.
271
+ pub global UPDATED_CLASS_IDS_SLOT: u32 = 1;
272
+
273
+ // CANONICAL DEFAULT KEYS
274
+ // This below are:
275
+ // "az_null_npk"
276
+ // "az_null_ivpk"
277
+ // "az_null_ovpk"
278
+ // "az_null_tpk"
279
+ // "az_null_mspk"
280
+ // "az_null_fbpk"
281
+ // as bytes, hashed to curve using grumpkin::g1::affine_element::hash_to_curve(<X>, 0);
282
+ // TODO: AFAIK grumpkin's hash to curve is not exposed in noir. We should probably derive these from
283
+ // a noir test within this file, so we should probably write a simple hash to curve function.
284
+ pub global DEFAULT_NPK_M_X: Field =
285
+ 0x01498945581e0eb9f8427ad6021184c700ef091d570892c437d12c7d90364bbd;
286
+ pub global DEFAULT_NPK_M_Y: Field =
287
+ 0x170ae506787c5c43d6ca9255d571c10fa9ffa9d141666e290c347c5c9ab7e344;
288
+ pub global DEFAULT_IVPK_M_X: Field =
289
+ 0x00c044b05b6ca83b9c2dbae79cc1135155956a64e136819136e9947fe5e5866c;
290
+ pub global DEFAULT_IVPK_M_Y: Field =
291
+ 0x1c1f0ca244c7cd46b682552bff8ae77dea40b966a71de076ec3b7678f2bdb151;
292
+ pub global DEFAULT_OVPK_M_X: Field =
293
+ 0x1b00316144359e9a3ec8e49c1cdb7eeb0cedd190dfd9dc90eea5115aa779e287;
294
+ pub global DEFAULT_OVPK_M_Y: Field =
295
+ 0x080ffc74d7a8b0bccb88ac11f45874172f3847eb8b92654aaa58a3d2b8dc7833;
296
+ pub global DEFAULT_TPK_M_X: Field =
297
+ 0x019c111f36ad3fc1d9b7a7a14344314d2864b94f030594cd67f753ef774a1efb;
298
+ pub global DEFAULT_TPK_M_Y: Field =
299
+ 0x2039907fe37f08d10739255141bb066c506a12f7d1e8dfec21abc58494705b6f;
300
+ pub global DEFAULT_MSPK_M_X: Field =
301
+ 0x00d52691f35698f962ea20f2bd0ab906c82228a434593dd28f36a3807f3043b8;
302
+ pub global DEFAULT_MSPK_M_Y: Field =
303
+ 0x0e27412388283d55cffb96143b2b4493b5bf6895fdb5787dadd8b0105d7531c5;
304
+ pub global DEFAULT_FBPK_M_X: Field =
305
+ 0x1995b7952c9a39667e5333cb48435aade5e08ae1dcb066db87402e1dae09698a;
306
+ pub global DEFAULT_FBPK_M_Y: Field =
307
+ 0x1a07e89069fc04690e335ed68ca3914b9efd141014f24534276383c6361b1553;
308
+
309
+ // Precomputed `hash_public_key(Point { DEFAULT_*_X, DEFAULT_*_Y })` for each non-ivpk key.
310
+ // Used by `PublicKeys::default()` and the matching TS `PublicKeys.default()`. Verified by the
311
+ // `default_hashes_match_default_points` test in public_keys.nr.
312
+ pub global DEFAULT_NPK_M_HASH: Field =
313
+ 0x14fbaeaeddaa69be81d404c684e78e9f1a786d225faf8de2ce97c92f67d89a26;
314
+ pub global DEFAULT_OVPK_M_HASH: Field =
315
+ 0x0e60ed663a4da5636e2e25a1f1f0c5b27c011c8eaed22bbe61e2a0fd875dd24b;
316
+ pub global DEFAULT_TPK_M_HASH: Field =
317
+ 0x082c6d164b0ba073c9dd911100248c8ecd80b03f82f38531856a3c16dadcbef0;
318
+ pub global DEFAULT_MSPK_M_HASH: Field =
319
+ 0x14a5d4bde495b8c3a9ba4aed0d4870526e46fdff22d341a2f689ac5a50d10356;
320
+ pub global DEFAULT_FBPK_M_HASH: Field =
321
+ 0x0f124f07811eebfaaa6d31316a2cc5bf255fa118f720e8ff1f2fc0d4aa46d496;
322
+
323
+ // LENGTH OF STRUCTS SERIALIZED TO FIELDS
324
+ // TODO: figure out whether Noir is sophisticated enough to derive these for us, these days.
325
+ pub global AZTEC_ADDRESS_LENGTH: u32 = 1;
326
+ pub global GAS_FEES_LENGTH: u32 = 2;
327
+ pub global GAS_LENGTH: u32 = 2;
328
+ pub global GAS_SETTINGS_LENGTH: u32 = GAS_LENGTH /* gas_limits */
329
+ + GAS_LENGTH /* teardown_gas_limits */
330
+ + GAS_FEES_LENGTH /* max_fees_per_gas */
331
+ + GAS_FEES_LENGTH /* max_priority_fees_per_gas */;
332
+ pub global CALL_CONTEXT_LENGTH: u32 = 4;
333
+ pub global CONTRACT_INSTANCE_LENGTH: u32 = 12;
334
+ pub global CONTRACT_STORAGE_READ_LENGTH: u32 = 3;
335
+ pub global CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH: u32 = 3;
336
+ pub global ETH_ADDRESS_LENGTH: u32 = 1;
337
+ pub global FUNCTION_DATA_LENGTH: u32 = 2;
338
+ pub global GLOBAL_VARIABLES_LENGTH: u32 = 7 + GAS_FEES_LENGTH;
339
+ pub global APPEND_ONLY_TREE_SNAPSHOT_LENGTH: u32 = 2;
340
+ pub global SPONGE_BLOB_LENGTH: u32 = 10;
341
+ pub global L1_TO_L2_MESSAGE_SPONGE_LENGTH: u32 = 10;
342
+ pub global BLS12_FR_LIMBS: u32 = 3; // TODO(#14646): get this from bignum
343
+ pub global BLS12_FQ_LIMBS: u32 = 4; // TODO(#14646): get this from bignum
344
+ pub global BLS12_POINT_LENGTH: u32 = 2 * BLS12_FQ_LIMBS + 1; // TODO(#14646): reduce num fields needed here?
345
+ pub global BLS12_POINT_COMPRESSED_BYTES: u32 = 48; // TODO(#14646): get this from bignum
346
+ pub global BLOB_ACCUMULATOR_LENGTH: u32 = 3 /* v_acc, z_acc, and gamma_acc */
347
+ + 2 * BLS12_FR_LIMBS /* y_acc and gamma^i */
348
+ + BLS12_POINT_LENGTH /* c_acc */;
349
+ pub global FINAL_BLOB_BATCHING_CHALLENGES_LENGTH: u32 = 1 /* z */
350
+ + BLS12_FR_LIMBS /* gamma */;
351
+ pub global FINAL_BLOB_ACCUMULATOR_LENGTH: u32 = 1 /* blob_commitments_hash */
352
+ + 1 /* z */
353
+ + BLS12_FR_LIMBS /* y */
354
+ + 2 /* c */;
355
+ pub global L2_TO_L1_MESSAGE_LENGTH: u32 = 1 /* recipient */ + 1 /* content */;
356
+ pub global COUNTED_L2_TO_L1_MESSAGE_LENGTH: u32 = L2_TO_L1_MESSAGE_LENGTH + 1;
357
+ pub global SCOPED_L2_TO_L1_MESSAGE_LENGTH: u32 = L2_TO_L1_MESSAGE_LENGTH + 1;
358
+ pub global KEY_VALIDATION_REQUEST_LENGTH: u32 = 2;
359
+ pub global KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH: u32 = KEY_VALIDATION_REQUEST_LENGTH + 1;
360
+ pub global SCOPED_KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH: u32 =
361
+ KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH + 1;
362
+ pub global PARTIAL_STATE_REFERENCE_LENGTH: u32 = 6;
363
+ pub global PRIVATE_LOG_SIZE_IN_FIELDS: u32 = 16;
364
+ pub global PRIVATE_LOG_LENGTH: u32 = PRIVATE_LOG_SIZE_IN_FIELDS + 1 /* length */;
365
+ pub global PRIVATE_LOG_DATA_LENGTH: u32 = PRIVATE_LOG_LENGTH
366
+ + 1 /* note_hash_counter */
367
+ + 1 /* counter */;
368
+ /// A private log's ciphertext is all fields except the first one, which is called 'tag'. We call this 'ciphertext'
369
+ /// because, unlike public logs, it is expected that private logs are encrypted (though this is not
370
+ /// mandatory).
371
+ pub global PRIVATE_LOG_CIPHERTEXT_LEN: u32 = PRIVATE_LOG_SIZE_IN_FIELDS - 1; // -1 for the tag
372
+ // Below are constants for the entire PublicLogs struct.
373
+ pub global FLAT_PUBLIC_LOGS_HEADER_LENGTH: u32 = 1 /* length */;
374
+ pub global FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH: u32 = 4096;
375
+ pub global PUBLIC_LOGS_LENGTH: u32 =
376
+ FLAT_PUBLIC_LOGS_HEADER_LENGTH + FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH;
377
+ // Below are constants for individual public log in PublicLogs' payload.
378
+ pub global PUBLIC_LOG_HEADER_LENGTH: u32 = 2; /* length and contract_address */
379
+ pub global MAX_PUBLIC_LOG_SIZE_IN_FIELDS: u32 =
380
+ FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH - PUBLIC_LOG_HEADER_LENGTH;
381
+
382
+ // TODO: write a test to ensure `CLASS_REGISTRY_PRIVATE_FUNCTION_BROADCASTED_ADDITIONAL_FIELDS` is the maximum
383
+ // of the various function metadata that can be broadcasted (i.e. the largest of public/private/utility)
384
+ pub global CONTRACT_CLASS_LOG_SIZE_IN_FIELDS: u32 = MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS
385
+ + CLASS_REGISTRY_PRIVATE_FUNCTION_BROADCASTED_ADDITIONAL_FIELDS;
386
+ pub global CONTRACT_CLASS_LOG_LENGTH: u32 = CONTRACT_CLASS_LOG_SIZE_IN_FIELDS
387
+ + 1 /* length */
388
+ + 1 /* contract_address */;
389
+ pub global LOG_HASH_LENGTH: u32 = 1 /* value */ + 1 /* length */;
390
+ pub global COUNTED_LOG_HASH_LENGTH: u32 = LOG_HASH_LENGTH + 1 /* counter */;
391
+ pub global SCOPED_LOG_HASH_LENGTH: u32 = LOG_HASH_LENGTH + 1 /* contract_address */;
392
+ pub global NOTE_HASH_LENGTH: u32 = 2;
393
+ pub global NULLIFIER_LENGTH: u32 = 3;
394
+ pub global PUBLIC_DATA_WRITE_LENGTH: u32 = 2;
395
+ pub global PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH: u32 =
396
+ AZTEC_ADDRESS_LENGTH + CALL_CONTEXT_LENGTH + 3 + 2 * GAS_LENGTH;
397
+ pub global PRIVATE_CALL_REQUEST_LENGTH: u32 = CALL_CONTEXT_LENGTH + 4;
398
+ pub global PUBLIC_CALL_REQUEST_LENGTH: u32 = AZTEC_ADDRESS_LENGTH /* msg_sender */
399
+ + AZTEC_ADDRESS_LENGTH /* contract_address */
400
+ + 1 /* is_static_call */
401
+ + 1 /* calldata_hash */;
402
+ pub global COUNTED_PUBLIC_CALL_REQUEST_LENGTH: u32 = PUBLIC_CALL_REQUEST_LENGTH + 1;
403
+ pub global STATE_REFERENCE_LENGTH: u32 =
404
+ APPEND_ONLY_TREE_SNAPSHOT_LENGTH + PARTIAL_STATE_REFERENCE_LENGTH;
405
+ pub global TREE_SNAPSHOTS_LENGTH: u32 = APPEND_ONLY_TREE_SNAPSHOT_LENGTH * 4;
406
+ pub global TX_CONTEXT_LENGTH: u32 = 2 + GAS_SETTINGS_LENGTH;
407
+ pub global TX_REQUEST_LENGTH: u32 =
408
+ 1 /* origin */ + 1 /* args_hash */ + TX_CONTEXT_LENGTH + FUNCTION_DATA_LENGTH + 1 /* salt */;
409
+ pub global TOTAL_FEES_LENGTH: u32 = 1;
410
+ pub global TOTAL_MANA_USED_LENGTH: u32 = 1;
411
+ pub global BLOCK_HEADER_LENGTH: u32 = APPEND_ONLY_TREE_SNAPSHOT_LENGTH
412
+ + STATE_REFERENCE_LENGTH
413
+ + 1 /* blob_sponge_hash */
414
+ + GLOBAL_VARIABLES_LENGTH
415
+ + TOTAL_FEES_LENGTH
416
+ + TOTAL_MANA_USED_LENGTH;
417
+ pub global CHECKPOINT_HEADER_LENGTH: u32 = 1 /* last_archive_root */
418
+ + 1 /* block_headers_hash */
419
+ + 1 /* blobs_hash */
420
+ + 1 /* inbox_rolling_hash */
421
+ + 1 /* out_hash */
422
+ + 1 /* slot_number */
423
+ + 1 /* timestamp */
424
+ + 1 /* coinbase */
425
+ + 1 /* fee_recipient */
426
+ + GAS_FEES_LENGTH
427
+ + TOTAL_MANA_USED_LENGTH
428
+ + 1 /* accumulated_fees */;
429
+ pub global CHECKPOINT_HEADER_SIZE_IN_BYTES: u32 = (CHECKPOINT_HEADER_LENGTH - 4) * 32
430
+ + 8 /* timestamp */
431
+ + 20 /* coinbase */
432
+ + 16 /* gas_fees.fee_per_da_gas */
433
+ + 16 /* gas_fees.fee_per_l2_gas */;
434
+
435
+ pub global SCOPED_READ_REQUEST_LEN: u32 = 3;
436
+ pub global PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH: u32 = CALL_CONTEXT_LENGTH
437
+ + 1 /* args_hash */
438
+ + 1 /* returns_hash */
439
+ + 1 /* min_revertible_side_effect_counter */
440
+ + 1 /* is_fee_payer */
441
+ + 1 /* expiration_timestamp */
442
+ // The `(... + 1)` is because these arrays include a `length` field.
443
+ + (SCOPED_READ_REQUEST_LEN * MAX_NOTE_HASH_READ_REQUESTS_PER_CALL + 1)
444
+ + (SCOPED_READ_REQUEST_LEN * MAX_NULLIFIER_READ_REQUESTS_PER_CALL + 1)
445
+ + (KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH * MAX_KEY_VALIDATION_REQUESTS_PER_CALL + 1)
446
+ + (NOTE_HASH_LENGTH * MAX_NOTE_HASHES_PER_CALL + 1)
447
+ + (NULLIFIER_LENGTH * MAX_NULLIFIERS_PER_CALL + 1)
448
+ + (PRIVATE_CALL_REQUEST_LENGTH * MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL + 1)
449
+ + (COUNTED_PUBLIC_CALL_REQUEST_LENGTH * MAX_ENQUEUED_CALLS_PER_CALL + 1)
450
+ + PUBLIC_CALL_REQUEST_LENGTH
451
+ + (COUNTED_L2_TO_L1_MESSAGE_LENGTH * MAX_L2_TO_L1_MSGS_PER_CALL + 1)
452
+ + 1 /* start_side_effect_counter */
453
+ + 1 /* end_side_effect_counter */
454
+ + 1 /* expected_non_revertible_side_effect_counter */
455
+ + 1 /* expected_revertible_side_effect_counter */
456
+ + (PRIVATE_LOG_DATA_LENGTH * MAX_PRIVATE_LOGS_PER_CALL + 1)
457
+ + (COUNTED_LOG_HASH_LENGTH * MAX_CONTRACT_CLASS_LOGS_PER_CALL + 1)
458
+ + BLOCK_HEADER_LENGTH
459
+ + TX_CONTEXT_LENGTH
460
+ + 1 /* tx_request_salt */;
461
+ pub global PRIVATE_CONTEXT_INPUTS_LENGTH: u32 = CALL_CONTEXT_LENGTH
462
+ + BLOCK_HEADER_LENGTH
463
+ + TX_CONTEXT_LENGTH
464
+ + 1 /* start_side_effect_counter */
465
+ + 1 /* tx_request_salt */;
466
+ pub global FEE_RECIPIENT_LENGTH: u32 = 2;
467
+
468
+ // TODO: Leila's considering moving this into a noir file within bb
469
+ // The hiding kernel IO public inputs consist of pairing_inputs and table_commitments.
470
+ // They are independent of the circuit's custom public inputs.
471
+ pub global HIDING_KERNEL_IO_PUBLIC_INPUTS_SIZE: u32 = 28;
472
+ pub global PAIRING_POINTS_SIZE: u32 = 8;
473
+ pub global IPA_CLAIM_SIZE: u32 = 6;
474
+
475
+ pub global PRIVATE_TO_ROLLUP_ACCUMULATED_DATA_LENGTH: u32 = MAX_NOTE_HASHES_PER_TX
476
+ + MAX_NULLIFIERS_PER_TX
477
+ + (MAX_L2_TO_L1_MSGS_PER_TX * SCOPED_L2_TO_L1_MESSAGE_LENGTH)
478
+ + (PRIVATE_LOG_LENGTH * MAX_PRIVATE_LOGS_PER_TX)
479
+ + (SCOPED_LOG_HASH_LENGTH * MAX_CONTRACT_CLASS_LOGS_PER_TX);
480
+
481
+ pub global TX_CONSTANT_DATA_LENGTH: u32 = BLOCK_HEADER_LENGTH
482
+ + TX_CONTEXT_LENGTH
483
+ + 1 /* vk_tree_root */
484
+ + 1 /* protocol_contracts_hash */;
485
+
486
+ pub global PRIVATE_TO_PUBLIC_ACCUMULATED_DATA_LENGTH: u32 = MAX_NOTE_HASHES_PER_TX
487
+ + MAX_NULLIFIERS_PER_TX
488
+ + (MAX_L2_TO_L1_MSGS_PER_TX * SCOPED_L2_TO_L1_MESSAGE_LENGTH)
489
+ + (MAX_PRIVATE_LOGS_PER_TX * PRIVATE_LOG_LENGTH)
490
+ + (MAX_CONTRACT_CLASS_LOGS_PER_TX * SCOPED_LOG_HASH_LENGTH)
491
+ + (MAX_ENQUEUED_CALLS_PER_TX * PUBLIC_CALL_REQUEST_LENGTH);
492
+
493
+ pub global PRIVATE_TO_AVM_ACCUMULATED_DATA_LENGTH: u32 = MAX_NOTE_HASHES_PER_TX
494
+ + MAX_NULLIFIERS_PER_TX
495
+ + (MAX_L2_TO_L1_MSGS_PER_TX * SCOPED_L2_TO_L1_MESSAGE_LENGTH);
496
+ pub global NUM_PRIVATE_TO_AVM_ACCUMULATED_DATA_ARRAYS: u32 = 3;
497
+ pub global NUM_AVM_ACCUMULATED_DATA_ARRAYS: u32 = 4; // note_hashes, nullifiers, l2_to_l1_msgs, public_data_writes
498
+ pub global NUM_PUBLIC_CALL_REQUEST_ARRAYS: u32 = 3; // really 2 arrays and a single teardown req
499
+
500
+ pub global AVM_ACCUMULATED_DATA_LENGTH: u32 = MAX_NOTE_HASHES_PER_TX
501
+ + MAX_NULLIFIERS_PER_TX
502
+ + (MAX_L2_TO_L1_MSGS_PER_TX * SCOPED_L2_TO_L1_MESSAGE_LENGTH)
503
+ + PUBLIC_LOGS_LENGTH
504
+ + (MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * PUBLIC_DATA_WRITE_LENGTH);
505
+
506
+ pub global PRIVATE_TO_PUBLIC_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH: u32 = TX_CONSTANT_DATA_LENGTH
507
+ + PRIVATE_TO_PUBLIC_ACCUMULATED_DATA_LENGTH /* non_revertible_accumulated_data */
508
+ + PRIVATE_TO_PUBLIC_ACCUMULATED_DATA_LENGTH /* revertible_accumulated_data */
509
+ + PUBLIC_CALL_REQUEST_LENGTH /* public_teardown_call_request */
510
+ + GAS_LENGTH /* gas_used */
511
+ + AZTEC_ADDRESS_LENGTH /* fee_payer */
512
+ + 1 /* expiration_timestamp */;
513
+
514
+ pub global PRIVATE_TO_ROLLUP_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH: u32 = TX_CONSTANT_DATA_LENGTH
515
+ + PRIVATE_TO_ROLLUP_ACCUMULATED_DATA_LENGTH
516
+ + GAS_LENGTH /* gas_used */
517
+ + AZTEC_ADDRESS_LENGTH /* fee_payer */
518
+ + 1 /* expiration_timestamp */;
519
+
520
+ pub global AVM_CIRCUIT_PUBLIC_INPUTS_LENGTH: u32 = GLOBAL_VARIABLES_LENGTH
521
+ + MAX_PROTOCOL_CONTRACTS /* protocol_contracts */
522
+ + TREE_SNAPSHOTS_LENGTH /* start_tree_snapshots */
523
+ + GAS_LENGTH /* start_gas_used */
524
+ + GAS_SETTINGS_LENGTH
525
+ + GAS_FEES_LENGTH /* effective_gas_fees */
526
+ + 1 /* fee_payer */
527
+ + 1 /* prover_id */
528
+ + NUM_PUBLIC_CALL_REQUEST_ARRAYS /* public_call_request_array_lengths */
529
+ + (MAX_ENQUEUED_CALLS_PER_TX * PUBLIC_CALL_REQUEST_LENGTH) /* public_setup_call_requests */
530
+ + (MAX_ENQUEUED_CALLS_PER_TX * PUBLIC_CALL_REQUEST_LENGTH) /* public_app_logic_call_requests */
531
+ + PUBLIC_CALL_REQUEST_LENGTH /* public_teardown_call_request */
532
+ + NUM_PRIVATE_TO_AVM_ACCUMULATED_DATA_ARRAYS /* previous_non_revertible_accumulated_data_array_lengths */
533
+ + NUM_PRIVATE_TO_AVM_ACCUMULATED_DATA_ARRAYS /* previous_revertible_accumulated_data_array_lengths */
534
+ + PRIVATE_TO_AVM_ACCUMULATED_DATA_LENGTH /* previous_non_revertible_accumulated_data */
535
+ + PRIVATE_TO_AVM_ACCUMULATED_DATA_LENGTH /* previous_revertible_accumulated_data */
536
+ + TREE_SNAPSHOTS_LENGTH /* end_tree_snapshots */
537
+ + GAS_LENGTH /* end_gas_used */
538
+ + AVM_ACCUMULATED_DATA_LENGTH
539
+ + 1 /* transaction_fee */
540
+ + NUM_AVM_ACCUMULATED_DATA_ARRAYS /* accumulated_data_array_lengths */
541
+ + 1 /* reverted */;
542
+
543
+ pub global BLOCK_CONSTANT_DATA_LENGTH: u32 = APPEND_ONLY_TREE_SNAPSHOT_LENGTH /* last_archive */
544
+ + APPEND_ONLY_TREE_SNAPSHOT_LENGTH /* new_l1_to_l2_message_tree */
545
+ + 1 /* vk_tree_root */
546
+ + 1 /* protocol_contracts_hash */
547
+ + 1 /* prover_id */
548
+ + GLOBAL_VARIABLES_LENGTH;
549
+ pub global CHECKPOINT_CONSTANT_DATA_LENGTH: u32 = 1 /* chain_id */
550
+ + 1 /* version */
551
+ + 1 /* vk_tree_root */
552
+ + 1 /* protocol_contracts_hash */
553
+ + 1 /* prover_id */
554
+ + 1 /* slot_number */
555
+ + ETH_ADDRESS_LENGTH /* coinbase */
556
+ + AZTEC_ADDRESS_LENGTH /* fee_recipient */
557
+ + GAS_FEES_LENGTH /* gas_fees */;
558
+ pub global EPOCH_CONSTANT_DATA_LENGTH: u32 = 1 /* chain_id */
559
+ + 1 /* version */
560
+ + 1 /* vk_tree_root */
561
+ + 1 /* protocol_contracts_hash */
562
+ + 1 /* prover_id */;
563
+
564
+ pub global TX_ROLLUP_PUBLIC_INPUTS_LENGTH: u32 = BLOCK_CONSTANT_DATA_LENGTH
565
+ + PARTIAL_STATE_REFERENCE_LENGTH /* start_state_reference */
566
+ + PARTIAL_STATE_REFERENCE_LENGTH /* end_state_reference */
567
+ + SPONGE_BLOB_LENGTH /* start_sponge_blob */
568
+ + SPONGE_BLOB_LENGTH /* end_sponge_blob */
569
+ + 1 /* num_txs */
570
+ + 1 /* out_hash */
571
+ + 1 /* accumulated_fees */
572
+ + 1 /* accumulated_mana_used */;
573
+ pub global BLOCK_ROLLUP_PUBLIC_INPUTS_LENGTH: u32 = CHECKPOINT_CONSTANT_DATA_LENGTH
574
+ + 2 * APPEND_ONLY_TREE_SNAPSHOT_LENGTH /* previous_archive and new_archive */
575
+ + 2 * STATE_REFERENCE_LENGTH /* start_state and end_state */
576
+ + 2 * SPONGE_BLOB_LENGTH /* start_sponge_blob and end_sponge_blob */
577
+ + 1 /* timestamp */
578
+ + 1 /* block_headers_hash */
579
+ + 2 * L1_TO_L2_MESSAGE_SPONGE_LENGTH /* start_msg_sponge and end_msg_sponge */
580
+ + 1 /* out_hash */
581
+ + 1 /* accumulated_fees */
582
+ + 1 /* accumulated_mana_used */;
583
+ pub global CHECKPOINT_ROLLUP_PUBLIC_INPUTS_LENGTH: u32 = EPOCH_CONSTANT_DATA_LENGTH
584
+ + 2 * APPEND_ONLY_TREE_SNAPSHOT_LENGTH /* previous_archive and new_archive */
585
+ + 2 * APPEND_ONLY_TREE_SNAPSHOT_LENGTH /* start_out_hash and end_out_hash */
586
+ + 1 /* start_inbox_rolling_hash */
587
+ + 1 /* end_inbox_rolling_hash */
588
+ + MAX_CHECKPOINTS_PER_EPOCH /* checkpoint_header_hashes */
589
+ + MAX_CHECKPOINTS_PER_EPOCH * FEE_RECIPIENT_LENGTH /* fees */
590
+ + 2 * BLOB_ACCUMULATOR_LENGTH /* start and end blob accumulators */
591
+ + FINAL_BLOB_BATCHING_CHALLENGES_LENGTH;
592
+ pub global ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH: u32 = 1 /* previous_archive_root */
593
+ + 1 /* end_archive_root */
594
+ + 1 /* out_hash */
595
+ + 1 /* previous_inbox_rolling_hash */
596
+ + 1 /* end_inbox_rolling_hash */
597
+ + 1 /* chain_id */
598
+ + 1 /* version */
599
+ + 1 /* vk_tree_root */
600
+ + 1 /* protocol_contracts_hash */
601
+ + 1 /* prover_id */
602
+ + MAX_CHECKPOINTS_PER_EPOCH /* checkpoint_header_hashes */
603
+ + MAX_CHECKPOINTS_PER_EPOCH * FEE_RECIPIENT_LENGTH /* fees */
604
+ + FINAL_BLOB_ACCUMULATOR_LENGTH /* blob_public_inputs */;
605
+
606
+ // The InboxParity size ladder: one variable-size parity proof is produced per checkpoint, and the prover picks the
607
+ // smallest size >= the checkpoint's real message count. The largest rung equals the per-checkpoint message cap.
608
+ pub global INBOX_PARITY_SIZE_SMALL: u32 = 64;
609
+ pub global INBOX_PARITY_SIZE_MEDIUM: u32 = 256;
610
+ pub global INBOX_PARITY_SIZE_LARGE: u32 = 1024;
611
+
612
+ // Lengths of the different types of proofs in fields
613
+ pub global RECURSIVE_PROOF_LENGTH: u32 = 410;
614
+ pub global NESTED_RECURSIVE_PROOF_LENGTH: u32 = RECURSIVE_PROOF_LENGTH;
615
+ pub global IPA_PROOF_LENGTH: u32 = 64;
616
+ pub global ULTRA_KECCAK_PROOF_LENGTH: u32 = 331; // See UltraKeccakFlavor for formula; based on root rollup log_n = 24
617
+ pub global RECURSIVE_ROLLUP_HONK_PROOF_LENGTH: u32 =
618
+ RECURSIVE_PROOF_LENGTH + IPA_CLAIM_SIZE + IPA_PROOF_LENGTH;
619
+ pub global NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH: u32 = RECURSIVE_ROLLUP_HONK_PROOF_LENGTH;
620
+ // Chonk sub-proof lengths; pinned to bb via static_asserts in mock_verifier_inputs.test.cpp.
621
+ pub global CHONK_HIDING_OINK_LENGTH: u32 = 48;
622
+ pub global CHONK_MERGE_PROOF_SIZE: u32 = 41;
623
+ pub global CHONK_ECCVM_PROOF_LENGTH: u32 = 556;
624
+ pub global CHONK_TRIPLE_IPA_PROOF_LENGTH: u32 = 70;
625
+ pub global CHONK_JOINT_PROOF_LENGTH: u32 = 478;
626
+ pub global CHONK_PROOF_LENGTH: u32 = CHONK_HIDING_OINK_LENGTH
627
+ + HIDING_KERNEL_IO_PUBLIC_INPUTS_SIZE
628
+ + CHONK_MERGE_PROOF_SIZE
629
+ + CHONK_ECCVM_PROOF_LENGTH
630
+ + CHONK_TRIPLE_IPA_PROOF_LENGTH
631
+ + CHONK_JOINT_PROOF_LENGTH;
632
+
633
+ pub global ULTRA_VK_LENGTH_IN_FIELDS: u32 = 115; // size of an Ultra verification key
634
+ pub global MEGA_APP_VK_LENGTH_IN_FIELDS: u32 = 151; // size of a MegaApp verification key
635
+ pub global MEGA_KERNEL_VK_LENGTH_IN_FIELDS: u32 = 151; // size of a MegaKernel verification key
636
+ pub global MEGA_ZK_VK_LENGTH_IN_FIELDS: u32 = 119; // size of a MegaZK verification key
637
+ // CHONK: "Client Honk" - An UltraHonk variant with incremental folding and delayed non-native arithmetic.
638
+ pub global CHONK_VK_LENGTH_IN_FIELDS: u32 = MEGA_ZK_VK_LENGTH_IN_FIELDS; // size of a chonk verification key
639
+ // VK is composed of
640
+ // - circuit size encoded as a fr field element (32 bytes)
641
+ // - num of inputs encoded as a fr field element (32 bytes)
642
+ // - 21 affine elements (curve base field fq) encoded as fr elements takes (21 * 4 * 32 bytes)
643
+ // 21 above refers to the constant AvmFlavor::NUM_PRECOMPUTED_ENTITIES
644
+ pub global AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS: u32 = 2 + 21 * 4;
645
+
646
+ // Setting limits for MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS
647
+ // This value is determined by the length of the AVM trace and the max public bytecode size in bytes
648
+ // (MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS * 32 = 96,000), i.e. 2^21 / 96,000 = 21
649
+ pub global MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS: u32 = 21;
650
+
651
+ // ---------------------------------------------------------------
652
+ // DOMAIN SEPARATORS
653
+ // See ./constants_tests.nr for how the values are generated.
654
+ // ---------------------------------------------------------------
655
+
656
+ /// Domain separator for note hashes.
657
+ ///
658
+ /// This is not technically a protocol constant as note hashes are computed by each contract.
659
+ pub global DOM_SEP__NOTE_HASH: u32 = 116501019;
660
+
661
+ /// Domain separator for siloed note hashes.
662
+ ///
663
+ /// Used by [`crate::hash::compute_siloed_note_hash`].
664
+ pub global DOM_SEP__SILOED_NOTE_HASH: u32 = 3361878420;
665
+
666
+ /// Domain separator for unique note hashes.
667
+ ///
668
+ /// Used by [`crate::hash::compute_unique_note_hash`].
669
+ pub global DOM_SEP__UNIQUE_NOTE_HASH: u32 = 226850429;
670
+
671
+ /// Domain separator for nonces.
672
+ ///
673
+ /// Used by [`crate::hash::compute_note_hash_nonce`].
674
+ pub global DOM_SEP__NOTE_HASH_NONCE: u32 = 1721808740;
675
+
676
+ /// Domain separator for note nullifiers.
677
+ ///
678
+ /// This is not technically a protocol constant as note nullifiers are computed by each contract.
679
+ pub global DOM_SEP__NOTE_NULLIFIER: u32 = 50789342;
680
+
681
+ /// Domain separator for siloed nullifiers.
682
+ ///
683
+ /// Used by [`crate::hash::compute_siloed_nullifier`].
684
+ pub global DOM_SEP__SILOED_NULLIFIER: u32 = 57496191;
685
+
686
+ /// Domain separator for L1 to L2 message nullifiers.
687
+ ///
688
+ /// This is not technically a protocol constant as message nullifiers are computed by each contract.
689
+ pub global DOM_SEP__MESSAGE_NULLIFIER: u32 = 3754509616;
690
+
691
+ /// Domain separator for event log tags. Used by [`crate::hash::compute_log_tag`].
692
+ pub global DOM_SEP__EVENT_LOG_TAG: u32 = 926040838;
693
+ /// Domain separator for unconstrained message delivery log tags. Used by [`crate::hash::compute_log_tag`].
694
+ pub global DOM_SEP__UNCONSTRAINED_MSG_LOG_TAG: u32 = 1485357192;
695
+ /// Domain separator for constrained message delivery log tags. Used by [`crate::hash::compute_log_tag`].
696
+ pub global DOM_SEP__CONSTRAINED_MSG_LOG_TAG: u32 = 3715244738;
697
+ /// Domain separator for the sender-only secret folded into constrained-delivery nullifiers.
698
+ pub global DOM_SEP__CONSTRAINED_MSG_SENDER_SECRET: u32 = 1182889476;
699
+ /// Domain separator for non-interactive handshake log tags emitted by the handshake registry contract. Used by
700
+ /// [`crate::hash::compute_log_tag`].
701
+ pub global DOM_SEP__NON_INTERACTIVE_HANDSHAKE_LOG_TAG: u32 = 4046403018;
702
+ /// Domain separator for the message a recipient signs to authorize an interactive handshake, hashed via
703
+ /// [`crate::hash::poseidon2_hash_with_separator`] and verified in-circuit by the handshake registry contract.
704
+ pub global DOM_SEP__INTERACTIVE_HANDSHAKE_SIGNATURE: u32 = 3098455647;
705
+ /// Domain separator for the scalar that protects a handshake's shared secret from recipient forgery.
706
+ pub global DOM_SEP__HANDSHAKE_FORGERY_PROTECTION: u32 = 2291983127;
707
+ /// Domain separator for private log tags.
708
+ ///
709
+ /// Used by [`crate::hash::compute_siloed_private_log_first_field`].
710
+ pub global DOM_SEP__PRIVATE_LOG_FIRST_FIELD: u32 = 2769976252;
711
+
712
+ pub global DOM_SEP__PUBLIC_LEAF_SLOT: u32 = 1247650290;
713
+ pub global DOM_SEP__PUBLIC_STORAGE_MAP_SLOT: u32 = 4015149901;
714
+
715
+ /// Domain separator for internal merkle-node hashing in append-only trees.
716
+ /// Indexed trees use per-tree merkle separators instead (see below).
717
+ pub global DOM_SEP__MERKLE_HASH: u32 = 2982624097;
718
+
719
+ // Per-tree internal merkle-node separators for indexed trees. Each tree's sibling paths verify
720
+ // against a tree-unique root, so a sibling path from tree A cannot be transported to tree B even
721
+ // if the underlying leaf values collide.
722
+ pub global DOM_SEP__NULLIFIER_MERKLE: u32 = 1157584160;
723
+ pub global DOM_SEP__PUBLIC_DATA_MERKLE: u32 = 3756303423;
724
+ // AVM-internal indexed trees:
725
+ pub global DOM_SEP__WRITTEN_SLOTS_MERKLE: u32 = 2292766212;
726
+ pub global DOM_SEP__RETRIEVED_BYTECODES_MERKLE: u32 = 2789215184;
727
+
728
+ /// Domain separator for the Inbox rolling sha256 chain over L1 to L2 message leaves.
729
+ ///
730
+ /// Prefixed to every link's sha256 preimage so a chain link cannot be reinterpreted as an untagged two-field sha256
731
+ /// hash, in particular the `out_hash` merkle node hash, which absorbs the same 64-byte two-field preimage shape.
732
+ pub global DOM_SEP__INBOX_ROLLING_HASH: u32 = 3737216265;
733
+
734
+ // ---------------------------------------------------------------
735
+ // Contract Address
736
+
737
+ // Class Id
738
+ pub global DOM_SEP__PRIVATE_FUNCTION_LEAF: u32 = 1389398688;
739
+ pub global DOM_SEP__PUBLIC_BYTECODE: u32 = 260313585;
740
+ pub global DOM_SEP__CONTRACT_CLASS_ID: u32 = 3923495515;
741
+
742
+ // Salted Initialization Hash
743
+ pub global DOM_SEP__SALTED_INITIALIZATION_HASH: u32 = 2763052992;
744
+ pub global DOM_SEP__INITIALIZER: u32 = 385396519;
745
+
746
+ // Keys
747
+ pub global DOM_SEP__NHK_M: u32 = 242137788;
748
+ pub global DOM_SEP__IVSK_M: u32 = 2747825907;
749
+ pub global DOM_SEP__OVSK_M: u32 = 4272201051;
750
+ pub global DOM_SEP__TSK_M: u32 = 1546190975;
751
+ pub global DOM_SEP__MSSK_M: u32 = 617962565;
752
+ pub global DOM_SEP__FBSK_M: u32 = 787738027;
753
+ pub global DOM_SEP__PUBLIC_KEYS_HASH: u32 = 777457226;
754
+ pub global DOM_SEP__SINGLE_PUBLIC_KEY_HASH: u32 = 3452068255;
755
+
756
+ // Address
757
+ pub global DOM_SEP__PARTIAL_ADDRESS: u32 = 2103633018;
758
+
759
+ pub global DOM_SEP__CONTRACT_ADDRESS_V2: u32 = 4099338721;
760
+
761
+ // ---------------------------------------------------------------
762
+
763
+ pub global DOM_SEP__BLOCK_HEADER_HASH: u32 = 4195546849;
764
+
765
+ pub global DOM_SEP__TX_REQUEST: u32 = 3763737512;
766
+ pub global DOM_SEP__PUBLIC_TX_HASH: u32 = 1630108851;
767
+ pub global DOM_SEP__PRIVATE_TX_HASH: u32 = 1971680439;
768
+
769
+ // Hashing the calldata of public functions:
770
+ pub global DOM_SEP__PUBLIC_CALLDATA: u32 = 2760353947;
771
+ // Hashing the args to private functions:
772
+ pub global DOM_SEP__FUNCTION_ARGS: u32 = 3576554347;
773
+
774
+ pub global DOM_SEP__PROTOCOL_CONTRACTS: u32 = 3904434327;
775
+ // Part of the protocol, because some protocol contracts emit events.
776
+ pub global DOM_SEP__EVENT_COMMITMENT: u32 = 2517418573;
777
+
778
+ // ---------------------------------------------------------------
779
+ // Not protocol, but possibly protocol in future.
780
+
781
+ // The following might (in future) be justifiable as protocol constants, as they might get used by the protocol's "Protocol Contracts", e.g. if the protocol enables FeeJuice to be shielded in future.
782
+ // It will depend on the chosen functionality of FeeJuice:
783
+ // - It might not support partial notes.
784
+ // - It might not support encrypted messages.
785
+ // - It might not support authwits (instead using the fee_payer field as evidence of authorization).
786
+ // If FeeJuice doesn't end up supporting those things, then these constants should be moved into aztec.nr.
787
+
788
+ pub global DOM_SEP__AUTHWIT_INNER: u32 = 221354163;
789
+ pub global DOM_SEP__AUTHWIT_OUTER: u32 = 3283595782;
790
+
791
+ pub global DOM_SEP__APP_SILOED_ECDH_SHARED_SECRET: u32 = 1707851664;
792
+
793
+ pub global DOM_SEP__PARTIAL_NOTE_VALIDITY_COMMITMENT: u32 = 623934423;
794
+
795
+ // ---------------------------------------------------------------
796
+ // TODO(F-397): move these to aztec-nr, along with note hash, note nullifier, message nullifier and single use claim
797
+ // nullifier.
798
+
799
+ pub global DOM_SEP__PUBLIC_INITIALIZATION_NULLIFIER: u32 = 3342006647;
800
+ pub global DOM_SEP__PRIVATE_INITIALIZATION_NULLIFIER: u32 = 3990889078;
801
+
802
+ /// Domain separator for L1 to L2 message secret hashes.
803
+ pub global DOM_SEP__SECRET_HASH: u32 = 4199652938;
804
+
805
+ /// Domain separator for account contract payloads.
806
+ ///
807
+ /// Used to check for authorization to execute a payload.
808
+ ///
809
+ /// This is not technically a protocol constant as payload authorization is an account contract feature.
810
+ pub global DOM_SEP__SIGNATURE_PAYLOAD: u32 = 463525807;
811
+
812
+ // ---------------------------------------------------------------
813
+
814
+ pub global DOM_SEP__BLOCK_HEADERS_HASH: u32 = 515582467;
815
+
816
+ // Blob-related domain separators:
817
+ pub global DOM_SEP__BLOB_HASHED_Y_LIMBS: u32 = 2949331415;
818
+ pub global DOM_SEP__BLOB_CHALLENGE_Z: u32 = 60345710;
819
+ pub global DOM_SEP__BLOB_Z_ACC: u32 = 1003392952;
820
+ pub global DOM_SEP__BLOB_GAMMA_ACC: u32 = 855632775;
821
+ pub global DOM_SEP__BLOB_GAMMA_FINAL: u32 = 1755883835;
822
+
823
+ // ---------------------------------------------------------------
824
+
825
+ // TODO: Move this to bb's constant noir lib when created.
826
+ // AVM memory tags
827
+ pub global MEM_TAG_FF: Field = 0;
828
+ pub global MEM_TAG_U1: Field = 1;
829
+ pub global MEM_TAG_U8: Field = 2;
830
+ pub global MEM_TAG_U16: Field = 3;
831
+ pub global MEM_TAG_U32: Field = 4;
832
+ pub global MEM_TAG_U64: Field = 5;
833
+ pub global MEM_TAG_U128: Field = 6;
834
+
835
+ // AVM memory related constants
836
+ pub global AVM_HIGHEST_MEM_ADDRESS: u32 = MAX_U32_VALUE;
837
+ pub global AVM_MEMORY_NUM_BITS: u8 = 32;
838
+ pub global AVM_MEMORY_SIZE: u64 = 0x100000000;
839
+
840
+ // AVM bitwise operation IDs
841
+ // Note: these are all powers of 2 to allow for binary decomposition.
842
+ pub global AVM_BITWISE_AND_OP_ID: u8 = 1;
843
+ pub global AVM_BITWISE_OR_OP_ID: u8 = 2 * AVM_BITWISE_AND_OP_ID;
844
+ pub global AVM_BITWISE_XOR_OP_ID: u8 = 2 * AVM_BITWISE_OR_OP_ID;
845
+
846
+ // AVM Keccakf1600 specific constants
847
+ pub global AVM_KECCAKF1600_NUM_ROUNDS: u8 = 24;
848
+ pub global AVM_KECCAKF1600_STATE_SIZE: u8 = 25;
849
+
850
+ // Transaction Phase Values
851
+ pub global AVM_TX_PHASE_VALUE_START: u8 = 0;
852
+ pub global AVM_TX_PHASE_VALUE_SETUP: u8 = 3;
853
+ pub global AVM_TX_PHASE_VALUE_LAST: u8 = 11;
854
+
855
+ // Subtrace IDs.
856
+ // Execution, ALU, BITWISE and then we follow the order given by ExecutionOpCode enum.
857
+ // Note: these are all powers of 2 to allow for binary decomposition.
858
+ pub global AVM_SUBTRACE_ID_EXECUTION: u32 = 1;
859
+ pub global AVM_SUBTRACE_ID_ALU: u32 = 2 * AVM_SUBTRACE_ID_EXECUTION;
860
+ pub global AVM_SUBTRACE_ID_BITWISE: u32 = 2 * AVM_SUBTRACE_ID_ALU;
861
+ pub global AVM_SUBTRACE_ID_CAST: u32 = 2 * AVM_SUBTRACE_ID_BITWISE;
862
+ pub global AVM_SUBTRACE_ID_CALLDATA_COPY: u32 = 2 * AVM_SUBTRACE_ID_CAST;
863
+ pub global AVM_SUBTRACE_ID_RETURNDATA_COPY: u32 = 2 * AVM_SUBTRACE_ID_CALLDATA_COPY;
864
+ pub global AVM_SUBTRACE_ID_SET: u32 = 2 * AVM_SUBTRACE_ID_RETURNDATA_COPY;
865
+ pub global AVM_SUBTRACE_ID_GETCONTRACTINSTANCE: u32 = 2 * AVM_SUBTRACE_ID_SET;
866
+ pub global AVM_SUBTRACE_ID_EMITPUBLICLOG: u32 = 2 * AVM_SUBTRACE_ID_GETCONTRACTINSTANCE;
867
+ pub global AVM_SUBTRACE_ID_POSEIDON2_PERM: u32 = 2 * AVM_SUBTRACE_ID_EMITPUBLICLOG;
868
+ pub global AVM_SUBTRACE_ID_SHA256_COMPRESSION: u32 = 2 * AVM_SUBTRACE_ID_POSEIDON2_PERM;
869
+ pub global AVM_SUBTRACE_ID_KECCAKF1600: u32 = 2 * AVM_SUBTRACE_ID_SHA256_COMPRESSION;
870
+ pub global AVM_SUBTRACE_ID_ECC: u32 = 2 * AVM_SUBTRACE_ID_KECCAKF1600;
871
+ pub global AVM_SUBTRACE_ID_TO_RADIX: u32 = 2 * AVM_SUBTRACE_ID_ECC;
872
+
873
+ // Dynamic Gas Opcode IDs
874
+ // Note: these are all powers of 2 to allow for binary decomposition.
875
+ pub global AVM_DYN_GAS_ID_CALLDATACOPY: u32 = 1;
876
+ pub global AVM_DYN_GAS_ID_RETURNDATACOPY: u32 = 2 * AVM_DYN_GAS_ID_CALLDATACOPY;
877
+ pub global AVM_DYN_GAS_ID_TORADIX: u32 = 2 * AVM_DYN_GAS_ID_RETURNDATACOPY;
878
+ pub global AVM_DYN_GAS_ID_EMITPUBLICLOG: u32 = 2 * AVM_DYN_GAS_ID_TORADIX;
879
+ pub global AVM_DYN_GAS_ID_SSTORE: u32 = 2 * AVM_DYN_GAS_ID_EMITPUBLICLOG;
880
+
881
+ // Execution Opcode IDs
882
+ // Note: these are all powers of 2 to allow for binary decomposition.
883
+ pub global AVM_EXEC_OP_ID_GETENVVAR: u32 = 1;
884
+ pub global AVM_EXEC_OP_ID_MOV: u32 = 2 * AVM_EXEC_OP_ID_GETENVVAR;
885
+ pub global AVM_EXEC_OP_ID_JUMP: u32 = 2 * AVM_EXEC_OP_ID_MOV;
886
+ pub global AVM_EXEC_OP_ID_JUMPI: u32 = 2 * AVM_EXEC_OP_ID_JUMP;
887
+ pub global AVM_EXEC_OP_ID_CALL: u32 = 2 * AVM_EXEC_OP_ID_JUMPI;
888
+ pub global AVM_EXEC_OP_ID_STATICCALL: u32 = 2 * AVM_EXEC_OP_ID_CALL;
889
+ pub global AVM_EXEC_OP_ID_INTERNALCALL: u32 = 2 * AVM_EXEC_OP_ID_STATICCALL;
890
+ pub global AVM_EXEC_OP_ID_INTERNALRETURN: u32 = 2 * AVM_EXEC_OP_ID_INTERNALCALL;
891
+ pub global AVM_EXEC_OP_ID_RETURN: u32 = 2 * AVM_EXEC_OP_ID_INTERNALRETURN;
892
+ pub global AVM_EXEC_OP_ID_REVERT: u32 = 2 * AVM_EXEC_OP_ID_RETURN;
893
+ pub global AVM_EXEC_OP_ID_SUCCESSCOPY: u32 = 2 * AVM_EXEC_OP_ID_REVERT;
894
+ pub global AVM_EXEC_OP_ID_RETURNDATASIZE: u32 = 2 * AVM_EXEC_OP_ID_SUCCESSCOPY;
895
+ pub global AVM_EXEC_OP_ID_DEBUGLOG: u32 = 2 * AVM_EXEC_OP_ID_RETURNDATASIZE;
896
+ pub global AVM_EXEC_OP_ID_SLOAD: u32 = 2 * AVM_EXEC_OP_ID_DEBUGLOG;
897
+ pub global AVM_EXEC_OP_ID_SSTORE: u32 = 2 * AVM_EXEC_OP_ID_SLOAD;
898
+ pub global AVM_EXEC_OP_ID_NOTEHASH_EXISTS: u32 = 2 * AVM_EXEC_OP_ID_SSTORE;
899
+ pub global AVM_EXEC_OP_ID_EMIT_NOTEHASH: u32 = 2 * AVM_EXEC_OP_ID_NOTEHASH_EXISTS;
900
+ pub global AVM_EXEC_OP_ID_L1_TO_L2_MESSAGE_EXISTS: u32 = 2 * AVM_EXEC_OP_ID_EMIT_NOTEHASH;
901
+ pub global AVM_EXEC_OP_ID_NULLIFIER_EXISTS: u32 = 2 * AVM_EXEC_OP_ID_L1_TO_L2_MESSAGE_EXISTS;
902
+ pub global AVM_EXEC_OP_ID_EMIT_NULLIFIER: u32 = 2 * AVM_EXEC_OP_ID_NULLIFIER_EXISTS;
903
+ pub global AVM_EXEC_OP_ID_SENDL2TOL1MSG: u32 = 2 * AVM_EXEC_OP_ID_EMIT_NULLIFIER;
904
+
905
+ // Execution Opcode IDs for the ALU subtrace
906
+ // Note: these are all powers of 2 to allow for binary decomposition.
907
+ pub global AVM_EXEC_OP_ID_ALU_ADD: u32 = 1;
908
+ pub global AVM_EXEC_OP_ID_ALU_SUB: u32 = 2 * AVM_EXEC_OP_ID_ALU_ADD;
909
+ pub global AVM_EXEC_OP_ID_ALU_MUL: u32 = 2 * AVM_EXEC_OP_ID_ALU_SUB;
910
+ pub global AVM_EXEC_OP_ID_ALU_DIV: u32 = 2 * AVM_EXEC_OP_ID_ALU_MUL;
911
+ pub global AVM_EXEC_OP_ID_ALU_FDIV: u32 = 2 * AVM_EXEC_OP_ID_ALU_DIV;
912
+ pub global AVM_EXEC_OP_ID_ALU_EQ: u32 = 2 * AVM_EXEC_OP_ID_ALU_FDIV;
913
+ pub global AVM_EXEC_OP_ID_ALU_LT: u32 = 2 * AVM_EXEC_OP_ID_ALU_EQ;
914
+ pub global AVM_EXEC_OP_ID_ALU_LTE: u32 = 2 * AVM_EXEC_OP_ID_ALU_LT;
915
+ pub global AVM_EXEC_OP_ID_ALU_NOT: u32 = 2 * AVM_EXEC_OP_ID_ALU_LTE;
916
+ pub global AVM_EXEC_OP_ID_ALU_SHL: u32 = 2 * AVM_EXEC_OP_ID_ALU_NOT;
917
+ pub global AVM_EXEC_OP_ID_ALU_SHR: u32 = 2 * AVM_EXEC_OP_ID_ALU_SHL;
918
+ pub global AVM_EXEC_OP_ID_ALU_TRUNCATE: u32 = 2 * AVM_EXEC_OP_ID_ALU_SHR;
919
+
920
+ // AvmCircuitPublicInputs - row indices
921
+ // Global Variables
922
+ // start alias
923
+ pub global AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_ROW_IDX: u32 = 0;
924
+ // members
925
+ pub global AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_CHAIN_ID_ROW_IDX: u32 =
926
+ AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_ROW_IDX;
927
+ pub global AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_VERSION_ROW_IDX: u32 =
928
+ AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_CHAIN_ID_ROW_IDX + 1;
929
+ pub global AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_BLOCK_NUMBER_ROW_IDX: u32 =
930
+ AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_VERSION_ROW_IDX + 1;
931
+ pub global AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_SLOT_NUMBER_ROW_IDX: u32 =
932
+ AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_BLOCK_NUMBER_ROW_IDX + 1;
933
+ pub global AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_TIMESTAMP_ROW_IDX: u32 =
934
+ AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_SLOT_NUMBER_ROW_IDX + 1;
935
+ pub global AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_COINBASE_ROW_IDX: u32 =
936
+ AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_TIMESTAMP_ROW_IDX + 1;
937
+ pub global AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_FEE_RECIPIENT_ROW_IDX: u32 =
938
+ AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_COINBASE_ROW_IDX + 1;
939
+ pub global AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_GAS_FEES_ROW_IDX: u32 =
940
+ AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_FEE_RECIPIENT_ROW_IDX + 1;
941
+ // Note: gas fees ^, despite being 2 entries, is split across 2 columns. So wee only bump by 1 (below) to progress.
942
+ // Start Protocol Contracts
943
+ pub global AVM_PUBLIC_INPUTS_PROTOCOL_CONTRACTS_ROW_IDX: u32 =
944
+ AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_GAS_FEES_ROW_IDX + 1;
945
+
946
+ // Start Tree Snapshots
947
+ // start alias
948
+ pub global AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_ROW_IDX: u32 =
949
+ AVM_PUBLIC_INPUTS_PROTOCOL_CONTRACTS_ROW_IDX + MAX_PROTOCOL_CONTRACTS;
950
+ // Note: each tree snapshot ^, despite being 2 entries (root, index), is split across 2 columns. So we only bump by 1 (below) to progress.
951
+ // members
952
+ pub global AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_L1_TO_L2_MESSAGE_TREE_ROW_IDX: u32 =
953
+ AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_ROW_IDX;
954
+ pub global AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_NOTE_HASH_TREE_ROW_IDX: u32 =
955
+ AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_L1_TO_L2_MESSAGE_TREE_ROW_IDX + 1;
956
+ pub global AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_NULLIFIER_TREE_ROW_IDX: u32 =
957
+ AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_NOTE_HASH_TREE_ROW_IDX + 1;
958
+ pub global AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_PUBLIC_DATA_TREE_ROW_IDX: u32 =
959
+ AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_NULLIFIER_TREE_ROW_IDX + 1;
960
+
961
+ // Start Gas Used
962
+ pub global AVM_PUBLIC_INPUTS_START_GAS_USED_ROW_IDX: u32 =
963
+ AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_PUBLIC_DATA_TREE_ROW_IDX + 1;
964
+ // Note: gas used ^, despite being 2 entries, is split across 2 columns. So we only bump by 1 (below) to progress.
965
+
966
+ // Gas Settings
967
+ pub global AVM_PUBLIC_INPUTS_GAS_SETTINGS_ROW_IDX: u32 =
968
+ AVM_PUBLIC_INPUTS_START_GAS_USED_ROW_IDX + 1;
969
+ pub global AVM_PUBLIC_INPUTS_GAS_SETTINGS_GAS_LIMITS_ROW_IDX: u32 =
970
+ AVM_PUBLIC_INPUTS_GAS_SETTINGS_ROW_IDX;
971
+ pub global AVM_PUBLIC_INPUTS_GAS_SETTINGS_TEARDOWN_GAS_LIMITS_ROW_IDX: u32 =
972
+ AVM_PUBLIC_INPUTS_GAS_SETTINGS_GAS_LIMITS_ROW_IDX + 1;
973
+ pub global AVM_PUBLIC_INPUTS_GAS_SETTINGS_MAX_FEES_PER_GAS_ROW_IDX: u32 =
974
+ AVM_PUBLIC_INPUTS_GAS_SETTINGS_TEARDOWN_GAS_LIMITS_ROW_IDX + 1;
975
+ pub global AVM_PUBLIC_INPUTS_GAS_SETTINGS_MAX_PRIORITY_FEES_PER_GAS_ROW_IDX: u32 =
976
+ AVM_PUBLIC_INPUTS_GAS_SETTINGS_MAX_FEES_PER_GAS_ROW_IDX + 1;
977
+ // Note: each of these gas settings ^, despite being 2 entries each, are split across 2 columns. So we only bump by 1 for each.
978
+
979
+ // Effective Gas Fees
980
+ pub global AVM_PUBLIC_INPUTS_EFFECTIVE_GAS_FEES_ROW_IDX: u32 =
981
+ AVM_PUBLIC_INPUTS_GAS_SETTINGS_MAX_PRIORITY_FEES_PER_GAS_ROW_IDX + 1;
982
+
983
+ // Fee Payer
984
+ pub global AVM_PUBLIC_INPUTS_FEE_PAYER_ROW_IDX: u32 =
985
+ AVM_PUBLIC_INPUTS_EFFECTIVE_GAS_FEES_ROW_IDX + 1;
986
+
987
+ // Prover ID
988
+ pub global AVM_PUBLIC_INPUTS_PROVER_ID_ROW_IDX: u32 = AVM_PUBLIC_INPUTS_FEE_PAYER_ROW_IDX + 1;
989
+
990
+ // Public Call Request Array Lengths
991
+ pub global AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_ROW_IDX: u32 =
992
+ AVM_PUBLIC_INPUTS_PROVER_ID_ROW_IDX + 1;
993
+ pub global AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_SETUP_CALLS_ROW_IDX: u32 =
994
+ AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_ROW_IDX;
995
+ pub global AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_APP_LOGIC_CALLS_ROW_IDX: u32 =
996
+ AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_SETUP_CALLS_ROW_IDX + 1;
997
+ pub global AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_TEARDOWN_CALL_ROW_IDX: u32 =
998
+ AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_APP_LOGIC_CALLS_ROW_IDX + 1;
999
+
1000
+ // Public Setup Call Requests
1001
+ // Note: PublicCallRequests are a few entries, but are split across multiple columns so that they consume 1 row each.
1002
+ // So we only bump by 1 (below) to progress.
1003
+ pub global AVM_PUBLIC_INPUTS_PUBLIC_SETUP_CALL_REQUESTS_ROW_IDX: u32 =
1004
+ AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_TEARDOWN_CALL_ROW_IDX + 1;
1005
+ // Public App Logic Call Requests
1006
+ pub global AVM_PUBLIC_INPUTS_PUBLIC_APP_LOGIC_CALL_REQUESTS_ROW_IDX: u32 =
1007
+ AVM_PUBLIC_INPUTS_PUBLIC_SETUP_CALL_REQUESTS_ROW_IDX + MAX_ENQUEUED_CALLS_PER_TX;
1008
+ // Public Teardown Call Request (just 1)
1009
+ pub global AVM_PUBLIC_INPUTS_PUBLIC_TEARDOWN_CALL_REQUEST_ROW_IDX: u32 =
1010
+ AVM_PUBLIC_INPUTS_PUBLIC_APP_LOGIC_CALL_REQUESTS_ROW_IDX + MAX_ENQUEUED_CALLS_PER_TX;
1011
+
1012
+ // Previous Non-Revertible Accumulated Data Array Lengths
1013
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_ROW_IDX: u32 =
1014
+ AVM_PUBLIC_INPUTS_PUBLIC_TEARDOWN_CALL_REQUEST_ROW_IDX + 1;
1015
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX: u32 =
1016
+ AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_ROW_IDX;
1017
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX: u32 = AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX
1018
+ + 1;
1019
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX: u32 =
1020
+ AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX + 1;
1021
+
1022
+ // Previous Revertible Accumulated Data Array Lengths
1023
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_ROW_IDX: u32 = AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX
1024
+ + 1;
1025
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX: u32 =
1026
+ AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_ROW_IDX;
1027
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX: u32 =
1028
+ AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX + 1;
1029
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX: u32 =
1030
+ AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX + 1;
1031
+
1032
+ // Previous Non-Revertible Accumulated Data
1033
+ // start alias
1034
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ROW_IDX: u32 =
1035
+ AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX + 1;
1036
+ // members
1037
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_NOTE_HASHES_ROW_IDX: u32 =
1038
+ AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ROW_IDX;
1039
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX: u32 = AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_NOTE_HASHES_ROW_IDX
1040
+ + MAX_NOTE_HASHES_PER_TX;
1041
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX: u32 = AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX
1042
+ + MAX_NULLIFIERS_PER_TX;
1043
+
1044
+ // Previous Revertible Accumulated Data
1045
+ // start alias
1046
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ROW_IDX: u32 = AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX
1047
+ + MAX_L2_TO_L1_MSGS_PER_TX;
1048
+ // members
1049
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_NOTE_HASHES_ROW_IDX: u32 =
1050
+ AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ROW_IDX;
1051
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX: u32 = AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_NOTE_HASHES_ROW_IDX
1052
+ + MAX_NOTE_HASHES_PER_TX;
1053
+ pub global AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX: u32 = AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX
1054
+ + MAX_NULLIFIERS_PER_TX;
1055
+
1056
+ // End Tree Snapshots
1057
+ // start alias
1058
+ pub global AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_ROW_IDX: u32 = AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX
1059
+ + MAX_L2_TO_L1_MSGS_PER_TX;
1060
+ // Note: each tree snapshot ^, despite being 2 entries (root, index), is split across 2 columns. So we only bump by 1 (below) to progress.
1061
+ // members
1062
+ pub global AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_L1_TO_L2_MESSAGE_TREE_ROW_IDX: u32 =
1063
+ AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_ROW_IDX;
1064
+ pub global AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_NOTE_HASH_TREE_ROW_IDX: u32 =
1065
+ AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_L1_TO_L2_MESSAGE_TREE_ROW_IDX + 1;
1066
+ pub global AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_NULLIFIER_TREE_ROW_IDX: u32 =
1067
+ AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_NOTE_HASH_TREE_ROW_IDX + 1;
1068
+ pub global AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_PUBLIC_DATA_TREE_ROW_IDX: u32 =
1069
+ AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_NULLIFIER_TREE_ROW_IDX + 1;
1070
+
1071
+ // End Gas Used
1072
+ pub global AVM_PUBLIC_INPUTS_END_GAS_USED_ROW_IDX: u32 =
1073
+ AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_PUBLIC_DATA_TREE_ROW_IDX + 1;
1074
+
1075
+ // AVM Accumulated Data Array Lengths
1076
+ pub global AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_ROW_IDX: u32 =
1077
+ AVM_PUBLIC_INPUTS_END_GAS_USED_ROW_IDX + 1;
1078
+ pub global AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX: u32 =
1079
+ AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_ROW_IDX;
1080
+ pub global AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX: u32 =
1081
+ AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX + 1;
1082
+ pub global AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX: u32 =
1083
+ AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX + 1;
1084
+ pub global AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_PUBLIC_DATA_WRITES_ROW_IDX: u32 =
1085
+ AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX + 1;
1086
+
1087
+ // AVM Accumulated Data
1088
+ pub global AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ROW_IDX: u32 =
1089
+ AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_PUBLIC_DATA_WRITES_ROW_IDX + 1;
1090
+ pub global AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_NOTE_HASHES_ROW_IDX: u32 =
1091
+ AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ROW_IDX;
1092
+ pub global AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX: u32 =
1093
+ AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_NOTE_HASHES_ROW_IDX + MAX_NOTE_HASHES_PER_TX;
1094
+ pub global AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX: u32 =
1095
+ AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX + MAX_NULLIFIERS_PER_TX;
1096
+ pub global AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_LOGS_ROW_IDX: u32 =
1097
+ AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX + MAX_L2_TO_L1_MSGS_PER_TX;
1098
+ pub global AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_DATA_WRITES_ROW_IDX: u32 =
1099
+ AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_LOGS_ROW_IDX + PUBLIC_LOGS_LENGTH;
1100
+
1101
+ // End transaction fee
1102
+ pub global AVM_PUBLIC_INPUTS_TRANSACTION_FEE_ROW_IDX: u32 = AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_DATA_WRITES_ROW_IDX
1103
+ + MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX;
1104
+
1105
+ // End reverted
1106
+ pub global AVM_PUBLIC_INPUTS_REVERTED_ROW_IDX: u32 = AVM_PUBLIC_INPUTS_TRANSACTION_FEE_ROW_IDX + 1;
1107
+
1108
+ // AVM's max public input column size (aka total number of rows). This is the length of column 0,
1109
+ // which is the longest column, and also the extent of the public_inputs `sel` selector.
1110
+ pub global AVM_PUBLIC_INPUTS_COLUMNS_MAX_LENGTH: u32 = AVM_PUBLIC_INPUTS_REVERTED_ROW_IDX + 1;
1111
+ pub global AVM_NUM_PUBLIC_INPUT_COLUMNS: u32 = 4;
1112
+
1113
+ // Per-column lengths: the exact number of rows used by each public input column, equal to
1114
+ // (last row index that writes the column) + 1. Column 0 spans the full table; columns 1-3 are
1115
+ // shorter, so the recursive verifier avoids hashing / MLE-evaluating their trailing zeros.
1116
+ // IMPORTANT: revisit these if the column layout (see public_inputs.pil / to_columns) changes
1117
+ // which column holds its last written cell.
1118
+ pub global AVM_PUBLIC_INPUTS_COLUMN_0_LENGTH: u32 = AVM_PUBLIC_INPUTS_COLUMNS_MAX_LENGTH; // last: reverted
1119
+ pub global AVM_PUBLIC_INPUTS_COLUMN_1_LENGTH: u32 = AVM_PUBLIC_INPUTS_TRANSACTION_FEE_ROW_IDX; // last: public_data_writes value
1120
+ pub global AVM_PUBLIC_INPUTS_COLUMN_2_LENGTH: u32 =
1121
+ AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_LOGS_ROW_IDX; // last: accumulated l2_to_l1 contract_address
1122
+ pub global AVM_PUBLIC_INPUTS_COLUMN_3_LENGTH: u32 =
1123
+ AVM_PUBLIC_INPUTS_PUBLIC_TEARDOWN_CALL_REQUEST_ROW_IDX + 1; // last: teardown calldata_hash
1124
+
1125
+ // Combined size of the AVM's public input columns concatenated together
1126
+ pub global AVM_PUBLIC_INPUTS_COLUMNS_COMBINED_LENGTH: u32 = AVM_PUBLIC_INPUTS_COLUMN_0_LENGTH
1127
+ + AVM_PUBLIC_INPUTS_COLUMN_1_LENGTH
1128
+ + AVM_PUBLIC_INPUTS_COLUMN_2_LENGTH
1129
+ + AVM_PUBLIC_INPUTS_COLUMN_3_LENGTH;
1130
+
1131
+ // AVM_V2_PROOF_LENGTH_IN_FIELDS must be updated when AVM circuit changes.
1132
+ // Run barretenberg/cpp/scripts/bump_avm_proof_length.sh, to regenerate the constants
1133
+ pub global AVM_V2_PROOF_LENGTH_IN_FIELDS: u32 = 14532;
1134
+
1135
+ // GAS DEFAULTS
1136
+ pub global DA_BYTES_PER_FIELD: u32 = 32;
1137
+ pub global DA_GAS_PER_BYTE: u32 = 1; // Arbitrary.
1138
+ pub global DA_GAS_PER_FIELD: u32 = DA_BYTES_PER_FIELD * DA_GAS_PER_BYTE;
1139
+ // A tx always emits 3 fields: tx_start_marker, tx_hash, and tx_fee.
1140
+ pub global TX_DA_GAS_OVERHEAD: u32 = 3 * DA_GAS_PER_FIELD;
1141
+ pub global MAX_TX_BLOB_DATA_SIZE_IN_FIELDS: u32 = 1 // tx start marker
1142
+ + 1 // tx hash
1143
+ + 1 // transaction fee
1144
+ + MAX_NOTE_HASHES_PER_TX
1145
+ + MAX_NULLIFIERS_PER_TX
1146
+ + MAX_L2_TO_L1_MSGS_PER_TX
1147
+ + MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2 // (*2 for leaf slot and value)
1148
+ + MAX_PRIVATE_LOGS_PER_TX * (PRIVATE_LOG_SIZE_IN_FIELDS + 1) // (+1 for log length)
1149
+ + FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH
1150
+ + MAX_CONTRACT_CLASS_LOGS_PER_TX * (CONTRACT_CLASS_LOG_SIZE_IN_FIELDS + 1); // (+1 for contract address)
1151
+ // Computed taking into account simulation time metrics.
1152
+ pub global PUBLIC_TX_L2_GAS_OVERHEAD: u32 = 540000;
1153
+ pub global PRIVATE_TX_L2_GAS_OVERHEAD: u32 = 440000;
1154
+ // base cost for a single public call
1155
+ pub global FIXED_AVM_STARTUP_L2_GAS: u32 = 20_000;
1156
+
1157
+ // The maximum amount of l2 gas that the AVM can process safely.
1158
+ pub global AVM_MAX_PROCESSABLE_L2_GAS: u32 = 6_000_000; // Arbitrary.
1159
+ // The following limit assumes that a private only tx will always be cheaper than a tx with a full public component.
1160
+ pub global MAX_PROCESSABLE_L2_GAS: u32 = PUBLIC_TX_L2_GAS_OVERHEAD + AVM_MAX_PROCESSABLE_L2_GAS;
1161
+
1162
+ pub global MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT: u32 =
1163
+ BLOBS_PER_CHECKPOINT * FIELDS_PER_BLOB * DA_GAS_PER_FIELD;
1164
+
1165
+ // Some tree insertions incur an additional cost associated with
1166
+ // the new database entry to be stored by all network participants.
1167
+ pub global L2_GAS_DISTRIBUTED_STORAGE_PREMIUM: u32 = 1024;
1168
+
1169
+ // AVM - misc constants
1170
+ pub global AVM_PC_SIZE_IN_BITS: u32 = 32;
1171
+ pub global AVM_MAX_OPERANDS: u32 = 5;
1172
+ pub global AVM_MAX_REGISTERS: u32 = 4;
1173
+
1174
+ /**
1175
+ * GAS COSTS FOR AVM OPCODES
1176
+ * They are used in TS and C++
1177
+ */
1178
+
1179
+ // Addressing gas
1180
+ pub global AVM_ADDRESSING_BASE_RESOLUTION_L2_GAS: u32 = 3; // One mem access
1181
+ pub global AVM_ADDRESSING_INDIRECT_L2_GAS: u32 = 3; // One mem access
1182
+ pub global AVM_ADDRESSING_RELATIVE_L2_GAS: u32 = 3; // One range check
1183
+
1184
+ // Base L2 GAS
1185
+ // Based on simulation time metrics
1186
+ pub global L2_GAS_PER_NOTE_HASH: u32 = 9200; // Bounded by long term storage requirements.
1187
+ pub global L2_GAS_PER_NULLIFIER: u32 = 16000;
1188
+ pub global L2_GAS_PER_L2_TO_L1_MSG: u32 = 5200;
1189
+ pub global L2_GAS_PER_PRIVATE_LOG: u32 = 2500;
1190
+ pub global L2_GAS_PER_CONTRACT_CLASS_LOG: u32 = 73000;
1191
+ // Note: magic numbers here are derived from each op's AVM circuit trace area
1192
+ // https://docs.google.com/spreadsheets/d/1FPyLfJFPOfZTmZC-T6b_4yB5dSrOAofz3dufte23_TA/edit?usp=sharing
1193
+ // Some have a "SLOW_SIM_MUL" multiplier because they are slower to simulate and their trace-area-derived gas cost
1194
+ // is not sufficient to cover the simulation effort.
1195
+ pub global AVM_ADD_BASE_L2_GAS: u32 = 12;
1196
+ pub global AVM_SUB_BASE_L2_GAS: u32 = 12;
1197
+ pub global AVM_MUL_BASE_L2_GAS: u32 = 27;
1198
+ pub global AVM_DIV_BASE_L2_GAS: u32 = 27;
1199
+ pub global AVM_FDIV_BASE_L2_GAS: u32 = 9 * 25; // SLOW_SIM_MUL = 25
1200
+ pub global AVM_EQ_BASE_L2_GAS: u32 = 12;
1201
+ pub global AVM_LT_BASE_L2_GAS: u32 = 42;
1202
+ pub global AVM_LTE_BASE_L2_GAS: u32 = 42;
1203
+ pub global AVM_AND_BASE_L2_GAS: u32 = 12;
1204
+ pub global AVM_OR_BASE_L2_GAS: u32 = 12;
1205
+ pub global AVM_XOR_BASE_L2_GAS: u32 = 12;
1206
+ pub global AVM_NOT_BASE_L2_GAS: u32 = 12;
1207
+ pub global AVM_SHL_BASE_L2_GAS: u32 = 18;
1208
+ pub global AVM_SHR_BASE_L2_GAS: u32 = 18;
1209
+ pub global AVM_CAST_BASE_L2_GAS: u32 = 27;
1210
+ pub global AVM_GETENVVAR_BASE_L2_GAS: u16 = 12;
1211
+ pub global AVM_CALLDATACOPY_BASE_L2_GAS: u32 = 18;
1212
+ pub global AVM_SUCCESSCOPY_BASE_L2_GAS: u32 = 12;
1213
+ pub global AVM_RETURNDATASIZE_BASE_L2_GAS: u32 = 12;
1214
+ pub global AVM_RETURNDATACOPY_BASE_L2_GAS: u32 = 18;
1215
+ pub global AVM_JUMP_BASE_L2_GAS: u32 = 9;
1216
+ pub global AVM_JUMPI_BASE_L2_GAS: u32 = 9;
1217
+ pub global AVM_INTERNALCALL_BASE_L2_GAS: u32 = 9;
1218
+ pub global AVM_INTERNALRETURN_BASE_L2_GAS: u32 = 9;
1219
+ pub global AVM_SET_BASE_L2_GAS: u32 = 27;
1220
+ pub global AVM_MOV_BASE_L2_GAS: u32 = 12;
1221
+ pub global AVM_SLOAD_BASE_L2_GAS: u32 = 129 * 10; // SLOW_SIM_MUL = 10
1222
+ pub global AVM_SSTORE_BASE_L2_GAS: u32 = (633 + L2_GAS_DISTRIBUTED_STORAGE_PREMIUM) * 20; // SLOW_SIM_MUL = 20
1223
+ pub global AVM_NOTEHASHEXISTS_BASE_L2_GAS: u32 = 126 * 4; // SLOW_SIM_MUL = 3 (+1 for slow proving)
1224
+ pub global AVM_EMITNOTEHASH_BASE_L2_GAS: u32 = (261 + L2_GAS_DISTRIBUTED_STORAGE_PREMIUM) * 15; // SLOW_SIM_MUL = 15
1225
+ pub global AVM_NULLIFIEREXISTS_BASE_L2_GAS: u32 = 129 * 7; // SLOW_SIM_MUL = 6 (+1 for slow proving)
1226
+ pub global AVM_EMITNULLIFIER_BASE_L2_GAS: u32 = (516 + L2_GAS_DISTRIBUTED_STORAGE_PREMIUM) * 20; // SLOW_SIM_MUL = 20
1227
+ pub global AVM_L1TOL2MSGEXISTS_BASE_L2_GAS: u32 = 108 * 5; // SLOW_SIM_MUL = 4 (+1 for slow proving)
1228
+ pub global AVM_GETCONTRACTINSTANCE_BASE_L2_GAS: u32 = 1527 * 4; // SLOW_SIM_MUL = 4
1229
+ pub global AVM_EMITPUBLICLOG_BASE_L2_GAS: u32 = 15;
1230
+ pub global AVM_SENDL2TOL1MSG_BASE_L2_GAS: u32 = 39 + L2_GAS_PER_L2_TO_L1_MSG;
1231
+ // See PR https://github.com/AztecProtocol/aztec-packages/pull/15495 on why we need this buffer.
1232
+ pub global AVM_CALL_BASE_L2_GAS: u32 = 3312 * 3; // SLOW_SIM_MUL = 3
1233
+ pub global AVM_STATICCALL_BASE_L2_GAS: u32 = 3312 * 3; // SLOW_SIM_MUL = 3
1234
+ pub global AVM_RETURN_BASE_L2_GAS: u32 = 9;
1235
+ pub global AVM_REVERT_BASE_L2_GAS: u32 = 9;
1236
+ pub global AVM_DEBUGLOG_BASE_L2_GAS: u32 = 9;
1237
+ pub global AVM_POSEIDON2_BASE_L2_GAS: u32 = 24 * 15; // SLOW_SIM_MUL = 15
1238
+ pub global AVM_SHA256COMPRESSION_BASE_L2_GAS: u32 = 12288;
1239
+ pub global AVM_KECCAKF1600_BASE_L2_GAS: u32 = 58176;
1240
+ pub global AVM_ECADD_BASE_L2_GAS: u32 = 18 * 10; // SLOW_SIM_MUL = 10
1241
+ pub global AVM_TORADIXBE_BASE_L2_GAS: u32 = 24;
1242
+
1243
+ // Dynamic L2 GAS
1244
+ pub global AVM_CALLDATACOPY_DYN_L2_GAS: u32 = 6;
1245
+ pub global AVM_RETURNDATACOPY_DYN_L2_GAS: u32 = 6;
1246
+ pub global AVM_TORADIXBE_DYN_L2_GAS: u32 = 3;
1247
+ pub global AVM_EMITPUBLICLOG_DYN_L2_GAS: u32 = 3;
1248
+
1249
+ // Base DA Gas
1250
+ pub global AVM_EMITNOTEHASH_BASE_DA_GAS: u32 = DA_GAS_PER_FIELD;
1251
+ pub global AVM_EMITNULLIFIER_BASE_DA_GAS: u32 = DA_GAS_PER_FIELD;
1252
+ pub global AVM_SENDL2TOL1MSG_BASE_DA_GAS: u32 = DA_GAS_PER_FIELD;
1253
+ pub global AVM_EMITPUBLICLOG_BASE_DA_GAS: u32 = 2 * DA_GAS_PER_FIELD; // length and address
1254
+
1255
+ // Dynamic DA Gas
1256
+ // a single increment here corresponds to an entire additional field (hence x32 bytes per field)
1257
+ pub global AVM_EMITPUBLICLOG_DYN_DA_GAS: u32 = DA_GAS_PER_FIELD;
1258
+ // Gets multiplied by 1 if actually publishing, 0 if not. 2 because of it being (slot, value) pair
1259
+ pub global AVM_SSTORE_DYN_DA_GAS: u32 = 2 * DA_GAS_PER_FIELD;
1260
+
1261
+ // BLOB PREFIXES
1262
+ // Used when decoding blobs of tightly packed effects
1263
+ // See ./constants_tests.nr for how the values are generated.
1264
+ pub global TX_START_PREFIX: Field = 0x9c707518;
1265
+ pub global BLOCK_END_PREFIX: Field = 0xeb8dcdbf;
1266
+ pub global CHECKPOINT_END_PREFIX: Field = 0x8c637443;
1267
+
1268
+ // Constants related to proof type of a recursive proof verification.
1269
+ // Keep following constants in sync with the enum acir_format::PROOF_TYPE in recursion_constraint.hpp
1270
+ // TODO: Move to BB noir constants lib
1271
+ pub global PROOF_TYPE_HONK: u32 = 0;
1272
+ pub global PROOF_TYPE_OINK: u32 = 1;
1273
+ pub global PROOF_TYPE_HN: u32 = 2;
1274
+ pub global PROOF_TYPE_AVM: u32 = 3;
1275
+ pub global PROOF_TYPE_ROLLUP_HONK: u32 = 4;
1276
+ pub global PROOF_TYPE_ROOT_ROLLUP_HONK: u32 = 5;
1277
+ // worktodo comment here where 6 is
1278
+ pub global PROOF_TYPE_HN_FINAL: u32 = 7;
1279
+ pub global PROOF_TYPE_CHONK: u32 = 8;
1280
+
1281
+ // TODO: Make it 1_u128 << 64 as Field without breaking TS constants generator
1282
+ pub global TWO_POW_64: Field = 18446744073709551616;
1283
+ // AVM_WRITTEN_PUBLIC_DATA_SLOTS_TREE_HEIGHT = CEIL(LOG2(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX + 1))
1284
+ // +1 due to the tree prefill
1285
+ // TODO: Move inside BB noir constants lib
1286
+ pub global AVM_WRITTEN_PUBLIC_DATA_SLOTS_TREE_HEIGHT: u32 = 6;
1287
+ pub global AVM_WRITTEN_PUBLIC_DATA_SLOTS_TREE_INITIAL_ROOT: Field =
1288
+ 0x13954b76f8ab76c38ab687731f802fc90e5d55e0592fa6f56d0a73024b3f8356;
1289
+ pub global AVM_WRITTEN_PUBLIC_DATA_SLOTS_TREE_INITIAL_SIZE: u32 = 1;
1290
+ // AVM_RETRIEVED_BYTECODES_TREE_HEIGHT = CEIL(LOG2(MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS + 1))
1291
+ // +1 due to the tree prefill
1292
+ pub global AVM_RETRIEVED_BYTECODES_TREE_HEIGHT: u32 = 5;
1293
+ pub global AVM_RETRIEVED_BYTECODES_TREE_INITIAL_ROOT: Field =
1294
+ 0x0ff65ad321f05745d4c80e2e18e94241093d2e49017ff8cc151df4f207a43c12;
1295
+ pub global AVM_RETRIEVED_BYTECODES_TREE_INITIAL_SIZE: u32 = 1;
1296
+
1297
+ // Note that by casting timestamp to u32 we make this explode in year 2106. We do not care.
1298
+ pub global TIMESTAMP_OF_CHANGE_BIT_SIZE: u32 = 32;
1299
+
1300
+ // The default update delay used when a contract does not explicitly specify one.
1301
+ // Note: This value should match MAX_TX_LIFETIME, because if no custom update delay is set during tx
1302
+ // execution, the `expiration_timestamp` for the contract updates will be computed using this value. And it should not
1303
+ // differ from the maximum allowed duration.
1304
+ pub global DEFAULT_UPDATE_DELAY: u64 = MAX_TX_LIFETIME;
1305
+ // 10 minutes
1306
+ pub global MINIMUM_UPDATE_DELAY: u64 = 600;
1307
+
1308
+ // Updates hold contract class id, which fit in 1 field.
1309
+ pub global UPDATES_VALUE_SIZE: u32 = 1;
1310
+ pub global UPDATES_DELAYED_PUBLIC_MUTABLE_VALUES_LEN: u32 = 2 * UPDATES_VALUE_SIZE + 1;
1311
+
1312
+ // These bit sizes are used in PIL. If need change, consult with the AVM team.
1313
+ pub global UPDATES_DELAYED_PUBLIC_MUTABLE_SDC_DELAY_BIT_SIZE: u32 = 32;
1314
+ pub global UPDATES_DELAYED_PUBLIC_MUTABLE_SDC_IS_SOME_BIT_SIZE: u32 = 8;
1315
+ pub global UPDATES_DELAYED_PUBLIC_MUTABLE_SDC_OPTION_DELAY_BIT_SIZE: u32 = UPDATES_DELAYED_PUBLIC_MUTABLE_SDC_DELAY_BIT_SIZE
1316
+ + UPDATES_DELAYED_PUBLIC_MUTABLE_SDC_IS_SOME_BIT_SIZE;
1317
+ pub global UPDATES_DELAYED_PUBLIC_MUTABLE_METADATA_BIT_SIZE: u32 =
1318
+ UPDATES_DELAYED_PUBLIC_MUTABLE_SDC_OPTION_DELAY_BIT_SIZE * 2 + TIMESTAMP_OF_CHANGE_BIT_SIZE * 2;
1319
+
1320
+ pub global GRUMPKIN_ONE_X: Field = 1;
1321
+ pub global GRUMPKIN_ONE_Y: Field = 17631683881184975370165255887551781615748388533673675138860;
1322
+
1323
+ mod test {
1324
+ use crate::constants::{
1325
+ AVM_RETRIEVED_BYTECODES_TREE_HEIGHT, AVM_WRITTEN_PUBLIC_DATA_SLOTS_TREE_HEIGHT,
1326
+ EMPTY_EPOCH_OUT_HASH, GLOBAL_INDEX_CONTRACT_CLASS_LOG_HASH_OFFSET,
1327
+ GLOBAL_INDEX_L2_TO_L1_MSG_OFFSET, GLOBAL_INDEX_NOTE_HASH_OFFSET,
1328
+ GLOBAL_INDEX_NOTE_HASH_READ_REQUEST_OFFSET, GLOBAL_INDEX_NULLIFIER_OFFSET,
1329
+ GLOBAL_INDEX_NULLIFIER_READ_REQUEST_OFFSET, GLOBAL_INDEX_PRIVATE_CALL_REQUEST_END_OFFSET,
1330
+ GLOBAL_INDEX_PRIVATE_CALL_REQUEST_START_OFFSET, GLOBAL_INDEX_PRIVATE_LOG_OFFSET,
1331
+ GLOBAL_INDEX_PUBLIC_CALL_REQUEST_OFFSET, MAX_CHECKPOINTS_PER_EPOCH,
1332
+ MAX_CONTRACT_CLASS_LOGS_PER_CALL, MAX_ENQUEUED_CALLS_PER_CALL, MAX_ETH_ADDRESS_BIT_SIZE,
1333
+ MAX_L2_TO_L1_MSGS_PER_CALL, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NOTE_HASHES_PER_CALL,
1334
+ MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIERS_PER_CALL,
1335
+ MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PRIVATE_LOGS_PER_CALL, MAX_PROTOCOL_CONTRACTS,
1336
+ MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
1337
+ OUT_HASH_TREE_HEIGHT, OUT_HASH_TREE_LEAF_COUNT, SIDE_EFFECT_MASKING_ADDRESS,
1338
+ };
1339
+ use crate::merkle_tree::root::compute_empty_sha_tree_root;
1340
+ use crate::traits::ToField;
1341
+ use super::{
1342
+ GLOBAL_INDEX_CONTRACT_MIN_REVERTIBLE_SIDE_EFFECT_COUNTER_OFFSET, INBOX_PARITY_SIZE_LARGE,
1343
+ MAX_ETH_ADDRESS_VALUE, MAX_L1_TO_L2_MSGS_PER_CHECKPOINT,
1344
+ TOTAL_COUNTED_SIDE_EFFECTS_PER_CALL,
1345
+ };
1346
+
1347
+ #[test]
1348
+ fn test_grumpkin_point() {
1349
+ assert_eq(
1350
+ super::GRUMPKIN_ONE_X,
1351
+ std::embedded_curve_ops::EmbeddedCurvePoint::generator().x,
1352
+ );
1353
+ assert_eq(
1354
+ super::GRUMPKIN_ONE_Y,
1355
+ std::embedded_curve_ops::EmbeddedCurvePoint::generator().y,
1356
+ );
1357
+ }
1358
+
1359
+ #[test]
1360
+ fn test_avm_written_public_data_slots_tree_height() {
1361
+ assert_eq(
1362
+ 1 << AVM_WRITTEN_PUBLIC_DATA_SLOTS_TREE_HEIGHT,
1363
+ MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX + 1,
1364
+ );
1365
+ }
1366
+
1367
+ #[test]
1368
+ fn test_avm_retrieved_bytecodes_tree_height() {
1369
+ assert(
1370
+ 1 << AVM_RETRIEVED_BYTECODES_TREE_HEIGHT
1371
+ >= MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS + 1,
1372
+ );
1373
+ assert(
1374
+ 1 << (AVM_RETRIEVED_BYTECODES_TREE_HEIGHT - 1)
1375
+ < MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS + 1,
1376
+ );
1377
+ }
1378
+
1379
+ #[test]
1380
+ fn test_side_effect_masking_address() {
1381
+ assert(
1382
+ (MAX_PROTOCOL_CONTRACTS as Field).lt(SIDE_EFFECT_MASKING_ADDRESS.to_field()),
1383
+ "Side effect masking address cannot overlap with protocol contract addresses",
1384
+ );
1385
+ }
1386
+
1387
+ #[test]
1388
+ fn parity_covers_all_l1_to_l2_msgs() {
1389
+ // The largest InboxParity rung must be able to hold a full checkpoint's worth of messages.
1390
+ assert_eq(INBOX_PARITY_SIZE_LARGE, MAX_L1_TO_L2_MSGS_PER_CHECKPOINT);
1391
+ }
1392
+
1393
+ #[test]
1394
+ fn validate_global_indexes() {
1395
+ let sequence = [
1396
+ (GLOBAL_INDEX_NOTE_HASH_READ_REQUEST_OFFSET, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL),
1397
+ (GLOBAL_INDEX_NULLIFIER_READ_REQUEST_OFFSET, MAX_NULLIFIER_READ_REQUESTS_PER_CALL),
1398
+ (GLOBAL_INDEX_NOTE_HASH_OFFSET, MAX_NOTE_HASHES_PER_CALL),
1399
+ (GLOBAL_INDEX_NULLIFIER_OFFSET, MAX_NULLIFIERS_PER_CALL),
1400
+ (
1401
+ GLOBAL_INDEX_PRIVATE_CALL_REQUEST_START_OFFSET,
1402
+ MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,
1403
+ ),
1404
+ (GLOBAL_INDEX_PRIVATE_CALL_REQUEST_END_OFFSET, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL),
1405
+ (GLOBAL_INDEX_PUBLIC_CALL_REQUEST_OFFSET, MAX_ENQUEUED_CALLS_PER_CALL),
1406
+ (GLOBAL_INDEX_L2_TO_L1_MSG_OFFSET, MAX_L2_TO_L1_MSGS_PER_CALL),
1407
+ (GLOBAL_INDEX_PRIVATE_LOG_OFFSET, MAX_PRIVATE_LOGS_PER_CALL),
1408
+ (GLOBAL_INDEX_CONTRACT_CLASS_LOG_HASH_OFFSET, MAX_CONTRACT_CLASS_LOGS_PER_CALL),
1409
+ (GLOBAL_INDEX_CONTRACT_MIN_REVERTIBLE_SIDE_EFFECT_COUNTER_OFFSET, 1),
1410
+ ];
1411
+
1412
+ let mut last_offset = 0;
1413
+ for i in 0..sequence.len() {
1414
+ let (offset, count) = sequence[i];
1415
+ assert_eq(offset, last_offset);
1416
+ last_offset += count;
1417
+ }
1418
+ assert_eq(last_offset, TOTAL_COUNTED_SIDE_EFFECTS_PER_CALL);
1419
+ }
1420
+
1421
+ #[test]
1422
+ fn validate_out_hash_tree_height() {
1423
+ assert_eq(OUT_HASH_TREE_LEAF_COUNT, 1 << OUT_HASH_TREE_HEIGHT);
1424
+ assert(OUT_HASH_TREE_LEAF_COUNT >= MAX_CHECKPOINTS_PER_EPOCH);
1425
+ assert(
1426
+ MAX_CHECKPOINTS_PER_EPOCH * 2 > OUT_HASH_TREE_LEAF_COUNT,
1427
+ "We can get away with making the out hash tree smaller",
1428
+ );
1429
+ }
1430
+
1431
+ #[test]
1432
+ fn validate_empty_epoch_out_hash() {
1433
+ let empty_root = compute_empty_sha_tree_root::<OUT_HASH_TREE_HEIGHT>();
1434
+ assert_eq(empty_root, EMPTY_EPOCH_OUT_HASH);
1435
+ }
1436
+
1437
+ #[test]
1438
+ fn validate_max_eth_address_value() {
1439
+ MAX_ETH_ADDRESS_VALUE.assert_max_bit_size::<MAX_ETH_ADDRESS_BIT_SIZE>();
1440
+ }
1441
+
1442
+ #[test(should_fail_with = "call to assert_max_bit_size")]
1443
+ fn validate_max_eth_address_value_negative() {
1444
+ (MAX_ETH_ADDRESS_VALUE + 1).assert_max_bit_size::<MAX_ETH_ADDRESS_BIT_SIZE>();
1445
+ }
1446
+
1447
+ }