diff --git a/crates/starknet_batcher/src/transaction_provider.rs b/crates/starknet_batcher/src/transaction_provider.rs index 6acb51854dc..d555547fb37 100644 --- a/crates/starknet_batcher/src/transaction_provider.rs +++ b/crates/starknet_batcher/src/transaction_provider.rs @@ -18,8 +18,15 @@ type TransactionProviderResult = Result; pub enum TransactionProviderError { #[error(transparent)] MempoolError(#[from] MempoolClientError), - #[error("L1Handler transaction validation failed for tx with hash {0}.")] - L1HandlerTransactionValidationFailed(TransactionHash), + #[error( + "L1Handler transaction validation failed for tx with hash {} status {:?}.", + tx_hash.0.to_hex_string(), + validation_status + )] + L1HandlerTransactionValidationFailed { + tx_hash: TransactionHash, + validation_status: L1ValidationStatus, + }, #[error(transparent)] L1ProviderError(#[from] L1ProviderClientError), } @@ -150,10 +157,10 @@ impl TransactionProvider for ValidateTransactionProvider { let l1_validation_status = self.l1_provider_client.validate(tx.tx_hash, self.height).await?; if l1_validation_status != L1ValidationStatus::Validated { - // TODO(AlonH): add the validation status into the error. - return Err(TransactionProviderError::L1HandlerTransactionValidationFailed( - tx.tx_hash, - )); + return Err(TransactionProviderError::L1HandlerTransactionValidationFailed { + tx_hash: tx.tx_hash, + validation_status: l1_validation_status, + }); } } } diff --git a/crates/starknet_batcher/src/transaction_provider_test.rs b/crates/starknet_batcher/src/transaction_provider_test.rs index e461c26834c..491dc0c7833 100644 --- a/crates/starknet_batcher/src/transaction_provider_test.rs +++ b/crates/starknet_batcher/src/transaction_provider_test.rs @@ -201,10 +201,17 @@ async fn validate_flow(mut mock_dependencies: MockDependencies) { #[rstest] #[tokio::test] -async fn validate_fails(mut mock_dependencies: MockDependencies) { +async fn validate_fails( + mut mock_dependencies: MockDependencies, + #[values( + L1ValidationStatus::AlreadyIncludedInProposedBlock, + L1ValidationStatus::AlreadyIncludedOnL2, + L1ValidationStatus::ConsumedOnL1OrUnknown + )] + expected_validation_status: L1ValidationStatus, +) { let test_tx = test_l1handler_tx(); - mock_dependencies - .expect_validate_l1handler(test_tx.clone(), L1ValidationStatus::AlreadyIncludedOnL2); + mock_dependencies.expect_validate_l1handler(test_tx.clone(), expected_validation_status); mock_dependencies .simulate_input_txs(vec![ InternalConsensusTransaction::L1Handler(test_tx), @@ -218,6 +225,7 @@ async fn validate_fails(mut mock_dependencies: MockDependencies) { let result = validate_tx_provider.get_txs(MAX_TXS_PER_FETCH).await; assert_matches!( result, - Err(TransactionProviderError::L1HandlerTransactionValidationFailed(_tx_hash)) + Err(TransactionProviderError::L1HandlerTransactionValidationFailed { validation_status, .. }) + if validation_status == expected_validation_status ); } diff --git a/crates/starknet_l1_provider_types/src/lib.rs b/crates/starknet_l1_provider_types/src/lib.rs index 07672569544..f813c16427d 100644 --- a/crates/starknet_l1_provider_types/src/lib.rs +++ b/crates/starknet_l1_provider_types/src/lib.rs @@ -21,6 +21,9 @@ pub type L1ProviderResult = Result; pub type L1ProviderClientResult = Result; pub type SharedL1ProviderClient = Arc; +// TODO(Arni): Consider splitting this enum into valid and invalid status where the invalid status +// holds the flavor of the invalidity. Propagate this change to +// [TransactionProviderError::L1HandlerTransactionValidationFailed]. #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum ValidationStatus { AlreadyIncludedInProposedBlock,