1use crate::types::{AztecAddress, Fr};
6
7pub mod protocol_contract_address {
9 use super::*;
10
11 pub fn fee_juice() -> AztecAddress {
13 AztecAddress(Fr::from(5u64))
14 }
15
16 pub fn public_checks() -> AztecAddress {
18 AztecAddress(Fr::from(6u64))
19 }
20
21 pub fn auth_registry() -> AztecAddress {
23 AztecAddress(Fr::from(1u64))
24 }
25
26 pub fn contract_instance_deployer() -> AztecAddress {
28 AztecAddress(Fr::from(2u64))
29 }
30
31 pub fn contract_instance_registry() -> AztecAddress {
33 contract_instance_deployer()
34 }
35
36 pub fn contract_class_registerer() -> AztecAddress {
38 AztecAddress(Fr::from(3u64))
39 }
40
41 pub fn contract_class_registry() -> AztecAddress {
43 contract_class_registerer()
44 }
45
46 pub fn multi_call_entrypoint() -> AztecAddress {
48 AztecAddress(Fr::from(4u64))
49 }
50
51 pub fn null_msg_sender() -> AztecAddress {
55 AztecAddress(
56 Fr::from_hex("0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000")
57 .expect("valid null msg sender address"),
58 )
59 }
60}
61
62pub mod domain_separator {
66 pub const AUTHWIT_INNER: u32 = 221_354_163;
70
71 pub const AUTHWIT_OUTER: u32 = 3_283_595_782;
75
76 pub const FUNCTION_ARGS: u32 = 3_576_554_347;
80
81 pub const PUBLIC_CALLDATA: u32 = 2_760_353_947;
85 pub const PRIVATE_TX_HASH: u32 = 1_971_680_439;
89 pub const PUBLIC_TX_HASH: u32 = 1_630_108_851;
93
94 pub const TX_REQUEST: u32 = 3_763_737_512;
98
99 pub const PROTOCOL_CONTRACTS: u32 = 3_904_434_327;
103
104 pub const PUBLIC_KEYS_HASH: u32 = 777_457_226;
106
107 pub const PARTIAL_ADDRESS: u32 = 2_103_633_018;
109
110 pub const CONTRACT_CLASS_ID: u32 = 3_923_495_515;
112
113 pub const PRIVATE_FUNCTION_LEAF: u32 = 1_389_398_688;
115
116 pub const PUBLIC_BYTECODE: u32 = 260_313_585;
118
119 pub const INITIALIZER: u32 = 385_396_519;
121
122 pub const CONTRACT_ADDRESS_V1: u32 = 1_788_365_517;
124
125 pub const NHK_M: u32 = 242_137_788;
129
130 pub const IVSK_M: u32 = 2_747_825_907;
134
135 pub const OVSK_M: u32 = 4_272_201_051;
139
140 pub const TSK_M: u32 = 1_546_190_975;
144
145 pub const SECRET_HASH: u32 = 4_199_652_938;
149
150 pub const MESSAGE_NULLIFIER: u32 = 3_754_509_616;
154
155 pub const SIGNATURE_PAYLOAD: u32 = 463_525_807;
159
160 pub const SILO_NOTE_HASH: u32 = 1_864_988_894;
164
165 pub const SILO_NULLIFIER: u32 = 3_956_568_061;
169
170 pub const UNIQUE_NOTE_HASH: u32 = 226_850_429;
172
173 pub const NOTE_HASH_NONCE: u32 = 1_721_808_740;
175
176 pub const SILOED_NOTE_HASH: u32 = 3_361_878_420;
178
179 pub const SILOED_NULLIFIER: u32 = 57_496_191;
181
182 pub const PRIVATE_LOG_FIRST_FIELD: u32 = 2_769_976_252;
184
185 pub const NOTE_NULLIFIER: u32 = 50_789_342;
189}
190
191pub const MAX_NOTE_HASHES_PER_TX: usize = 64;
197pub const MAX_NULLIFIERS_PER_TX: usize = 64;
199pub const MAX_PRIVATE_LOGS_PER_TX: usize = 64;
201pub const MAX_L2_TO_L1_MSGS_PER_TX: usize = 8;
203pub const MAX_ENQUEUED_CALLS_PER_TX: usize = 32;
205pub const MAX_CONTRACT_CLASS_LOGS_PER_TX: usize = 1;
207pub const CONTRACT_CLASS_LOG_SIZE_IN_FIELDS: usize = 3023;
209
210pub const MAX_NOTE_HASHES_PER_CALL: usize = 16;
213pub const MAX_NULLIFIERS_PER_CALL: usize = 16;
215pub const MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL: usize = 8;
217pub const MAX_ENQUEUED_CALLS_PER_CALL: usize = 32;
219pub const MAX_L2_TO_L1_MSGS_PER_CALL: usize = 8;
221pub const MAX_PRIVATE_LOGS_PER_CALL: usize = 16;
223pub const MAX_CONTRACT_CLASS_LOGS_PER_CALL: usize = 1;
225
226pub const MAX_NOTE_HASH_READ_REQUESTS_PER_TX: usize = 64;
229pub const MAX_NULLIFIER_READ_REQUESTS_PER_TX: usize = 64;
231pub const MAX_KEY_VALIDATION_REQUESTS_PER_TX: usize = 64;
233pub const MAX_NOTE_HASH_READ_REQUESTS_PER_CALL: usize = 16;
235pub const MAX_NULLIFIER_READ_REQUESTS_PER_CALL: usize = 16;
237pub const MAX_KEY_VALIDATION_REQUESTS_PER_CALL: usize = 16;
239
240pub const MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS: usize = 12_288;
242
243pub const PRIVATE_LOG_SIZE_IN_FIELDS: usize = 16;
246
247pub const NOTE_HASH_TREE_HEIGHT: usize = 42;
253pub const NULLIFIER_TREE_HEIGHT: usize = 42;
255pub const PUBLIC_DATA_TREE_HEIGHT: usize = 40;
257pub const L1_TO_L2_MSG_TREE_HEIGHT: usize = 36;
259pub const NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP: usize = 1024;
261pub const L1_TO_L2_MSG_SUBTREE_HEIGHT: usize = 10;
263pub const ARCHIVE_HEIGHT: usize = 30;
265pub const VK_TREE_HEIGHT: usize = 8;
267pub const MAX_PROTOCOL_CONTRACTS: usize = 11;
269
270pub fn current_vk_tree_root() -> Fr {
275 Fr::from_hex("0x1dd2644a17d1ddd8831287a78c5a1033b7ae35cdf2a3db833608856c062fc2ba")
276 .expect("valid canonical VK tree root")
277}
278
279pub const CHONK_PROOF_LENGTH: usize = 1935;
285pub const RECURSIVE_PROOF_LENGTH: usize = 449;
287
288pub const TX_DA_GAS_OVERHEAD: u64 = 96;
294pub const PUBLIC_TX_L2_GAS_OVERHEAD: u64 = 540_000;
296pub const PRIVATE_TX_L2_GAS_OVERHEAD: u64 = 440_000;
298pub const FIXED_AVM_STARTUP_L2_GAS: u64 = 20_000;
300
301pub const L2_GAS_PER_NOTE_HASH: u64 = 9_200;
303pub const L2_GAS_PER_NULLIFIER: u64 = 16_000;
305pub const L2_GAS_PER_L2_TO_L1_MSG: u64 = 5_200;
307pub const L2_GAS_PER_PRIVATE_LOG: u64 = 2_500;
309pub const L2_GAS_PER_CONTRACT_CLASS_LOG: u64 = 73_000;
311
312pub const DA_BYTES_PER_FIELD: u64 = 32;
314pub const DA_GAS_PER_BYTE: u64 = 1;
316pub const DA_GAS_PER_FIELD: u64 = 32;
318
319pub const MAX_PROCESSABLE_L2_GAS: u64 = 6_540_000;
321pub const MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT: u64 = 786_432;
323
324pub const DEFAULT_L2_GAS_LIMIT: u64 = 6_540_000;
326pub const DEFAULT_TEARDOWN_L2_GAS_LIMIT: u64 = 1_000_000;
328pub const DEFAULT_DA_GAS_LIMIT: u64 = 786_432;
330pub const DEFAULT_TEARDOWN_DA_GAS_LIMIT: u64 = 393_216;
332
333pub const MAX_TX_LIFETIME: u64 = 86_400;
335
336pub const FUNCTION_TREE_HEIGHT: usize = 7;
342
343pub const MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS: usize = 3000;
345
346pub fn contract_class_published_magic_value() -> Fr {
348 Fr::from_hex("0x20f5895a4e837356c2d551743df6bf642756dcd93cd31cbd37c556c90bf7f244")
349 .expect("valid contract class published magic value")
350}
351
352pub fn contract_instance_published_magic_value() -> Fr {
354 Fr::from_hex("0x174c6b3d0fd14728e4fc5e53f7b262ab943546a7e125e2ed5e9fde3cf0b3e22f")
355 .expect("valid contract instance published magic value")
356}
357
358pub const ARTIFACT_FUNCTION_TREE_MAX_HEIGHT: usize = 7;
360
361pub fn contract_class_registry_bytecode_capsule_slot() -> Fr {
363 Fr::from_hex("0x1f61038721b052d5389449bf44f73c817146aedfab1ef13d37f16ce928df1fb7")
364 .expect("valid contract class registry capsule slot constant")
365}
366
367#[cfg(test)]
368#[allow(clippy::expect_used)]
369mod tests {
370 use super::*;
371
372 #[test]
373 fn fee_juice_address_is_5() {
374 let addr = protocol_contract_address::fee_juice();
375 assert_eq!(addr, AztecAddress(Fr::from(5u64)));
376 }
377
378 #[test]
379 fn auth_registry_address_is_1() {
380 let addr = protocol_contract_address::auth_registry();
381 assert_eq!(addr, AztecAddress(Fr::from(1u64)));
382 }
383
384 #[test]
385 fn domain_separator_values_match_ts() {
386 assert_eq!(domain_separator::AUTHWIT_INNER, 221_354_163);
387 assert_eq!(domain_separator::AUTHWIT_OUTER, 3_283_595_782);
388 assert_eq!(domain_separator::FUNCTION_ARGS, 3_576_554_347);
389 assert_eq!(domain_separator::PUBLIC_CALLDATA, 2_760_353_947);
390 assert_eq!(domain_separator::PUBLIC_KEYS_HASH, 777_457_226);
391 assert_eq!(domain_separator::PARTIAL_ADDRESS, 2_103_633_018);
392 assert_eq!(domain_separator::CONTRACT_CLASS_ID, 3_923_495_515);
393 assert_eq!(domain_separator::PRIVATE_FUNCTION_LEAF, 1_389_398_688);
394 assert_eq!(domain_separator::PUBLIC_BYTECODE, 260_313_585);
395 assert_eq!(domain_separator::INITIALIZER, 385_396_519);
396 assert_eq!(domain_separator::CONTRACT_ADDRESS_V1, 1_788_365_517);
397 assert_eq!(domain_separator::NHK_M, 242_137_788);
399 assert_eq!(domain_separator::IVSK_M, 2_747_825_907);
400 assert_eq!(domain_separator::OVSK_M, 4_272_201_051);
401 assert_eq!(domain_separator::TSK_M, 1_546_190_975);
402 assert_eq!(domain_separator::SECRET_HASH, 4_199_652_938);
403 assert_eq!(domain_separator::SIGNATURE_PAYLOAD, 463_525_807);
404 }
405
406 #[test]
407 fn protocol_contract_addresses() {
408 assert_eq!(
409 protocol_contract_address::contract_instance_deployer(),
410 AztecAddress(Fr::from(2u64))
411 );
412 assert_eq!(
413 protocol_contract_address::contract_class_registerer(),
414 AztecAddress(Fr::from(3u64))
415 );
416 assert_eq!(
417 protocol_contract_address::multi_call_entrypoint(),
418 AztecAddress(Fr::from(4u64))
419 );
420 }
421
422 #[test]
423 fn size_constants() {
424 assert_eq!(super::FUNCTION_TREE_HEIGHT, 7);
425 assert_eq!(super::MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS, 3000);
426 assert_eq!(super::ARTIFACT_FUNCTION_TREE_MAX_HEIGHT, 7);
427 assert_eq!(super::MAX_PROCESSABLE_L2_GAS, 6_540_000);
428 }
429
430 #[test]
431 fn tx_limit_constants() {
432 assert_eq!(super::MAX_NOTE_HASHES_PER_TX, 64);
433 assert_eq!(super::MAX_NULLIFIERS_PER_TX, 64);
434 assert_eq!(super::MAX_PRIVATE_LOGS_PER_TX, 64);
435 assert_eq!(super::MAX_L2_TO_L1_MSGS_PER_TX, 8);
436 assert_eq!(super::MAX_ENQUEUED_CALLS_PER_TX, 32);
437 assert_eq!(super::MAX_CONTRACT_CLASS_LOGS_PER_TX, 1);
438 assert_eq!(super::CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, 3023);
439 assert_eq!(super::CHONK_PROOF_LENGTH, 1935);
440 }
441
442 #[test]
443 fn gas_constants() {
444 assert_eq!(super::L2_GAS_PER_NOTE_HASH, 9_200);
445 assert_eq!(super::L2_GAS_PER_NULLIFIER, 16_000);
446 assert_eq!(super::DA_GAS_PER_FIELD, 32);
447 assert_eq!(super::PRIVATE_TX_L2_GAS_OVERHEAD, 440_000);
448 assert_eq!(super::PUBLIC_TX_L2_GAS_OVERHEAD, 540_000);
449 }
450
451 #[test]
452 fn kernel_domain_separators() {
453 assert_eq!(domain_separator::UNIQUE_NOTE_HASH, 226_850_429);
454 assert_eq!(domain_separator::NOTE_HASH_NONCE, 1_721_808_740);
455 assert_eq!(domain_separator::SILOED_NOTE_HASH, 3_361_878_420);
456 assert_eq!(domain_separator::SILOED_NULLIFIER, 57_496_191);
457 assert_eq!(domain_separator::PRIVATE_LOG_FIRST_FIELD, 2_769_976_252);
458 }
459
460 #[test]
461 fn capsule_slot_constant_matches_ts() {
462 assert_eq!(
463 contract_class_registry_bytecode_capsule_slot(),
464 Fr::from_hex("0x1f61038721b052d5389449bf44f73c817146aedfab1ef13d37f16ce928df1fb7")
465 .expect("valid slot")
466 );
467 }
468}