diff --git a/crates/gateway/src/gateway.rs b/crates/gateway/src/gateway.rs index 352a80d5..1e809eb2 100644 --- a/crates/gateway/src/gateway.rs +++ b/crates/gateway/src/gateway.rs @@ -124,8 +124,9 @@ fn process_tx( }; // TODO(Yael, 19/5/2024): pass the relevant deploy_account_hash. + let blockifier_validator = stateful_tx_validator.prepare_validate(state_reader_factory)?; let tx_hash = - stateful_tx_validator.run_validate(state_reader_factory, &tx, optional_class_info, None)?; + stateful_tx_validator.run_validate(&tx, optional_class_info, None, blockifier_validator)?; // TODO(Arni): Add the Sierra and the Casm to the mempool input. Ok(MempoolInput { diff --git a/crates/gateway/src/stateful_transaction_validator.rs b/crates/gateway/src/stateful_transaction_validator.rs index c45a2887..02901b99 100644 --- a/crates/gateway/src/stateful_transaction_validator.rs +++ b/crates/gateway/src/stateful_transaction_validator.rs @@ -21,14 +21,31 @@ pub struct StatefulTransactionValidator { pub config: StatefulTransactionValidatorConfig, } +type ConcreteBlockifierStatefulValidator = + BlockifierStatefulValidator>>; + impl StatefulTransactionValidator { pub fn run_validate( &self, - state_reader_factory: &dyn StateReaderFactory, external_tx: &RPCTransaction, optional_class_info: Option, deploy_account_tx_hash: Option, + mut validator: ConcreteBlockifierStatefulValidator, ) -> StatefulTransactionValidatorResult { + let account_tx = external_tx_to_account_tx( + external_tx, + optional_class_info, + &self.config.chain_info.chain_id, + )?; + let tx_hash = get_tx_hash(&account_tx); + validator.perform_validations(account_tx, deploy_account_tx_hash)?; + Ok(tx_hash) + } + + pub fn prepare_validate( + &self, + state_reader_factory: &dyn StateReaderFactory, + ) -> StatefulTransactionValidatorResult { // TODO(yael 6/5/2024): consider storing the block_info as part of the // StatefulTransactionValidator and update it only once a new block is created. let latest_block_info = get_latest_block_info(state_reader_factory)?; @@ -52,20 +69,12 @@ impl StatefulTransactionValidator { &versioned_constants, ); - let mut validator = BlockifierStatefulValidator::create( - state, + Ok(BlockifierStatefulValidator::create( + state.into(), block_context, self.config.max_nonce_for_validation_skip, BouncerConfig::max(), - ); - let account_tx = external_tx_to_account_tx( - external_tx, - optional_class_info, - &self.config.chain_info.chain_id, - )?; - let tx_hash = get_tx_hash(&account_tx); - validator.perform_validations(account_tx, deploy_account_tx_hash)?; - Ok(tx_hash) + )) } } diff --git a/crates/gateway/src/stateful_transaction_validator_test.rs b/crates/gateway/src/stateful_transaction_validator_test.rs index 6349f8a1..1b670863 100644 --- a/crates/gateway/src/stateful_transaction_validator_test.rs +++ b/crates/gateway/src/stateful_transaction_validator_test.rs @@ -85,11 +85,9 @@ fn test_stateful_tx_validator( _ => None, }; - let result = stateful_validator.run_validate( - &state_reader_factory, - &external_tx, - optional_class_info, - None, - ); + let validator = stateful_validator.prepare_validate(&state_reader_factory).unwrap(); + + let result = + stateful_validator.run_validate(&external_tx, optional_class_info, None, validator); assert_eq!(format!("{:?}", result), format!("{:?}", expected_result)); }