11use super::TestBuilder ;
22use types:: {
3- address::AztecAddress ,
3+ address ::{ AztecAddress , EthAddress } ,
44 constants ::{
55 CONTRACT_CLASS_LOG_SIZE_IN_FIELDS , DOM_SEP__IVSK_M , PRIVATE_KERNEL_TAIL_VK_INDEX ,
66 PRIVATE_LOG_SIZE_IN_FIELDS ,
77 },
88 point::Point ,
99 side_effect::Scoped ,
10- traits::Empty ,
10+ traits ::{ Empty , FromField } ,
1111};
1212
1313// --- validation_requests ---
@@ -113,6 +113,19 @@ fn empty_nullifier_as_valid_item() {
113113 let _ = builder .execute ();
114114}
115115
116+ #[test(should_fail_with = "array is not dense trimmed")]
117+ fn non_empty_nullifier_beyond_claimed_length () {
118+ let mut builder = TestBuilder ::new ();
119+
120+ builder .previous_kernel .append_nullifiers (3 );
121+ let mut array = builder .previous_kernel .nullifiers .storage ();
122+ // Add a non-empty nullifier beyond the claimed length.
123+ array [5 ] = array [1 ];
124+ builder .previous_kernel .nullifiers = BoundedVec ::from_parts_unchecked (array , 4 );
125+
126+ let _ = builder .execute ();
127+ }
128+
116129#[test(should_fail_with = "Cannot link a note hash emitted after a nullifier")]
117130fn nullifier_emitted_after_its_note_hash () {
118131 let mut builder = TestBuilder ::new ();
@@ -137,6 +150,56 @@ fn nullifiers_for_note_hashes_not_found() {
137150 let _ = builder .execute ();
138151}
139152
153+ #[test(should_fail_with = "call to assert_max_bit_size")]
154+ fn invalid_l2_to_l1_msg_recipient () {
155+ let mut builder = TestBuilder ::new ();
156+ builder .previous_kernel .append_l2_to_l1_msgs (1 );
157+ let mut l2_to_l1_msg = builder .previous_kernel .l2_to_l1_msgs .pop ();
158+ // More than 160 bits.
159+ l2_to_l1_msg .inner .inner .recipient = EthAddress ::from_field (-1 );
160+ builder .previous_kernel .l2_to_l1_msgs .push (l2_to_l1_msg );
161+ let _ = builder .execute ();
162+ }
163+
164+ #[test(should_fail_with = "array is not trimmed")]
165+ fn non_empty_l2_to_l1_msg_recipient_beyond_claimed_length () {
166+ let mut builder = TestBuilder ::new ();
167+
168+ builder .previous_kernel .append_l2_to_l1_msgs (2 );
169+ let mut array = builder .previous_kernel .l2_to_l1_msgs .storage ();
170+ // Add a non-empty recipient to an L2 to L1 message beyond the claimed length.
171+ array [5 ].inner .inner .recipient = array [0 ].innermost ().recipient ;
172+ builder .previous_kernel .l2_to_l1_msgs = BoundedVec ::from_parts_unchecked (array , 2 );
173+
174+ let _ = builder .execute ();
175+ }
176+
177+ #[test(should_fail_with = "array is not trimmed")]
178+ fn non_empty_l2_to_l1_msg_content_beyond_claimed_length () {
179+ let mut builder = TestBuilder ::new ();
180+
181+ builder .previous_kernel .append_l2_to_l1_msgs (2 );
182+ let mut array = builder .previous_kernel .l2_to_l1_msgs .storage ();
183+ // Add a non-empty content to an L2 to L1 message beyond the claimed length.
184+ array [5 ].inner .inner .content = array [0 ].innermost ().content ;
185+ builder .previous_kernel .l2_to_l1_msgs = BoundedVec ::from_parts_unchecked (array , 2 );
186+
187+ let _ = builder .execute ();
188+ }
189+
190+ #[test(should_fail_with = "array is not trimmed")]
191+ fn non_empty_l2_to_l1_msg_contract_address_beyond_claimed_length () {
192+ let mut builder = TestBuilder ::new ();
193+
194+ builder .previous_kernel .append_l2_to_l1_msgs (2 );
195+ let mut array = builder .previous_kernel .l2_to_l1_msgs .storage ();
196+ // Add a non-empty contract address to an L2 to L1 message beyond the claimed length.
197+ array [5 ].contract_address = array [0 ].contract_address ;
198+ builder .previous_kernel .l2_to_l1_msgs = BoundedVec ::from_parts_unchecked (array , 2 );
199+
200+ let _ = builder .execute ();
201+ }
202+
140203#[test(should_fail_with = "Private log length exceeds max")]
141204fn private_log_length_exceeds_max () {
142205 let mut builder = TestBuilder ::new ();
@@ -151,6 +214,43 @@ fn private_log_length_exceeds_max() {
151214 let _ = builder .execute ();
152215}
153216
217+ #[test(should_fail_with = "array is not dense")]
218+ fn empty_private_log_as_valid_item () {
219+ let mut builder = TestBuilder ::new ();
220+
221+ builder .previous_kernel .append_private_logs (2 );
222+ // Add an empty private log.
223+ builder .previous_kernel .private_logs .push (Scoped ::empty ());
224+
225+ let _ = builder .execute ();
226+ }
227+
228+ #[test(should_fail_with = "array is not trimmed")]
229+ fn non_empty_private_log_length_beyond_claimed_length () {
230+ let mut builder = TestBuilder ::new ();
231+
232+ builder .previous_kernel .append_private_logs (2 );
233+ let mut array = builder .previous_kernel .private_logs .storage ();
234+ // Add a private log with non-zero length beyond the claimed length.
235+ array [5 ].inner .inner .log .length = 1 ;
236+ builder .previous_kernel .private_logs = BoundedVec ::from_parts_unchecked (array , 2 );
237+
238+ let _ = builder .execute ();
239+ }
240+
241+ #[test(should_fail_with = "array is not trimmed")]
242+ fn non_empty_private_log_fields_beyond_claimed_length () {
243+ let mut builder = TestBuilder ::new ();
244+
245+ builder .previous_kernel .append_private_logs (2 );
246+ let mut array = builder .previous_kernel .private_logs .storage ();
247+ // Add a private log with non-empty fields beyond the claimed length.
248+ array [5 ].inner .inner .log .fields [2 ] = 1 ;
249+ builder .previous_kernel .private_logs = BoundedVec ::from_parts_unchecked (array , 2 );
250+
251+ let _ = builder .execute ();
252+ }
253+
154254#[test(should_fail_with = "Contract class log length exceeds max")]
155255fn contract_class_log_length_exceeds_max () {
156256 let mut builder = TestBuilder ::new ();
@@ -160,6 +260,52 @@ fn contract_class_log_length_exceeds_max() {
160260 let _ = builder .execute ();
161261}
162262
263+ #[test(should_fail_with = "array is not dense")]
264+ fn empty_contract_class_log_as_valid_item () {
265+ let mut builder = TestBuilder ::new ();
266+
267+ // Add an empty contract class log hash as a valid item.
268+ builder .previous_kernel .contract_class_logs_hashes .push (Scoped ::empty ());
269+
270+ let _ = builder .execute ();
271+ }
272+
273+ #[test(should_fail_with = "array is not trimmed")]
274+ fn non_empty_contract_class_log_length_beyond_claimed_length () {
275+ let mut builder = TestBuilder ::new ();
276+
277+ let mut array = builder .previous_kernel .contract_class_logs_hashes .storage ();
278+ // Add a contract class log with non-zero length beyond the claimed length.
279+ array [0 ].inner .inner .length = 1 ;
280+ builder .previous_kernel .contract_class_logs_hashes = BoundedVec ::from_parts_unchecked (array , 0 );
281+
282+ let _ = builder .execute ();
283+ }
284+
285+ #[test(should_fail_with = "array is not trimmed")]
286+ fn non_empty_contract_class_log_hash_beyond_claimed_length () {
287+ let mut builder = TestBuilder ::new ();
288+
289+ let mut array = builder .previous_kernel .contract_class_logs_hashes .storage ();
290+ // Add a contract class log with non-empty log hash value beyond the claimed length.
291+ array [0 ].inner .inner .value = 1 ;
292+ builder .previous_kernel .contract_class_logs_hashes = BoundedVec ::from_parts_unchecked (array , 0 );
293+
294+ let _ = builder .execute ();
295+ }
296+
297+ #[test(should_fail_with = "array is not trimmed")]
298+ fn non_empty_contract_class_log_contract_address_beyond_claimed_length () {
299+ let mut builder = TestBuilder ::new ();
300+
301+ let mut array = builder .previous_kernel .contract_class_logs_hashes .storage ();
302+ // Add a contract class log with non-empty contract address beyond the claimed length.
303+ array [0 ].contract_address = AztecAddress ::from_field (1 );
304+ builder .previous_kernel .contract_class_logs_hashes = BoundedVec ::from_parts_unchecked (array , 0 );
305+
306+ let _ = builder .execute ();
307+ }
308+
163309#[test(should_fail_with = "Public call stack must be empty when executing the tail circuit")]
164310fn non_empty_public_call_stack () {
165311 let mut builder = TestBuilder ::new ();
0 commit comments