@@ -44,6 +44,7 @@ use soroban_test_wasms::{
4444 NO_ARGUMENT_CONSTRUCTOR_TEST_CONTRACT_P22 , SIMPLE_ACCOUNT_CONTRACT , SUM_I32 ,
4545 UPDATEABLE_CONTRACT ,
4646} ;
47+ use std:: collections:: HashSet ;
4748use std:: rc:: Rc ;
4849
4950// It's tricky to get exactly the same instruction consumption
@@ -307,8 +308,15 @@ fn invoke_host_function_helper_with_restored_entries(
307308 . unwrap ( )
308309 } )
309310 . collect ( ) ;
310-
311- let module_cache = build_module_cache_for_entries ( ledger_info, ledger_entries_with_ttl) ?;
311+ let mut restored_contracts = HashSet :: new ( ) ;
312+ for restored_id in restored_entry_ids {
313+ let key = & resources. footprint . read_write [ * restored_id as usize ] ;
314+ if let LedgerKey :: ContractCode ( code) = key {
315+ restored_contracts. insert ( code. hash . clone ( ) ) ;
316+ }
317+ }
318+ let module_cache =
319+ build_module_cache_for_entries ( ledger_info, ledger_entries_with_ttl, & restored_contracts) ?;
312320
313321 let budget = Budget :: default ( ) ;
314322 budget
@@ -372,12 +380,18 @@ fn invoke_host_function_helper(
372380fn build_module_cache_for_entries (
373381 ledger_info : & LedgerInfo ,
374382 ledger_entries_with_ttl : Vec < ( LedgerEntry , Option < u32 > ) > ,
383+ restored_contracts : & HashSet < Hash > ,
375384) -> Result < ModuleCache , HostError > {
376385 let ctx = E2eTestCompilationContext :: new ( ) ?;
377386 let cache = ModuleCache :: new ( & ctx) ?;
378387 for ( e, _) in ledger_entries_with_ttl. iter ( ) {
379388 if let LedgerEntryData :: ContractCode ( cd) = & e. data {
380389 let contract_id = Hash ( sha256_hash_from_bytes_raw ( & cd. code , ctx. as_budget ( ) ) ?) ;
390+ // Restored contracts are not yet in the module cache and need to be
391+ // compiled during execution.
392+ if restored_contracts. contains ( & contract_id) {
393+ continue ;
394+ }
381395 let code_cost_inputs = match & cd. ext {
382396 ContractCodeEntryExt :: V0 => VersionedContractCodeCostInputs :: V0 {
383397 wasm_bytes : cd. code . len ( ) ,
@@ -442,7 +456,7 @@ fn invoke_host_function_using_simulation_with_signers(
442456 host_fn : & HostFunction ,
443457 source_account : & AccountId ,
444458 ledger_info : & LedgerInfo ,
445- ledger_entries_with_ttl : Vec < ( LedgerEntry , Option < u32 > ) > ,
459+ mut ledger_entries_with_ttl : Vec < ( LedgerEntry , Option < u32 > ) > ,
446460 prng_seed : & [ u8 ; 32 ] ,
447461 dummy_host : & Host ,
448462 signers : & Vec < TestSigner > ,
@@ -543,7 +557,21 @@ fn invoke_host_function_using_simulation_with_signers(
543557 * ( 1.0 + RECORDING_MODE_INSTRUCTIONS_RANGE ) )
544558 as u32 ;
545559
546- let enforcing_result = invoke_host_function_helper (
560+ let restored_live_until_ledger =
561+ ledger_info. sequence_number + ledger_info. min_persistent_entry_ttl - 1 ;
562+ for restored_id in & recording_result. restored_rw_entry_ids {
563+ let key = recording_result. resources . footprint . read_write [ * restored_id as usize ] . clone ( ) ;
564+ // Update TTL of the entry corresponding to the key
565+ if let Some ( ( _, ttl) ) = ledger_entries_with_ttl
566+ . iter_mut ( )
567+ . find ( |( le, _) | ledger_entry_to_ledger_key ( le, & Budget :: default ( ) ) . unwrap ( ) == key)
568+ {
569+ * ttl = Some ( restored_live_until_ledger) ;
570+ } else {
571+ panic ! ( "restored entry not found in the original entries" ) ;
572+ }
573+ }
574+ let enforcing_result = invoke_host_function_helper_with_restored_entries (
547575 enable_diagnostics,
548576 host_fn,
549577 & recording_result. resources ,
@@ -552,6 +580,7 @@ fn invoke_host_function_using_simulation_with_signers(
552580 ledger_info,
553581 ledger_entries_with_ttl,
554582 prng_seed,
583+ recording_result. restored_rw_entry_ids . as_slice ( ) ,
555584 ) ?;
556585
557586 assert_eq ! (
@@ -2246,26 +2275,27 @@ fn test_auto_restore_with_extension_in_recording_mode() {
22462275 & val,
22472276 ContractDataDurability :: Persistent ,
22482277 ) ;
2278+ let le_with_ttl = vec ! [
2279+ (
2280+ cd. wasm_entry. clone( ) ,
2281+ Some ( ledger_info. sequence_number - 100_000 ) ,
2282+ ) ,
2283+ (
2284+ cd. contract_entry. clone( ) ,
2285+ Some ( ledger_info. sequence_number - 1 ) ,
2286+ ) ,
2287+ (
2288+ persistent_data_entry. clone( ) ,
2289+ Some ( ledger_info. sequence_number - 10 ) ,
2290+ ) ,
2291+ ] ;
22492292 let res = invoke_host_function_recording_helper (
22502293 true ,
22512294 & host_fn,
22522295 & cd. deployer ,
22532296 RecordingInvocationAuthMode :: Recording ( true ) ,
22542297 & ledger_info,
2255- vec ! [
2256- (
2257- cd. wasm_entry. clone( ) ,
2258- Some ( ledger_info. sequence_number - 100_000 ) ,
2259- ) ,
2260- (
2261- cd. contract_entry. clone( ) ,
2262- Some ( ledger_info. sequence_number - 1 ) ,
2263- ) ,
2264- (
2265- persistent_data_entry. clone( ) ,
2266- Some ( ledger_info. sequence_number - 10 ) ,
2267- ) ,
2268- ] ,
2298+ le_with_ttl. clone ( ) ,
22692299 & prng_seed ( ) ,
22702300 None ,
22712301 )
@@ -2345,11 +2375,21 @@ fn test_auto_restore_with_extension_in_recording_mode() {
23452375 . try_into( )
23462376 . unwrap( ) ,
23472377 } ,
2348- instructions: 1027906 ,
2378+ instructions: 1562621 ,
23492379 disk_read_bytes: data_entry_size + wasm_entry_size + instance_entry_size,
23502380 write_bytes: data_entry_size + wasm_entry_size + instance_entry_size,
23512381 }
23522382 ) ;
2383+
2384+ let _ = invoke_host_function_using_simulation (
2385+ true ,
2386+ & host_fn,
2387+ & cd. deployer ,
2388+ & ledger_info,
2389+ le_with_ttl,
2390+ & prng_seed ( ) ,
2391+ )
2392+ . unwrap ( ) ;
23532393}
23542394
23552395#[ test]
@@ -2376,26 +2416,27 @@ fn test_auto_restore_with_overwrite_in_recording_mode() {
23762416 & key,
23772417 ContractDataDurability :: Persistent ,
23782418 ) ;
2419+ let le_with_ttl = vec ! [
2420+ (
2421+ cd. wasm_entry. clone( ) ,
2422+ Some ( ledger_info. sequence_number + 100_000 ) ,
2423+ ) ,
2424+ (
2425+ cd. contract_entry. clone( ) ,
2426+ Some ( ledger_info. sequence_number - 100 ) ,
2427+ ) ,
2428+ (
2429+ persistent_data_entry. clone( ) ,
2430+ Some ( ledger_info. sequence_number - 1 ) ,
2431+ ) ,
2432+ ] ;
23792433 let res = invoke_host_function_recording_helper (
23802434 true ,
23812435 & host_fn,
23822436 & cd. deployer ,
23832437 RecordingInvocationAuthMode :: Recording ( true ) ,
23842438 & ledger_info,
2385- vec ! [
2386- (
2387- cd. wasm_entry. clone( ) ,
2388- Some ( ledger_info. sequence_number + 100_000 ) ,
2389- ) ,
2390- (
2391- cd. contract_entry. clone( ) ,
2392- Some ( ledger_info. sequence_number - 100 ) ,
2393- ) ,
2394- (
2395- persistent_data_entry. clone( ) ,
2396- Some ( ledger_info. sequence_number - 1 ) ,
2397- ) ,
2398- ] ,
2439+ le_with_ttl. clone ( ) ,
23992440 & prng_seed ( ) ,
24002441 None ,
24012442 )
@@ -2477,6 +2518,16 @@ fn test_auto_restore_with_overwrite_in_recording_mode() {
24772518 write_bytes: data_entry_size + instance_entry_size,
24782519 }
24792520 ) ;
2521+
2522+ let _ = invoke_host_function_using_simulation (
2523+ true ,
2524+ & host_fn,
2525+ & cd. deployer ,
2526+ & ledger_info,
2527+ le_with_ttl,
2528+ & prng_seed ( ) ,
2529+ )
2530+ . unwrap ( ) ;
24802531}
24812532
24822533#[ test]
@@ -2594,7 +2645,7 @@ fn test_auto_restore_with_expired_temp_entry_in_recording_mode() {
25942645 . try_into( )
25952646 . unwrap( ) ,
25962647 } ,
2597- instructions: 1026761 ,
2648+ instructions: 1561476 ,
25982649 disk_read_bytes: wasm_entry_size + instance_entry_size,
25992650 write_bytes: wasm_entry_size + instance_entry_size,
26002651 }
@@ -2714,7 +2765,7 @@ fn test_auto_restore_with_recreated_temp_entry_in_recording_mode() {
27142765 read_only: vec![ cd. contract_key. clone( ) ] . try_into( ) . unwrap( ) ,
27152766 read_write: vec![ data_key, cd. wasm_key. clone( ) ] . try_into( ) . unwrap( ) ,
27162767 } ,
2717- instructions: 1028934 ,
2768+ instructions: 1563649 ,
27182769 disk_read_bytes: wasm_entry_size,
27192770 write_bytes: wasm_entry_size + temp_entry_size,
27202771 }
0 commit comments