@@ -34,7 +34,7 @@ use starknet_api::contract_class::ContractClass;
3434use starknet_types_core:: felt:: Felt ;
3535
3636use crate :: hints:: hint_implementation:: compiled_class:: utils:: create_bytecode_segment_structure;
37- use crate :: hints:: vars:: Const ;
37+ use crate :: hints:: vars:: { CairoStruct , Const } ;
3838use crate :: test_utils:: cairo_runner:: {
3939 initialize_cairo_runner,
4040 run_cairo_0_entrypoint,
@@ -44,7 +44,7 @@ use crate::test_utils::cairo_runner::{
4444 ValueArg ,
4545} ;
4646use crate :: test_utils:: utils:: DEFAULT_PRIME ;
47- use crate :: vm_utils:: LoadCairoObject ;
47+ use crate :: vm_utils:: { get_address_of_nested_fields_from_base_address , LoadCairoObject } ;
4848
4949// V1 (Poseidon) HASH CONSTS
5050/// Expected Poseidon hash for the test contract.
@@ -229,6 +229,7 @@ fn get_dummy_compiled_class(contract_segmentation: bool) -> CasmContractClass {
229229fn run_compiled_class_hash_entry_point (
230230 contract_class : & CasmContractClass ,
231231 load_full_contract : bool ,
232+ mark_contract_segments_as_accessed : bool ,
232233 hash_version : & HashVersion ,
233234) -> ( ExecutionResources , Felt ) {
234235 // Set up the entry point runner configuration.
@@ -276,6 +277,27 @@ fn run_compiled_class_hash_entry_point(
276277 // Pass the contract class base address as the function's input parameter.
277278 let contract_class_base = runner. vm . add_memory_segment ( ) ;
278279 contract_class. load_into ( & mut runner. vm , & program, contract_class_base, & constants) . unwrap ( ) ;
280+
281+ // Mark the bytecode segment as accessed if requested.
282+ if mark_contract_segments_as_accessed {
283+ // Find the bytecode segment base address.
284+ let bytecode_ptr_address = get_address_of_nested_fields_from_base_address (
285+ contract_class_base,
286+ CairoStruct :: CompiledClass ,
287+ & runner. vm ,
288+ & [ "bytecode_ptr" ] ,
289+ & program,
290+ )
291+ . unwrap ( ) ;
292+ let bytecode_ptr = runner. vm . get_relocatable ( bytecode_ptr_address) . unwrap ( ) ;
293+ // Mark as accessed.
294+ // We cannot use `mark_address_range_as_accessed` because this method cannot be called
295+ // before the run is finished.
296+ for i in 0 ..contract_class. bytecode . len ( ) {
297+ runner. vm . segments . memory . mark_as_accessed ( ( bytecode_ptr + i) . unwrap ( ) ) ;
298+ }
299+ }
300+
279301 let explicit_args = vec ! [
280302 // Compiled class
281303 EndpointArg :: Value ( ValueArg :: Single ( contract_class_base. into( ) ) ) ,
@@ -322,11 +344,13 @@ fn test_compiled_class_hash_basic(
322344 #[ case] expected_hash : & str ,
323345 #[ case] expected_n_poseidons : usize ,
324346) {
347+ let load_full_contract = false ;
348+ let mark_contract_segments_as_accessed = true ;
349+
325350 let ( resources, compiled_class_hash) = run_compiled_class_hash_entry_point (
326351 & get_dummy_compiled_class ( segmentation) ,
327- // TODO(Dori): Instead of setting load_full_contract to true, we should mark all segments
328- // as accessed.
329- true ,
352+ load_full_contract,
353+ mark_contract_segments_as_accessed,
330354 & HashVersion :: V1 ,
331355 ) ;
332356 assert_eq ! ( compiled_class_hash, Felt :: from_hex_unchecked( expected_hash) ) ;
@@ -339,6 +363,7 @@ fn test_compiled_class_hash_basic(
339363#[ rstest]
340364fn test_compiled_class_hash (
341365 #[ values( true , false ) ] load_full_contract : bool ,
366+ #[ values( true , false ) ] mark_contract_segments_as_accessed : bool ,
342367 #[ values( HashVersion :: V1 , HashVersion :: V2 ) ] hash_version : HashVersion ,
343368) {
344369 // Get the test contract class.
@@ -349,8 +374,12 @@ fn test_compiled_class_hash(
349374 _ => panic ! ( "Expected ContractClass::V1" ) ,
350375 } ;
351376 // Run the compiled class hash entry point.
352- let ( actual_execution_resources, hash_computed_by_cairo) =
353- run_compiled_class_hash_entry_point ( & contract_class, load_full_contract, & hash_version) ;
377+ let ( actual_execution_resources, hash_computed_by_cairo) = run_compiled_class_hash_entry_point (
378+ & contract_class,
379+ load_full_contract,
380+ mark_contract_segments_as_accessed,
381+ & hash_version,
382+ ) ;
354383
355384 // Format builtin usage statistics for comparison with expected values.
356385 // Filter out unused builtins (count = 0), format as "name: count", sort alphabetically,
@@ -365,17 +394,18 @@ fn test_compiled_class_hash(
365394 let actual_builtin_usage = actual_builtin_usage_parts. join ( ", " ) ;
366395
367396 // Select expected values based on whether we're loading full or partial contract.
368- let ( expected_builtin_usage, expected_n_steps) = if load_full_contract {
369- (
370- hash_version. expected_builtin_usage_full_contract ( ) ,
371- hash_version. expected_n_steps_full_contract ( ) ,
372- )
373- } else {
374- (
375- hash_version. expected_builtin_usage_partial_contract ( ) ,
376- hash_version. expected_n_steps_partial_contract ( ) ,
377- )
378- } ;
397+ let ( expected_builtin_usage, expected_n_steps) =
398+ if load_full_contract || mark_contract_segments_as_accessed {
399+ (
400+ hash_version. expected_builtin_usage_full_contract ( ) ,
401+ hash_version. expected_n_steps_full_contract ( ) ,
402+ )
403+ } else {
404+ (
405+ hash_version. expected_builtin_usage_partial_contract ( ) ,
406+ hash_version. expected_n_steps_partial_contract ( ) ,
407+ )
408+ } ;
379409
380410 expected_builtin_usage. assert_eq ( & actual_builtin_usage) ;
381411 expected_n_steps. assert_eq ( & actual_execution_resources. n_steps . to_string ( ) ) ;
@@ -445,8 +475,14 @@ fn compare_estimated_vs_actual_casm_hash_resources(
445475 hash_version : & HashVersion ,
446476) {
447477 // Run the compiled class hash entry point with full contract loading.
448- let ( actual_execution_resources, _) =
449- run_compiled_class_hash_entry_point ( & contract_class, true , hash_version) ;
478+ let load_full_contract = true ;
479+ let mark_contract_segments_as_accessed = false ;
480+ let ( actual_execution_resources, _) = run_compiled_class_hash_entry_point (
481+ & contract_class,
482+ load_full_contract,
483+ mark_contract_segments_as_accessed,
484+ hash_version,
485+ ) ;
450486
451487 let bytecode_segments = NestedFeltCounts :: new (
452488 & contract_class. get_bytecode_segment_lengths ( ) ,
0 commit comments