1- use std:: sync:: Arc ;
2-
31use apollo_gateway_config:: config:: StatefulTransactionValidatorConfig ;
42use apollo_gateway_types:: deprecated_gateway_error:: {
53 KnownStarknetErrorCode ,
@@ -54,7 +52,17 @@ type BlockifierStatefulValidator = StatefulValidator<
5452pub trait StatefulTransactionValidatorFactoryTrait : Send + Sync {
5553 async fn instantiate_validator (
5654 & self ,
57- state_reader_factory : Arc < dyn StateReaderFactory > ,
55+ state_reader_factory : & dyn StateReaderFactory ,
56+ ) -> StatefulTransactionValidatorResult < Box < dyn StatefulTransactionValidatorTrait > > ;
57+
58+ async fn get_state_reader_for_validation (
59+ & self ,
60+ state_reader_factory : & dyn StateReaderFactory ,
61+ ) -> StatefulTransactionValidatorResult < Box < dyn GatewayStateReaderWithCompiledClasses > > ;
62+
63+ async fn create_validator_from_state_reader (
64+ & self ,
65+ state_reader : Box < dyn GatewayStateReaderWithCompiledClasses > ,
5866 ) -> StatefulTransactionValidatorResult < Box < dyn StatefulTransactionValidatorTrait > > ;
5967}
6068pub struct StatefulTransactionValidatorFactory {
@@ -68,11 +76,18 @@ impl StatefulTransactionValidatorFactoryTrait for StatefulTransactionValidatorFa
6876 // TODO(Ayelet): Move state_reader_factory and chain_info to the struct.
6977 async fn instantiate_validator (
7078 & self ,
71- state_reader_factory : Arc < dyn StateReaderFactory > ,
79+ state_reader_factory : & dyn StateReaderFactory ,
7280 ) -> StatefulTransactionValidatorResult < Box < dyn StatefulTransactionValidatorTrait > > {
73- // TODO(yael 6/5/2024): consider storing the block_info as part of the
74- // StatefulTransactionValidator and update it only once a new block is created.
75- let state_reader = state_reader_factory
81+ // Compose the split API to preserve original behavior.
82+ let state_reader = self . get_state_reader_for_validation ( state_reader_factory) . await ?;
83+ self . create_validator_from_state_reader ( state_reader) . await
84+ }
85+
86+ async fn get_state_reader_for_validation (
87+ & self ,
88+ state_reader_factory : & dyn StateReaderFactory ,
89+ ) -> StatefulTransactionValidatorResult < Box < dyn GatewayStateReaderWithCompiledClasses > > {
90+ state_reader_factory
7691 . get_state_reader_from_latest_block ( )
7792 . await
7893 . map_err ( |err| GatewaySpecError :: UnexpectedError {
@@ -83,8 +98,16 @@ impl StatefulTransactionValidatorFactoryTrait for StatefulTransactionValidatorFa
8398 "Failed to get state reader from latest block" ,
8499 e,
85100 )
86- } ) ?;
87- let latest_block_info = get_latest_block_info ( & state_reader) . await ?;
101+ } )
102+ }
103+
104+ async fn create_validator_from_state_reader (
105+ & self ,
106+ state_reader : Box < dyn GatewayStateReaderWithCompiledClasses > ,
107+ ) -> StatefulTransactionValidatorResult < Box < dyn StatefulTransactionValidatorTrait > > {
108+ // TODO(yael 6/5/2024): consider storing the block_info as part of the
109+ // StatefulTransactionValidator and update it only once a new block is created.
110+ let latest_block_info = get_latest_block_info ( state_reader. as_ref ( ) ) . await ?;
88111
89112 let state_reader_and_contract_manager = StateReaderAndContractManager {
90113 state_reader,
0 commit comments