@@ -20,13 +20,15 @@ use crate::{
2020    sharded_block_executor:: { executor_client:: ExecutorClient ,  ShardedBlockExecutor } , 
2121    system_module_names:: * , 
2222    transaction_metadata:: TransactionMetadata , 
23-     transaction_validation,  verifier,  VMExecutor ,  VMValidator , 
23+     transaction_validation,  verifier, 
24+     verifier:: randomness:: has_randomness_attribute, 
25+     VMExecutor ,  VMValidator , 
2426} ; 
2527use  anyhow:: anyhow; 
2628use  aptos_block_executor:: txn_commit_hook:: NoOpTransactionCommitHook ; 
2729use  aptos_crypto:: HashValue ; 
2830use  aptos_framework:: { 
29-     natives:: { code:: PublishRequest ,  transaction_context :: NativeTransactionContext } , 
31+     natives:: { code:: PublishRequest ,  randomness :: RandomnessContext } , 
3032    RuntimeModuleMetadataV1 , 
3133} ; 
3234use  aptos_gas_algebra:: { Gas ,  GasQuantity ,  NumBytes ,  Octa } ; 
@@ -733,6 +735,7 @@ impl AptosVM {
733735
734736    fn  validate_and_execute_entry_function ( 
735737        & self , 
738+         resolver :  & impl  AptosMoveResolver , 
736739        session :  & mut  SessionExt , 
737740        gas_meter :  & mut  impl  AptosGasMeter , 
738741        traversal_context :  & mut  TraversalContext , 
@@ -752,26 +755,27 @@ impl AptosVM {
752755            ) ] ) ?; 
753756        } 
754757
755-         let  is_friend_or_private = session. load_function_def_is_friend_or_private ( 
758+         let  ( function ,   is_friend_or_private)  = session. load_function_and_is_friend_or_private_def ( 
756759            entry_fn. module ( ) , 
757760            entry_fn. function ( ) , 
758761            entry_fn. ty_args ( ) , 
759762        ) ?; 
760-         if  is_friend_or_private { 
763+ 
764+         if  is_friend_or_private && has_randomness_attribute ( resolver,  session,  entry_fn) ? { 
761765            let  txn_context = session
762766                . get_native_extensions ( ) 
763-                 . get_mut :: < NativeTransactionContext > ( ) ; 
764-             txn_context. set_is_friend_or_private_entry_func ( ) ; 
767+                 . get_mut :: < RandomnessContext > ( ) ; 
768+             txn_context. mark_unbiasable ( ) ; 
765769        } 
766770
767-         let  function  =
768-             session . load_function ( entry_fn . module ( ) ,  entry_fn . function ( ) ,  entry_fn . ty_args ( ) ) ? ; 
771+         let  struct_constructors_enabled  =
772+             self . features ( ) . is_enabled ( FeatureFlag :: STRUCT_CONSTRUCTORS ) ; 
769773        let  args = verifier:: transaction_arg_validation:: validate_combine_signer_and_txn_args ( 
770774            session, 
771775            senders, 
772776            entry_fn. args ( ) . to_vec ( ) , 
773777            & function, 
774-             self . features ( ) . is_enabled ( FeatureFlag :: STRUCT_CONSTRUCTORS ) , 
778+             struct_constructors_enabled , 
775779        ) ?; 
776780        session. execute_entry_function ( 
777781            entry_fn. module ( ) , 
@@ -820,6 +824,7 @@ impl AptosVM {
820824            TransactionPayload :: EntryFunction ( entry_fn)  => { 
821825                session. execute ( |session| { 
822826                    self . validate_and_execute_entry_function ( 
827+                         resolver, 
823828                        session, 
824829                        gas_meter, 
825830                        traversal_context, 
@@ -921,6 +926,7 @@ impl AptosVM {
921926                        aptos_try ! ( { 
922927                            return_on_failure!( session. execute( |session| self 
923928                                . execute_multisig_entry_function( 
929+                                     resolver, 
924930                                    session, 
925931                                    gas_meter, 
926932                                    traversal_context, 
@@ -1042,6 +1048,7 @@ impl AptosVM {
10421048            MultisigTransactionPayload :: EntryFunction ( entry_function)  => { 
10431049                session. execute ( |session| { 
10441050                    self . execute_multisig_entry_function ( 
1051+                         resolver, 
10451052                        session, 
10461053                        gas_meter, 
10471054                        traversal_context, 
@@ -1142,6 +1149,7 @@ impl AptosVM {
11421149
11431150    fn  execute_multisig_entry_function ( 
11441151        & self , 
1152+         resolver :  & impl  AptosMoveResolver , 
11451153        session :  & mut  SessionExt , 
11461154        gas_meter :  & mut  impl  AptosGasMeter , 
11471155        traversal_context :  & mut  TraversalContext , 
@@ -1152,6 +1160,7 @@ impl AptosVM {
11521160        // If txn args are not valid, we'd still consider the transaction as executed but 
11531161        // failed. This is primarily because it's unrecoverable at this point. 
11541162        self . validate_and_execute_entry_function ( 
1163+             resolver, 
11551164            session, 
11561165            gas_meter, 
11571166            traversal_context, 
0 commit comments