diff --git a/src/core/transaction_hash/mod.rs b/src/core/transaction_hash/mod.rs index e0b176a46..d6e6be53c 100644 --- a/src/core/transaction_hash/mod.rs +++ b/src/core/transaction_hash/mod.rs @@ -1,12 +1,9 @@ use crate::{ - core::contract_address::{compute_deprecated_class_hash, compute_sierra_class_hash}, - definitions::constants::CONSTRUCTOR_ENTRY_POINT_SELECTOR, - hash_utils::compute_hash_on_elements, + core::contract_address::compute_deprecated_class_hash, + definitions::constants::CONSTRUCTOR_ENTRY_POINT_SELECTOR, hash_utils::compute_hash_on_elements, services::api::contract_classes::deprecated_contract_class::ContractClass, - syscalls::syscall_handler_errors::SyscallHandlerError, - utils::Address, + syscalls::syscall_handler_errors::SyscallHandlerError, utils::Address, }; -use cairo_lang_starknet::contract_class::ContractClass as SierraContractClass; use cairo_vm::felt::{felt_str, Felt252}; use num_traits::Zero; @@ -152,7 +149,7 @@ pub fn calculate_declare_transaction_hash( // ---------------------------- pub fn calculate_declare_v2_transaction_hash( - contract_class: &SierraContractClass, + sierra_class_hash: Felt252, compiled_class_hash: Felt252, chain_id: Felt252, sender_address: &Address, @@ -160,10 +157,7 @@ pub fn calculate_declare_v2_transaction_hash( version: Felt252, nonce: Felt252, ) -> Result { - let class_hash = compute_sierra_class_hash(contract_class) - .map_err(|_| SyscallHandlerError::FailToComputeHash)?; - - let calldata = [class_hash].to_vec(); + let calldata = [sierra_class_hash].to_vec(); let additional_data = [nonce, compiled_class_hash].to_vec(); calculate_transaction_hash_common( diff --git a/src/lib.rs b/src/lib.rs index a5e671236..89d4950cb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -193,7 +193,7 @@ mod test { use std::collections::HashMap; use std::path::PathBuf; - use crate::core::contract_address::compute_deprecated_class_hash; + use crate::core::contract_address::{compute_deprecated_class_hash, compute_sierra_class_hash}; use crate::definitions::{ block_context::StarknetChainId, constants::{ @@ -836,6 +836,8 @@ mod test { let sierra_contract_class: SierraContractClass = serde_json::from_slice(program_data).unwrap(); + let sierra_class_hash = compute_sierra_class_hash(&sierra_contract_class).unwrap(); + DeclareV2 { sender_address: TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), tx_type: TransactionType::Declare, @@ -847,6 +849,7 @@ mod test { hash_value: 0.into(), compiled_class_hash: TEST_FIB_COMPILED_CONTRACT_CLASS_HASH.clone(), sierra_contract_class, + sierra_class_hash, casm_class: Default::default(), skip_execute: false, skip_fee_transfer: false, diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index 421f28e06..d50afb62f 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -1,4 +1,5 @@ use super::{verify_version, Transaction}; +use crate::core::contract_address::compute_sierra_class_hash; use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; use crate::{ @@ -41,6 +42,7 @@ pub struct DeclareV2 { pub nonce: Felt252, pub compiled_class_hash: Felt252, pub sierra_contract_class: SierraContractClass, + pub sierra_class_hash: Felt252, pub hash_value: Felt252, pub casm_class: once_cell::unsync::OnceCell, pub skip_validate: bool, @@ -63,6 +65,7 @@ impl DeclareV2 { #[allow(clippy::too_many_arguments)] pub fn new( sierra_contract_class: &SierraContractClass, + sierra_class_hash: Option, compiled_class_hash: Felt252, chain_id: Felt252, sender_address: Address, @@ -74,10 +77,15 @@ impl DeclareV2 { ) -> Result { let validate_entry_point_selector = VALIDATE_DECLARE_ENTRY_POINT_SELECTOR.clone(); + let sierra_class_hash = match sierra_class_hash { + Some(h) => h, + None => compute_sierra_class_hash(sierra_contract_class)?, + }; + let hash_value = match hash_value { Some(hash) => hash, None => calculate_declare_v2_transaction_hash( - sierra_contract_class, + sierra_class_hash.clone(), compiled_class_hash.clone(), chain_id, &sender_address, @@ -89,6 +97,7 @@ impl DeclareV2 { let internal_declare = DeclareV2 { sierra_contract_class: sierra_contract_class.to_owned(), + sierra_class_hash, sender_address, tx_type: TransactionType::Declare, validate_entry_point_selector, @@ -259,7 +268,7 @@ impl DeclareV2 { }) .map_err(|e| TransactionError::SierraCompileError(e.to_string()))?; - state.set_compiled_class_hash(&self.hash_value, &self.compiled_class_hash)?; + state.set_compiled_class_hash(&self.sierra_class_hash, &self.compiled_class_hash)?; state.set_compiled_class(&self.compiled_class_hash, casm_class.clone())?; Ok(()) @@ -331,6 +340,7 @@ mod tests { use std::{collections::HashMap, fs::File, io::BufReader, path::PathBuf}; use super::DeclareV2; + use crate::core::contract_address::compute_sierra_class_hash; use crate::services::api::contract_classes::compiled_class::CompiledClass; use crate::state::state_api::StateReader; use crate::{ @@ -362,6 +372,7 @@ mod tests { let reader = BufReader::new(file); let sierra_contract_class: cairo_lang_starknet::contract_class::ContractClass = serde_json::from_reader(reader).unwrap(); + let sierra_class_hash = compute_sierra_class_hash(&sierra_contract_class).unwrap(); let chain_id = StarknetChainId::TestNet.to_felt(); let sender_address = Address(1.into()); @@ -370,6 +381,7 @@ mod tests { let internal_declare = DeclareV2::new( &sierra_contract_class, + Some(sierra_class_hash), Felt252::one(), chain_id, sender_address, diff --git a/tests/internals.rs b/tests/internals.rs index f349e95e6..b777b2a4d 100644 --- a/tests/internals.rs +++ b/tests/internals.rs @@ -12,6 +12,7 @@ use cairo_vm::vm::{ use lazy_static::lazy_static; use num_bigint::BigUint; use num_traits::{FromPrimitive, Num, One, Zero}; +use starknet_in_rust::core::contract_address::compute_sierra_class_hash; use starknet_in_rust::core::errors::state_errors::StateError; use starknet_in_rust::definitions::constants::{ DEFAULT_CAIRO_RESOURCE_FEE_WEIGHTS, VALIDATE_ENTRY_POINT_SELECTOR, @@ -698,6 +699,7 @@ fn declarev2_tx() -> DeclareV2 { #[cfg(feature = "cairo_1_tests")] let program_data = include_bytes!("../starknet_programs/cairo1/fibonacci.sierra"); let sierra_contract_class: SierraContractClass = serde_json::from_slice(program_data).unwrap(); + let sierra_class_hash = compute_sierra_class_hash(&sierra_contract_class).unwrap(); DeclareV2 { sender_address: TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), @@ -710,6 +712,7 @@ fn declarev2_tx() -> DeclareV2 { hash_value: 0.into(), compiled_class_hash: TEST_FIB_COMPILED_CONTRACT_CLASS_HASH.clone(), sierra_contract_class, + sierra_class_hash, casm_class: Default::default(), skip_execute: false, skip_fee_transfer: false,