Skip to content

Commit 61b06f4

Browse files
fix(blockifier): explicit cairo0 validate failure check (#8564)
Signed-off-by: Dori Medini <dori@starkware.co>
1 parent 2ae14dc commit 61b06f4

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

crates/blockifier/src/transaction/account_transaction.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,10 @@ impl ValidatableTransaction for AccountTransaction {
942942
actual: validate_call_info.execution.retdata,
943943
});
944944
}
945+
} else if validate_call_info.execution.failed {
946+
return Err(TransactionExecutionError::ValidateCairo0Error(
947+
validate_call_info.execution.retdata,
948+
));
945949
}
946950
Ok(Some(validate_call_info))
947951
}

crates/blockifier/src/transaction/account_transactions_test.rs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,11 @@ use starknet_api::{
6464
};
6565
use starknet_types_core::felt::Felt;
6666

67-
use crate::check_tx_execution_error_for_invalid_scenario;
6867
use crate::context::{BlockContext, TransactionContext};
6968
use crate::execution::call_info::CallInfo;
7069
use crate::execution::contract_class::TrackedResource;
7170
use crate::execution::entry_point::{EntryPointExecutionContext, SierraGasRevertTracker};
71+
use crate::execution::syscalls::hint_processor::ENTRYPOINT_NOT_FOUND_ERROR;
7272
use crate::execution::syscalls::SyscallSelector;
7373
use crate::fee::fee_utils::{
7474
get_fee_by_gas_vector,
@@ -96,6 +96,7 @@ use crate::transaction::account_transaction::{
9696
AccountTransaction,
9797
ExecutionFlags as AccountExecutionFlags,
9898
};
99+
use crate::transaction::errors::TransactionExecutionError;
99100
use crate::transaction::objects::{HasRelatedFeeType, TransactionInfoCreator};
100101
use crate::transaction::test_utils::{
101102
all_resource_bounds,
@@ -119,6 +120,7 @@ use crate::transaction::test_utils::{
119120
use crate::transaction::transaction_types::TransactionType;
120121
use crate::transaction::transactions::ExecutableTransaction;
121122
use crate::utils::u64_from_usize;
123+
use crate::{check_tx_execution_error_for_invalid_scenario, retdata};
122124

123125
#[rstest]
124126
#[case::cairo1(CairoVersion::Cairo1(RunnableCairo1::Casm))]
@@ -2020,3 +2022,30 @@ fn test_call_contract_that_panics(
20202022
}
20212023
}
20222024
}
2025+
2026+
#[rstest]
2027+
fn test_missing_validate_entrypoint_rejects(
2028+
block_context: BlockContext,
2029+
default_all_resource_bounds: ValidResourceBounds,
2030+
) {
2031+
let chain_info = &block_context.chain_info;
2032+
let account = FeatureContract::AccountWithoutValidations(CairoVersion::Cairo0);
2033+
let test_contract = FeatureContract::TestContract(CairoVersion::Cairo0);
2034+
let mut state = test_state(chain_info, BALANCE, &[(account, 1u16), (test_contract, 1u16)]);
2035+
let test_contract_address = test_contract.get_instance_address(0_u16);
2036+
// Fund the test contract.
2037+
fund_account(chain_info, test_contract_address, BALANCE, &mut state.state);
2038+
// Send an invoke transaction with the test contract as the sender.
2039+
let tx_args = invoke_tx_args! {
2040+
sender_address: test_contract_address,
2041+
resource_bounds: default_all_resource_bounds
2042+
};
2043+
let result = run_invoke_tx(&mut state, &block_context, tx_args);
2044+
assert!(result.is_err());
2045+
let error = result.unwrap_err();
2046+
assert_matches!(
2047+
error,
2048+
TransactionExecutionError::ValidateCairo0Error(ret)
2049+
if ret == retdata![Felt::from_hex(ENTRYPOINT_NOT_FOUND_ERROR).unwrap()]
2050+
);
2051+
}

crates/blockifier/src/transaction/errors.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ pub enum TransactionExecutionError {
116116
storage_address: ContractAddress,
117117
selector: EntryPointSelector,
118118
},
119+
#[error("Cairo0 validate error with retdata: {0:?}")]
120+
ValidateCairo0Error(Retdata),
119121
#[error(
120122
"Invalid segment structure: PC {0} was visited, but the beginning of the segment {1} was \
121123
not."

0 commit comments

Comments
 (0)