From ea0bc05a42e9e7fc45c0964761f1947d952a1416 Mon Sep 17 00:00:00 2001 From: Dariusz Doktorski Date: Thu, 28 Aug 2025 09:28:25 +0200 Subject: [PATCH 1/3] Remove `deploy_at` cheatnet tests Closes #3659 commit-id:558e11b5 --- .../cheatcodes/deploy.rs | 73 -------- .../forge_runtime_extension/cheatcodes/mod.rs | 1 - .../forge_runtime_extension/mod.rs | 4 +- crates/cheatnet/tests/cheatcodes/deploy.rs | 172 ------------------ crates/cheatnet/tests/cheatcodes/mod.rs | 1 - crates/cheatnet/tests/common/mod.rs | 34 ---- 6 files changed, 2 insertions(+), 283 deletions(-) delete mode 100644 crates/cheatnet/src/runtime_extensions/forge_runtime_extension/cheatcodes/deploy.rs delete mode 100644 crates/cheatnet/tests/cheatcodes/deploy.rs diff --git a/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/cheatcodes/deploy.rs b/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/cheatcodes/deploy.rs deleted file mode 100644 index 0a1db2d2fc..0000000000 --- a/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/cheatcodes/deploy.rs +++ /dev/null @@ -1,73 +0,0 @@ -use crate::runtime_extensions::call_to_blockifier_runtime_extension::rpc::{ - AddressOrClassHash, CallFailure, -}; -use anyhow::Result; -use blockifier::execution::entry_point::ConstructorContext; -use blockifier::execution::syscalls::hint_processor::SyscallHintProcessor; -use runtime::EnhancedHintError; -use std::sync::Arc; - -use cairo_vm::vm::errors::hint_errors::HintError::CustomHint; -use starknet_types_core::felt::Felt; - -use crate::runtime_extensions::call_to_blockifier_runtime_extension::execution::cheated_syscalls; -use starknet_api::core::{ClassHash, ContractAddress}; -use starknet_api::transaction::fields::Calldata; - -use super::CheatcodeError; -use crate::state::CheatnetState; -use conversions::string::TryFromHexStr; -use runtime::starknet::constants::TEST_ADDRESS; - -pub fn deploy_at( - syscall_handler: &mut SyscallHintProcessor, - cheatnet_state: &mut CheatnetState, - class_hash: &ClassHash, - calldata: &[Felt], - contract_address: ContractAddress, -) -> Result<(ContractAddress, Vec), CheatcodeError> { - if let Ok(class_hash) = syscall_handler - .base - .state - .get_class_hash_at(contract_address) - && class_hash != ClassHash::default() - { - return Err(CheatcodeError::Unrecoverable(EnhancedHintError::from( - CustomHint(Box::from("Address is already taken")), - ))); - } - - let ctor_context = ConstructorContext { - class_hash: *class_hash, - code_address: Some(contract_address), - storage_address: contract_address, - caller_address: TryFromHexStr::try_from_hex_str(TEST_ADDRESS).unwrap(), - }; - - let calldata = Calldata(Arc::new(calldata.to_vec())); - - let exec_result = cheated_syscalls::execute_deployment( - syscall_handler.base.state, - cheatnet_state, - syscall_handler.base.context, - &ctor_context, - calldata, - i64::MAX as u64, - ); - cheatnet_state.increment_deploy_salt_base(); - - match exec_result { - Ok(call_info) => { - let retdata = call_info.execution.retdata.0.clone(); - syscall_handler.base.inner_calls.push(call_info); - Ok((contract_address, retdata)) - } - Err(err) => { - let call_contract_failure = CallFailure::from_execution_error( - &err, - &AddressOrClassHash::ContractAddress(contract_address), - ); - Err(CheatcodeError::from(call_contract_failure)) - } - } -} diff --git a/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/cheatcodes/mod.rs b/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/cheatcodes/mod.rs index ae5e5b87c8..16f4b6a620 100644 --- a/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/cheatcodes/mod.rs +++ b/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/cheatcodes/mod.rs @@ -10,7 +10,6 @@ pub mod cheat_caller_address; pub mod cheat_execution_info; pub mod cheat_sequencer_address; pub mod declare; -pub mod deploy; pub mod generate_random_felt; pub mod get_class_hash; pub mod l1_handler_execute; diff --git a/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs b/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs index 8a5b66db8a..24e8233f09 100644 --- a/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs +++ b/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs @@ -187,7 +187,7 @@ impl<'a> ExtensionLogic for ForgeExtension<'a> { let contract_name: String = input_reader.read::()?.to_string(); - handle_declare_deploy_result(declare(*state, &contract_name, self.contracts_data)) + handle_declare_result(declare(*state, &contract_name, self.contracts_data)) } // Internal cheatcode used to pass a contract address when calling `deploy_at`. "set_deploy_at_address" => { @@ -554,7 +554,7 @@ enum SignError { HashOutOfRange, } -fn handle_declare_deploy_result( +fn handle_declare_result( declare_result: Result, ) -> Result { let result = match declare_result { diff --git a/crates/cheatnet/tests/cheatcodes/deploy.rs b/crates/cheatnet/tests/cheatcodes/deploy.rs deleted file mode 100644 index 1e96a79e62..0000000000 --- a/crates/cheatnet/tests/cheatcodes/deploy.rs +++ /dev/null @@ -1,172 +0,0 @@ -use crate::common::assertions::{ClassHashAssert, assert_success}; -use crate::common::state::create_cached_state; -use crate::common::{call_contract, deploy_at_wrapper, deploy_contract, get_contracts}; -use cheatnet::runtime_extensions::call_to_blockifier_runtime_extension::rpc::{ - CallFailure, CallResult, -}; -use cheatnet::runtime_extensions::forge_runtime_extension::cheatcodes::declare::declare; -use cheatnet::runtime_extensions::forge_runtime_extension::cheatcodes::storage::selector_from_name; -use cheatnet::state::CheatnetState; -use conversions::IntoConv; -use starknet_api::core::ContractAddress; -use starknet_types_core::felt::Felt; - -#[test] -fn call_predefined_contract_from_proxy_contract() { - let mut cached_state = create_cached_state(); - let mut cheatnet_state = CheatnetState::default(); - - let contracts_data = get_contracts(); - - let class_hash = declare( - &mut cached_state, - "CheatCallerAddressChecker", - &contracts_data, - ) - .unwrap() - .unwrap_success(); - - let cheat_caller_address_checker_address = deploy_at_wrapper( - &mut cached_state, - &mut cheatnet_state, - &class_hash, - &[], - ContractAddress::from(1_u8), - ) - .unwrap(); - - assert_eq!( - cheat_caller_address_checker_address, - ContractAddress::from(1_u8) - ); - - let proxy_address = deploy_contract( - &mut cached_state, - &mut cheatnet_state, - "CheatCallerAddressCheckerProxy", - &[], - ); - let proxy_selector = selector_from_name("get_cheated_caller_address"); - let output = call_contract( - &mut cached_state, - &mut cheatnet_state, - &proxy_address, - proxy_selector, - &[cheat_caller_address_checker_address.into_()], - ); - - assert_success(output, &[proxy_address.into_()]); -} - -#[test] -fn deploy_contract_on_predefined_address_after_its_usage() { - let mut cached_state = create_cached_state(); - let mut cheatnet_state = CheatnetState::default(); - - let proxy_address = deploy_contract( - &mut cached_state, - &mut cheatnet_state, - "SpyEventsCheckerProxy", - &[Felt::from(121)], - ); - - let proxy_selector = selector_from_name("emit_one_event"); - let output = call_contract( - &mut cached_state, - &mut cheatnet_state, - &proxy_address, - proxy_selector, - &[Felt::from(323)], - ); - - assert!( - matches!( - output, - CallResult::Failure(CallFailure::Error { msg, .. }) - if msg.to_string().contains("Requested contract address") && msg.to_string().contains("is not deployed") - ), - "Wrong error message" - ); - - let contracts_data = get_contracts(); - - let class_hash = declare(&mut cached_state, "SpyEventsChecker", &contracts_data) - .unwrap() - .unwrap_success(); - deploy_at_wrapper( - &mut cached_state, - &mut cheatnet_state, - &class_hash, - &[], - ContractAddress::from(121_u8), - ) - .unwrap(); - - let output = call_contract( - &mut cached_state, - &mut cheatnet_state, - &proxy_address, - proxy_selector, - &[Felt::from(323)], - ); - - assert_success(output, &[]); -} - -#[test] -fn deploy_invokes_constructor() { - let mut cached_state = create_cached_state(); - let mut cheatnet_state = CheatnetState::default(); - - let contract_address = deploy_contract( - &mut cached_state, - &mut cheatnet_state, - "ConstructorSimple", - &[Felt::from(123)], - ); - - let selector = selector_from_name("get_number"); - - let output = call_contract( - &mut cached_state, - &mut cheatnet_state, - &contract_address, - selector, - &[], - ); - - assert_success(output, &[Felt::from(123)]); -} - -#[test] -fn deploy_at_invokes_constructor() { - let mut cached_state = create_cached_state(); - let mut cheatnet_state = CheatnetState::default(); - - let contracts_data = get_contracts(); - - let class_hash = declare(&mut cached_state, "ConstructorSimple", &contracts_data) - .unwrap() - .unwrap_success(); - - let contract_address = deploy_at_wrapper( - &mut cached_state, - &mut cheatnet_state, - &class_hash, - &[Felt::from(123)], - Felt::from(420).into_(), - ) - .unwrap(); - - let selector = selector_from_name("get_number"); - - let output = call_contract( - &mut cached_state, - &mut cheatnet_state, - &contract_address, - selector, - &[], - ); - - assert_success(output, &[Felt::from(123)]); -} diff --git a/crates/cheatnet/tests/cheatcodes/mod.rs b/crates/cheatnet/tests/cheatcodes/mod.rs index dd3aea0c88..bad50b1418 100644 --- a/crates/cheatnet/tests/cheatcodes/mod.rs +++ b/crates/cheatnet/tests/cheatcodes/mod.rs @@ -7,7 +7,6 @@ mod cheat_caller_address; mod cheat_execution_info; mod cheat_sequencer_address; mod declare; -mod deploy; mod generate_random_felt; mod get_class_hash; mod load; diff --git a/crates/cheatnet/tests/common/mod.rs b/crates/cheatnet/tests/common/mod.rs index 81119306ce..6fa825f66b 100644 --- a/crates/cheatnet/tests/common/mod.rs +++ b/crates/cheatnet/tests/common/mod.rs @@ -19,9 +19,7 @@ use cheatnet::runtime_extensions::call_to_blockifier_runtime_extension::rpc::{ CallFailure, CallResult, }; use cheatnet::runtime_extensions::common::create_execute_calldata; -use cheatnet::runtime_extensions::forge_runtime_extension::cheatcodes::CheatcodeError; use cheatnet::runtime_extensions::forge_runtime_extension::cheatcodes::declare::declare; -use cheatnet::runtime_extensions::forge_runtime_extension::cheatcodes::deploy::deploy_at; use cheatnet::runtime_extensions::forge_runtime_extension::contracts_data::ContractsData; use cheatnet::state::CheatnetState; use conversions::IntoConv; @@ -160,38 +158,6 @@ pub fn deploy( contract_address } -pub fn deploy_at_wrapper( - state: &mut dyn State, - cheatnet_state: &mut CheatnetState, - class_hash: &ClassHash, - calldata: &[Felt], - contract_address: ContractAddress, -) -> Result { - let mut entry_point_execution_context = build_context( - &cheatnet_state.block_info, - None, - &TrackedResource::CairoSteps, - ); - let hints = HashMap::new(); - - let mut syscall_hint_processor = build_syscall_hint_processor( - &CallEntryPoint::default(), - state, - &mut entry_point_execution_context, - &hints, - ); - - let (contract_address, _retdata) = deploy_at( - &mut syscall_hint_processor, - cheatnet_state, - class_hash, - calldata, - contract_address, - )?; - - Ok(contract_address) -} - fn deploy_helper( syscall_handler: &mut SyscallHintProcessor, cheatnet_state: &mut CheatnetState, From e48d4b207a51155ea05f16e1eb5936427f3b1a68 Mon Sep 17 00:00:00 2001 From: Dariusz Doktorski Date: Fri, 29 Aug 2025 08:46:25 +0200 Subject: [PATCH 2/3] Update comments in `integration::gas` tests commit-id:254a8b1a --- crates/forge/tests/integration/gas.rs | 155 ++++++++++++++------------ 1 file changed, 81 insertions(+), 74 deletions(-) diff --git a/crates/forge/tests/integration/gas.rs b/crates/forge/tests/integration/gas.rs index a1a59ea295..08073cbc55 100644 --- a/crates/forge/tests/integration/gas.rs +++ b/crates/forge/tests/integration/gas.rs @@ -1174,8 +1174,8 @@ fn declare_cost_is_omitted_sierra_gas() { let result = run_test_case(&test, ForgeTrackedResource::SierraGas); assert_passed(&result); - // 17980 = reported consumed sierra gas - // 0 l1_gas + 0 l1_data_gas + 17980 l2 gas + // 17_980 = reported consumed sierra gas + // 0 l1_gas + 0 l1_data_gas + 17_980 l2 gas = 17_980 total gas assert_gas( &result, "declare_cost_is_omitted", @@ -1216,14 +1216,14 @@ fn deploy_syscall_cost_sierra_gas() { // n = 1 (unique contracts updated - in this case it's the new contract address) // ( l + n * 2 ) * felt_size_in_bytes(32) = 96 (total l1 data cost) // - // 20000 = cost of 2 keccak syscall (because 2 * 100 * 100) (from constructor) + // 20_000 = cost of 2 keccak syscall (because 2 * 100 * 100) (from constructor) // -> 1 keccak syscall costs 100 cairo steps - // 147660 = cost of 1 deploy syscall (because 1 * (1132 + 8) * 100 + (7 + 1) * 4050 + 18 * 70) + // 151_970 = cost of 1 deploy syscall (because 1 * (1173 + 8) * 100 + (7 + 1) * 4050 + 21 * 70) // -> 1 deploy syscall costs 1132 cairo steps, 7 pedersen and 18 range check builtins // -> 1 calldata element costs 8 cairo steps and 1 pedersen // -> 1 pedersen costs 4050, 1 range check costs 70 - // 434734 = reported consumed sierra gas - // 0 l1_gas + 96 l1_data_gas + (20000 + 147660 + 434734) l2 gas + // 430_424 = reported consumed sierra gas + // 0 l1_gas + 96 l1_data_gas + (20_000 + 151_970 + 430_424) l2 gas assert_gas( &result, "deploy_syscall_cost", @@ -1260,10 +1260,10 @@ fn snforge_std_deploy_cost_sierra_gas() { assert_passed(&result); // 96 = gas cost of onchain data (see `deploy_syscall_cost_sierra_gas` test) - // 20000 = cost of 2 keccak syscall (see `deploy_syscall_cost_sierra_gas` test) - // 147660 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) - // 447984 = reported consumed sierra gas - // 0 l1_gas + 96 l1_data_gas + (20000 + 147660 + 447984) l2 gas + // 20_000 = cost of 2 keccak syscall (see `deploy_syscall_cost_sierra_gas` test) + // 151_970 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) + // 433_694 = reported consumed sierra gas + // 0 l1_gas + 96 l1_data_gas + (20_000 + 151_970 + 433_694) l2 gas assert_gas( &result, "deploy_cost", @@ -1275,6 +1275,7 @@ fn snforge_std_deploy_cost_sierra_gas() { ); } +// TODO(#3292): This test is incorrect because executing `keccak_u256s_le_inputs` consumes significantly more than 50_000 L2 gas. #[test] fn keccak_cost_sierra_gas() { let test = test_case!(indoc!( @@ -1289,10 +1290,10 @@ fn keccak_cost_sierra_gas() { let result = run_test_case(&test, ForgeTrackedResource::SierraGas); assert_passed(&result); - // 10000 = cost of 1 keccak syscall (1 * 100 * 100) + // 10_000 = cost of 1 keccak syscall (1 * 100 * 100) // -> 1 keccak syscall costs 100 cairo steps - // 37290 = reported consumed sierra gas - // 0 l1_gas + 0 l1_data_gas + (10000 + 37290) l2 gas + // 37_290 = reported consumed sierra gas + // 0 l1_gas + 0 l1_data_gas + (10_000 + 37_290) l2 gas assert_gas( &result, "keccak_cost", @@ -1304,6 +1305,8 @@ fn keccak_cost_sierra_gas() { ); } +// TODO(#3292): `keccak_u256s_le_inputs` has significantly higher costs than `keccak_syscall` which is not included in the calculations below. +// This is the reason why reported consumed gas is so high. #[test] fn contract_keccak_cost_sierra_gas() { let test = test_case!( @@ -1334,14 +1337,14 @@ fn contract_keccak_cost_sierra_gas() { assert_passed(&result); // 96 = gas cost of onchain data (see `deploy_syscall_cost_sierra_gas` test) - // 142810 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) - // 50000 = cost of 5 keccak syscall (5 * 100 * 100) + // 147_120 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) + // 50_000 = cost of 5 keccak syscall (5 * 100 * 100) // -> 1 keccak syscall costs 100 cairo steps - // 87650 = cost of 1 call contract syscall (because 1 * 866 * 100 + 15 * 70) + // 91_560 = cost of 1 call contract syscall (because 1 * 903 * 100 + 18 * 70) // -> 1 call contract syscall costs 866 cairo steps and 15 range check builtins // -> 1 range check costs 70 - // 1070775 = reported consumed sierra gas - // 0 l1_gas + 96 l1_data_gas + (142810 + 50000 + 87650 + 1070775) l2 gas + // 1_053_745 = reported consumed sierra gas + // 0 l1_gas + 96 l1_data_gas + (147_120 + 50_000 + 91_560 + 1_053_745) l2 gas assert_gas( &result, "contract_keccak_cost", @@ -1383,10 +1386,10 @@ fn contract_range_check_cost_sierra_gas() { assert_passed(&result); // 96 = gas cost of onchain data (see `deploy_syscall_cost_sierra_gas` test) - // 142810 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) - // 87650 = cost of 1 call contract syscall (see `contract_keccak_cost_sierra_gas` test) - // 109280 = reported consumed sierra gas - // 0 l1_gas + 96 l1_data_gas + (142810 + 87650 + 109280) l2 gas + // 147_120 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) + // 91_560 = cost of 1 call contract syscall (see `contract_keccak_cost_sierra_gas` test) + // 92_250 = reported consumed sierra gas + // 0 l1_gas + 96 l1_data_gas + (147_120 + 91_560 + 92_250) l2 gas assert_gas( &result, "contract_range_check_cost", @@ -1430,14 +1433,14 @@ fn storage_write_cost_sierra_gas() { // 96 = gas cost of onchain data (see `deploy_syscall_cost_sierra_gas` test) // 64 = storage_updates(1) * 2 * 32 // 32 = storage updates from zero value(1) * 32 (https://community.starknet.io/t/starknet-v0-13-4-pre-release-notes/115257#p-2358763-da-costs-27) - // 142810 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) - // 87650 = cost of 1 call contract syscall (see `contract_keccak_cost_sierra_gas` test) - // 10000 = cost of 1 storage write syscall (because 1 * 93 * 100 + 1 * 70 = 9370) + // 147_120 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) + // 91_560 = cost of 1 call contract syscall (see `contract_keccak_cost_sierra_gas` test) + // 10_000 = cost of 1 storage write syscall (because 1 * 96 * 100 + 1 * 70 = 9670) // -> 1 storage write syscall costs 93 cairo steps and 1 range check builtin // -> 1 range check costs 70 // -> the minimum total cost is `syscall_base_gas_cost`, which is pre-charged by the compiler (atm it is 100 * 100) - // 47100 = reported consumed sierra gas - // 0 l1_gas + (96 + 64 + 32) l1_data_gas + (142810 + 87650 + 10000 + 47100) l2 gas + // 30_070 = reported consumed sierra gas + // 0 l1_gas + (96 + 64 + 32 = 192) l1_data_gas + (147_120 + 91_560 + 10_000 + 30_070) l2 gas assert_gas( &result, "storage_write_cost", @@ -1486,16 +1489,16 @@ fn multiple_storage_writes_cost_sierra_gas() { // -> n = unique contracts updated // -> m = unique(!) values updated // 32 = storage updates from zero value(1) * 32 (https://community.starknet.io/t/starknet-v0-13-4-pre-release-notes/115257#p-2358763-da-costs-27) - // 142810 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) - // 175300 = cost of 2 call contract syscalls (because 2 * 866 * 100 + 2 * 15 * 70) + // 147_120 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) + // 183_120 = cost of 2 call contract syscalls (2 * 91_560) // -> 1 call contract syscall costs 866 cairo steps and 15 range check builtins // -> 1 range check costs 70 - // 20000 = cost of 2 storage write syscall (because 2 * 93 * 100 + 2 * 70 = 18740) + // 20_000 = cost of 2 storage write syscall (because 2 * 96 * 100 + 2 * 70 = 19340) // -> 1 storage write syscall costs 93 cairo steps and 1 range check builtin // -> 1 range check costs 70 // -> the minimum total cost is `syscall_base_gas_cost`, which is pre-charged by the compiler (atm it is 100 * 100) - // 56910 = reported consumed sierra gas - // 0 l1_gas + (64 + 64 + 32 + 32) l1_data_gas + (142810 + 175300 + 20000 + 56910) l2 gas + // 35_970 = reported consumed sierra gas + // 0 l1_gas + (64 + 64 + 32 + 32 = 192) l1_data_gas + (147_120 + 183_120 + 20_000 + 35_970) l2 gas assert_gas( &result, "multiple_storage_writes_cost", @@ -1537,15 +1540,15 @@ fn l1_message_cost_sierra_gas() { assert_passed(&result); // todo(2960): verify l2 -> l1 message cost - // 29524 = gas cost of l2 -> l1 message + // 29_524 = gas cost of l2 -> l1 message // 96 = gas cost of onchain data (see `deploy_syscall_cost_sierra_gas` test) - // 142810 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) - // 87650 = cost of 1 call contract syscall (see `contract_keccak_cost_sierra_gas` test) - // 14170 = cost of 1 SendMessageToL1 syscall (because 1 * 141 * 100 + 1 * 70 ) - // -> 1 storage write syscall costs 141 cairo steps and 1 range check builtin + // 147_120 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) + // 91_560 = cost of 1 call contract syscall (see `contract_keccak_cost_sierra_gas` test) + // 14_470 = cost of 1 SendMessageToL1 syscall (because 1 * 144 * 100 + 1 * 70 ) + // -> 1 storage write syscall costs 144 cairo steps and 1 range check builtin // -> 1 range check costs 70 - // 46760 = reported consumed sierra gas - // 29524 l1_gas + 96 l1_data_gas + (142810 + 87650 + 14170 + 46760) l2 gas + // 29_430 = reported consumed sierra gas + // 29_524 l1_gas + 96 l1_data_gas + (147_120 + 91_560 + 14_470 + 29_430) l2 gas assert_gas( &result, "l1_message_cost", @@ -1598,23 +1601,21 @@ fn l1_message_cost_for_proxy_sierra_gas() { assert_passed(&result); // todo(2960): verify l2 -> l1 message cost - // 29524 = gas cost of l2 -> l1 message + // 29_524 = gas cost of l2 -> l1 message // 128 = n(2) * 2 * 32 // 64 = l(2) * 32 // -> l = number of class hash updates // -> n = unique contracts updated - // 285620 = cost of 2 deploy syscall (because 2 * 1132 * 100 + 2 * 7 * 4050 + 2 * 18 * 70) - // -> 1 deploy syscall costs 1132 cairo steps, 7 pedersen and 18 range check builtins - // -> 1 pedersen costs 4050, 1 range check costs 70 - // 175300 = cost of 2 call contract syscalls (see `multiple_storage_writes_cost_sierra_gas` test) - // 14170 = cost of 1 SendMessageToL1 syscall (see `l1_message_cost_sierra_gas` test) - // 86000 = reported consumed sierra gas - // 29524 l1_gas + (128 + 64) l1_data_gas + (285620 + 175300 + 14170 + 86000) l2 gas + // 294_240 = cost of 2 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) + // 183_120 = cost of 2 call contract syscalls (see `multiple_storage_writes_cost_sierra_gas` test) + // 14_470 = cost of 1 SendMessageToL1 syscall (see `l1_message_cost_sierra_gas` test) + // 51_340 = reported consumed sierra gas + // 29_524 l1_gas + (128 + 64 = 192) l1_data_gas + (294_240 + 183_120 + 14_470 + 51_340) l2 gas assert_gas( &result, "l1_message_cost_for_proxy", GasVector { - l1_gas: GasAmount(29524), + l1_gas: GasAmount(29_524), l1_data_gas: GasAmount(192), l2_gas: GasAmount(543_170), }, @@ -1644,18 +1645,18 @@ fn events_cost_sierra_gas() { let result = run_test_case(&test, ForgeTrackedResource::SierraGas); assert_passed(&result); - // 512000 = 50 * 10240 + // 512_000 = 50 * 10240 // -> we emit 50 keys, each taking up 1 felt of space // -> L2 gas cost for event key is 10240 gas/felt - // 256000 = 50 * 5120 + // 256_000 = 50 * 5120 // -> we emit 50 keys, each having 1 felt of data // -> L2 gas cost for event data is 5120 gas/felt - // 10000 = cost of 1 emit event syscall (because 1 * 61 * 100 + 1 * 70 = 6170) + // 10_000 = cost of 1 emit event syscall (because 1 * 61 * 100 + 1 * 70 = 6170) // -> 1 emit event syscall costs 61 cairo steps and 1 range check builtin // -> 1 range check costs 70 // -> the minimum total cost is `syscall_base_gas_cost`, which is pre-charged by the compiler (atm it is 100 * 100) - // 137150 = reported consumed sierra gas - // 0 l1_gas + 0 l1_data_gas + (512000 + 256000 + 10000 + 137150) l2 gas + // 137_150 = reported consumed sierra gas + // 0 l1_gas + 0 l1_data_gas + (512_000 + 256_000 + 10_000 + 137_150) l2 gas assert_gas( &result, "events_cost", @@ -1695,13 +1696,13 @@ fn events_contract_cost_sierra_gas() { let result = run_test_case(&test, ForgeTrackedResource::SierraGas); assert_passed(&result); // 96 = gas cost of onchain data (see `deploy_syscall_cost_sierra_gas` test) - // 512000 = event keys cost (see `events_cost_sierra_gas` test) - // 256000 = event data cost (see `events_cost_sierra_gas` test) - // 10000 = cost of 1 emit event syscall (see `events_cost_sierra_gas` test) - // 142810 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) - // 87650 = cost of 1 call contract syscall (see `contract_keccak_cost_sierra_gas` test) - // 176840 = reported consumed sierra gas - // 0 l1_gas + 96 l1_data_gas + (512000 + 256000 + 10000 + 142810 + 87650 + 176840) l2 gas + // 512_000 = event keys cost (see `events_cost_sierra_gas` test) + // 256_000 = event data cost (see `events_cost_sierra_gas` test) + // 10_000 = cost of 1 emit event syscall (see `events_cost_sierra_gas` test) + // 147_120 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) + // 91_560 = cost of 1 call contract syscall (see `contract_keccak_cost_sierra_gas` test) + // 159_810 = reported consumed sierra gas + // 0 l1_gas + 96 l1_data_gas + (512_000 + 256_000 + 10_000 + 147_120 + 91_560 + 159_810) l2 gas assert_gas( &result, "event_emission_cost", @@ -1764,13 +1765,16 @@ fn nested_call_cost_sierra_gas() { let result = run_test_case(&test, ForgeTrackedResource::SierraGas); assert_passed(&result); - // 512000 = event keys cost (see `events_cost_sierra_gas` test) - // 256000 = event data cost (see `events_cost_sierra_gas` test) - // 10000 = cost of 1 emit event syscall (see `events_cost_sierra_gas` test) - // 142810 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) - // 87650 = cost of 1 call contract syscall (see `contract_keccak_cost_sierra_gas` test) - // 580532 = reported consumed sierra gas - // 0 l1_gas + 288 l1_data_gas + (512000 + 256000 + 10000 + 3 * 142810 + 2 * 87650 + 580532) l2 gas + // 10_240 = event keys cost (see `events_cost_sierra_gas` test) + // 5120 = event data cost (see `events_cost_sierra_gas` test) + // 10_000 = cost of 1 emit event syscall (see `events_cost_sierra_gas` test) + // 10_000 = cost of 1 keccak syscall (1 * 100 * 100) + // 10_840 = cost of 1 get block hash syscall (107 * 100 + 2 * 70) + // 441_360 = cost of 3 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) + // 274_680 = cost of 3 call contract syscall (see `contract_keccak_cost_sierra_gas` test) + // 841_295 = cost of 1 sha256_process_block_syscall syscall (1867 * 100 + 1115 * 583 + 65 * 70) + // 335_297 = reported consumed sierra gas + // 0 l1_gas + 288 l1_data_gas + (10_240 + 5120 + 10_000 + 10_000 + 10_840 + 441_360 + 274_680 + 841_295 + 335_297) l2 gas assert_gas( &result, "test_call_other_contract", @@ -1835,13 +1839,16 @@ fn nested_call_cost_in_forked_contract_sierra_gas() { let result = run_test_case(&test, ForgeTrackedResource::SierraGas); assert_passed(&result); - // 512000 = event keys cost (see `events_cost_sierra_gas` test) - // 256000 = event data cost (see `events_cost_sierra_gas` test) - // 10000 = cost of 1 emit event syscall (see `events_cost_sierra_gas` test) - // 142810 = cost of 1 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) - // 87650 = cost of 1 call contract syscall (see `contract_keccak_cost_sierra_gas` test) - // 579442 = reported consumed sierra gas - // 0 l1_gas + 192 l1_data_gas + (512000 + 256000 + 10000 + 2 * 142810 + 2 * 87650 + 579442) l2 gas + // 10_240 = event keys cost (see `events_cost_sierra_gas` test) + // 5120 = event data cost (see `events_cost_sierra_gas` test) + // 10_000 = cost of 1 emit event syscall (see `events_cost_sierra_gas` test) + // 10_000 = cost of 1 keccak syscall (1 * 100 * 100) + // 10_840 = cost of 1 get block hash syscall (107 * 100 + 2 * 70) + // 294_240 = cost of 2 deploy syscall (see `deploy_syscall_cost_sierra_gas` test) + // 274_680 = cost of 3 call contract syscall (see `contract_keccak_cost_sierra_gas` test) + // 841_295 = cost of 1 sha256_process_block_syscall syscall (1867 * 100 + 1115 * 583 + 65 * 70) + // 346_427 = reported consumed sierra gas + // 0 l1_gas + 192 l1_data_gas + (10_240 + 5120 + 10_000 + 10_000 + 10_840 + 294_240 + 274_680 + 841_295 + 346_427) l2 gas assert_gas( &result, "test_call_other_contract_fork", From b577062f438196b304b4d90c7b81ceae662ad2d1 Mon Sep 17 00:00:00 2001 From: Dariusz Doktorski Date: Fri, 29 Aug 2025 13:24:17 +0200 Subject: [PATCH 3/3] Get gas resources from `CallInfo` commit-id:7967ca03 --- .../rpc.rs | 6 +- .../forge_runtime_extension/mod.rs | 88 +++---------------- crates/forge-runner/src/gas.rs | 19 +--- crates/forge-runner/src/running.rs | 59 ++++++++----- .../forge-runner/src/running/copied_code.rs | 5 ++ crates/forge-runner/src/test_case_summary.rs | 1 + crates/forge/tests/integration/gas.rs | 37 ++++---- 7 files changed, 77 insertions(+), 138 deletions(-) diff --git a/crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/rpc.rs b/crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/rpc.rs index 304b70f007..b700b2d251 100644 --- a/crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/rpc.rs +++ b/crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/rpc.rs @@ -5,6 +5,7 @@ use crate::runtime_extensions::{ }, common::create_execute_calldata, }; +use blockifier::execution::call_info::ExecutionSummary; use blockifier::execution::{ call_info::CallInfo, entry_point::{CallType, EntryPointExecutionResult}, @@ -18,12 +19,12 @@ use blockifier::state::errors::StateError; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use conversions::{byte_array::ByteArray, serde::serialize::CairoSerialize, string::IntoHexStr}; use shared::utils::build_readable_text; +use starknet_api::core::EntryPointSelector; use starknet_api::execution_resources::GasAmount; use starknet_api::{ contract_class::EntryPointType, core::{ClassHash, ContractAddress}, }; -use starknet_api::{core::EntryPointSelector, transaction::EventContent}; use starknet_types_core::felt::Felt; #[derive(Clone, Debug, Default)] @@ -31,9 +32,8 @@ pub struct UsedResources { pub syscall_usage: SyscallUsageMap, pub execution_resources: ExecutionResources, pub gas_consumed: GasAmount, - pub l2_to_l1_payload_lengths: Vec, + pub execution_summary: ExecutionSummary, pub l1_handler_payload_lengths: Vec, - pub events: Vec, } /// Enum representing possible call execution result, along with the data diff --git a/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs b/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs index 24e8233f09..979c49594a 100644 --- a/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs +++ b/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs @@ -1,6 +1,6 @@ use self::contracts_data::ContractsData; use crate::runtime_extensions::call_to_blockifier_runtime_extension::rpc::UsedResources; -use crate::runtime_extensions::common::{get_syscalls_gas_consumed, sum_syscall_usage}; +use crate::runtime_extensions::common::sum_syscall_usage; use crate::runtime_extensions::forge_runtime_extension::cheatcodes::replace_bytecode::ReplaceBytecodeError; use crate::runtime_extensions::{ call_to_blockifier_runtime_extension::{ @@ -19,12 +19,10 @@ use crate::runtime_extensions::{ }; use crate::state::{CallTrace, CallTraceNode}; use anyhow::{Context, Result, anyhow}; -use blockifier::blockifier_versioned_constants::VersionedConstants; use blockifier::bouncer::vm_resources_to_sierra_gas; use blockifier::context::TransactionContext; -use blockifier::execution::call_info::{CallExecution, CallInfo}; +use blockifier::execution::call_info::CallInfo; use blockifier::execution::contract_class::TrackedResource; -use blockifier::execution::entry_point::CallEntryPoint; use blockifier::execution::syscalls::vm_syscall_utils::{SyscallSelector, SyscallUsageMap}; use blockifier::state::errors::StateError; use cairo_vm::vm::runners::cairo_runner::CairoRunner; @@ -32,14 +30,12 @@ use cairo_vm::vm::{ errors::hint_errors::HintError, runners::cairo_runner::ExecutionResources, vm_core::VirtualMachine, }; -use conversions::IntoConv; use conversions::byte_array::ByteArray; use conversions::felt::{ToShortString, TryInferFormat}; use conversions::serde::deserialize::BufferReader; use conversions::serde::serialize::CairoSerialize; use data_transformer::cairo_types::CairoU256; use rand::prelude::StdRng; -use runtime::starknet::constants::TEST_CONTRACT_CLASS_HASH; use runtime::{ CheatcodeHandlingResult, EnhancedHintError, ExtendedRuntime, ExtensionLogic, SyscallHandlingResult, @@ -730,15 +726,6 @@ pub fn update_top_call_vm_trace(runtime: &mut ForgeRuntime, cairo_runner: &mut C Some(get_relocated_vm_trace(cairo_runner)); } } -fn add_syscall_execution_resources( - versioned_constants: &VersionedConstants, - execution_resources: &ExecutionResources, - syscall_usage: &SyscallUsageMap, -) -> ExecutionResources { - let mut total_vm_usage = execution_resources.filter_unused_builtins(); - total_vm_usage += &versioned_constants.get_additional_os_syscall_resources(syscall_usage); - total_vm_usage -} fn add_sierra_gas_resources(top_call: &Rc>) -> u64 { let mut gas_consumed = top_call.borrow().gas_consumed; @@ -766,78 +753,23 @@ fn add_execution_resources(top_call: Rc>) -> ExecutionResourc #[must_use] pub fn get_all_used_resources( - runtime: ForgeRuntime, + call_info: &CallInfo, + trace: &Rc>, transaction_context: &TransactionContext, - tracked_resource: TrackedResource, ) -> UsedResources { - let starknet_runtime = runtime.extended_runtime.extended_runtime.extended_runtime; - let top_call_l2_to_l1_messages = starknet_runtime.hint_handler.base.l2_to_l1_messages; - let top_call_events = starknet_runtime.hint_handler.base.events; - let versioned_constants = transaction_context.block_context.versioned_constants(); - // used just to obtain payloads of L2 -> L1 messages - let runtime_call_info = CallInfo { - execution: CallExecution { - l2_to_l1_messages: top_call_l2_to_l1_messages, - events: top_call_events, - ..Default::default() - }, - call: CallEntryPoint { - class_hash: Some(Felt::from_hex(TEST_CONTRACT_CLASS_HASH).unwrap().into_()), - ..Default::default() - }, - inner_calls: starknet_runtime.hint_handler.base.inner_calls, - tracked_resource, - ..Default::default() - }; - let summary = runtime_call_info.summarize(versioned_constants); - let l2_to_l1_payload_lengths = summary.l2_to_l1_payload_lengths; - - let l1_handler_payload_lengths = - get_l1_handlers_payloads_lengths(&runtime_call_info.inner_calls); + let summary = call_info.summarize(versioned_constants); - // call representing the test code - let top_call = runtime - .extended_runtime - .extended_runtime - .extension - .cheatnet_state - .trace_data - .current_call_stack - .top(); + let l1_handler_payload_lengths = get_l1_handlers_payloads_lengths(&call_info.inner_calls); - let mut execution_resources = top_call.borrow().used_execution_resources.clone(); - let mut sierra_gas_consumed = top_call.borrow().gas_consumed; - let top_call_syscalls = top_call.borrow().get_total_used_syscalls(); - - execution_resources = add_syscall_execution_resources( - versioned_constants, - &execution_resources, - &top_call.borrow().used_syscalls_vm_resources, - ); - sierra_gas_consumed += get_syscalls_gas_consumed( - &top_call.borrow().used_syscalls_sierra_gas, - versioned_constants, - ); - - let events = runtime_call_info - .iter() // This method iterates over inner calls as well - .flat_map(|call_info| { - call_info - .execution - .events - .iter() - .map(|evt| evt.event.clone()) - }) - .collect(); + let top_call_syscalls = trace.borrow().get_total_used_syscalls(); UsedResources { - events, syscall_usage: top_call_syscalls, - execution_resources, - gas_consumed: GasAmount::from(sierra_gas_consumed), + execution_resources: call_info.resources.clone(), + gas_consumed: GasAmount::from(call_info.execution.gas_consumed), + execution_summary: summary, l1_handler_payload_lengths, - l2_to_l1_payload_lengths, } } diff --git a/crates/forge-runner/src/gas.rs b/crates/forge-runner/src/gas.rs index ad4c33ffa4..fe7c8e0668 100644 --- a/crates/forge-runner/src/gas.rs +++ b/crates/forge-runner/src/gas.rs @@ -9,13 +9,11 @@ use blockifier::fee::resources::{ use blockifier::state::cached_state::CachedState; use blockifier::state::errors::StateError; use blockifier::transaction::objects::HasRelatedFeeType; -use blockifier::utils::u64_from_usize; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use cheatnet::runtime_extensions::call_to_blockifier_runtime_extension::rpc::UsedResources; use cheatnet::runtime_extensions::forge_config_extension::config::RawAvailableResourceBoundsConfig; use cheatnet::state::ExtendedStateReader; use starknet_api::execution_resources::{GasAmount, GasVector}; -use starknet_api::transaction::EventContent; use starknet_api::transaction::fields::GasVectorComputationMode; pub fn calculate_used_gas( @@ -26,13 +24,14 @@ pub fn calculate_used_gas( let versioned_constants = transaction_context.block_context.versioned_constants(); let message_resources = get_messages_resources( - &resources.l2_to_l1_payload_lengths, + &resources.execution_summary.l2_to_l1_payload_lengths, &resources.l1_handler_payload_lengths, ); let state_resources = get_state_resources(transaction_context, state)?; - let archival_data_resources = get_archival_data_resources(resources.events); + let archival_data_resources = + get_archival_data_resources(resources.execution_summary.event_summary); let starknet_resources = StarknetResources { archival_data: archival_data_resources, @@ -63,17 +62,7 @@ pub fn calculate_used_gas( )) } -fn get_archival_data_resources(events: Vec) -> ArchivalDataResources { - // Based on from https://github.com/starkware-libs/sequencer/blob/fc0f06a07f3338ae1e11612dcaed9c59373bca37/crates/blockifier/src/execution/call_info.rs#L222 - let mut event_summary = EventSummary { - n_events: events.len(), - ..Default::default() - }; - for event in events { - event_summary.total_event_data_size += u64_from_usize(event.data.0.len()); - event_summary.total_event_keys += u64_from_usize(event.keys.len()); - } - +fn get_archival_data_resources(event_summary: EventSummary) -> ArchivalDataResources { // calldata length, signature length and code size are set to 0, because // we don't include them in estimations // ref: https://github.com/foundry-rs/starknet-foundry/blob/5ce15b029135545452588c00aae580c05eb11ca8/docs/src/testing/gas-and-resource-estimation.md?plain=1#L73 diff --git a/crates/forge-runner/src/running.rs b/crates/forge-runner/src/running.rs index 74e26dad13..a80b47e1f4 100644 --- a/crates/forge-runner/src/running.rs +++ b/crates/forge-runner/src/running.rs @@ -273,7 +273,7 @@ pub fn run_test_case( program_segment_size, ) { Ok(()) => { - let call_info = finalize_execution( + let mut call_info = finalize_execution( &mut runner, &mut forge_runtime .extended_runtime @@ -285,7 +285,12 @@ pub fn run_test_case( tracked_resource, )?; - // TODO(#3292) this can be done better, we can take gas directly from call info + // TODO: Investigate why top call gas consumed is not always aggregated from inner calls + update_top_call_gas_consumed(&mut call_info); + + // dbg!(&call_info); + + // TODO(#3292): Confirm if this is needed for the profiler let vm_resources_without_inner_calls = runner .get_execution_resources() .expect("Execution resources missing") @@ -332,34 +337,38 @@ pub fn run_test_case( .clone(); let transaction_context = get_context(&forge_runtime).tx_context.clone(); - let used_resources = - get_all_used_resources(forge_runtime, &transaction_context, tracked_resource); - let gas_used = calculate_used_gas( - &transaction_context, - &mut cached_state, - used_resources.clone(), - )?; let fork_data = cached_state .state .fork_state_reader + .as_ref() .map(|fork_state_reader| ForkData::new(&fork_state_reader.compiled_contract_class_map())) .unwrap_or_default(); Ok(match result { - Ok(result) => RunResult::Completed(Box::new(RunCompleted { - status: if result.execution.failed { - RunStatus::Panic(result.execution.retdata.0) - } else { - RunStatus::Success(result.execution.retdata.0) - }, - call_trace: call_trace_ref, - gas_used, - used_resources, - encountered_errors, - fuzzer_args, - fork_data, - })), + Ok(result) => { + let used_resources = + get_all_used_resources(&result, &call_trace_ref, &transaction_context); + let gas_used = calculate_used_gas( + &transaction_context, + &mut cached_state, + used_resources.clone(), + )?; + + RunResult::Completed(Box::new(RunCompleted { + status: if result.execution.failed { + RunStatus::Panic(result.execution.retdata.0) + } else { + RunStatus::Success(result.execution.retdata.0) + }, + call_trace: call_trace_ref, + gas_used, + used_resources, + encountered_errors, + fuzzer_args, + fork_data, + })) + } Err(error) => RunResult::Error(RunError { error: Box::new(error), call_trace: call_trace_ref, @@ -462,3 +471,9 @@ fn get_call_trace_ref(runtime: &mut ForgeRuntime) -> Rc> { .current_call_stack .top() } + +fn update_top_call_gas_consumed(call_info: &mut CallInfo) { + for call in call_info.inner_calls.clone() { + call_info.execution.gas_consumed += call.execution.gas_consumed; + } +} diff --git a/crates/forge-runner/src/running/copied_code.rs b/crates/forge-runner/src/running/copied_code.rs index 68e642ac04..000ad3bf4d 100644 --- a/crates/forge-runner/src/running/copied_code.rs +++ b/crates/forge-runner/src/running/copied_code.rs @@ -60,6 +60,11 @@ pub fn get_call_result( TrackedResource::CairoSteps => 0, TrackedResource::SierraGas => syscall_handler.base.call.initial_gas - gas, }; + + // let remaining = gas - gas_consumed; + // dbg!(remaining); + // dbg!((i64::MAX as u64) - remaining); + Ok(CallResult { failed, retdata: read_execution_retdata(runner, retdata_size, retdata_start)?, diff --git a/crates/forge-runner/src/test_case_summary.rs b/crates/forge-runner/src/test_case_summary.rs index c41a80b69f..2a8c7111f4 100644 --- a/crates/forge-runner/src/test_case_summary.rs +++ b/crates/forge-runner/src/test_case_summary.rs @@ -125,6 +125,7 @@ impl TestType for Single { } /// Summary of running a single test case +#[expect(clippy::large_enum_variant)] #[derive(Debug, Clone)] pub enum TestCaseSummary { /// Test case passed diff --git a/crates/forge/tests/integration/gas.rs b/crates/forge/tests/integration/gas.rs index 08073cbc55..acd425b70e 100644 --- a/crates/forge/tests/integration/gas.rs +++ b/crates/forge/tests/integration/gas.rs @@ -1174,15 +1174,15 @@ fn declare_cost_is_omitted_sierra_gas() { let result = run_test_case(&test, ForgeTrackedResource::SierraGas); assert_passed(&result); - // 17_980 = reported consumed sierra gas - // 0 l1_gas + 0 l1_data_gas + 17_980 l2 gas = 17_980 total gas + // 25_850 = reported consumed sierra gas + // 0 l1_gas + 0 l1_data_gas + 17_980 l2 gas = 25_850 total gas assert_gas( &result, "declare_cost_is_omitted", GasVector { l1_gas: GasAmount(0), l1_data_gas: GasAmount(0), - l2_gas: GasAmount(17980), + l2_gas: GasAmount(25_850), }, ); } @@ -1230,7 +1230,7 @@ fn deploy_syscall_cost_sierra_gas() { GasVector { l1_gas: GasAmount(0), l1_data_gas: GasAmount(96), - l2_gas: GasAmount(602_394), + l2_gas: GasAmount(1_038_298), // TODO: This is incorrect }, ); } @@ -1270,19 +1270,18 @@ fn snforge_std_deploy_cost_sierra_gas() { GasVector { l1_gas: GasAmount(0), l1_data_gas: GasAmount(96), - l2_gas: GasAmount(605_664), + l2_gas: GasAmount(1_041_568), // TODO: This is incorrect }, ); } -// TODO(#3292): This test is incorrect because executing `keccak_u256s_le_inputs` consumes significantly more than 50_000 L2 gas. #[test] fn keccak_cost_sierra_gas() { let test = test_case!(indoc!( r" #[test] fn keccak_cost() { - keccak::keccak_u256s_le_inputs(array![1].span()); + starknet::keccak_syscall(array![1].span()); } " )); @@ -1292,15 +1291,13 @@ fn keccak_cost_sierra_gas() { assert_passed(&result); // 10_000 = cost of 1 keccak syscall (1 * 100 * 100) // -> 1 keccak syscall costs 100 cairo steps - // 37_290 = reported consumed sierra gas - // 0 l1_gas + 0 l1_data_gas + (10_000 + 37_290) l2 gas assert_gas( &result, "keccak_cost", GasVector { l1_gas: GasAmount(0), l1_data_gas: GasAmount(0), - l2_gas: GasAmount(47290), + l2_gas: GasAmount(25_240), }, ); } @@ -1351,7 +1348,7 @@ fn contract_keccak_cost_sierra_gas() { GasVector { l1_gas: GasAmount(0), l1_data_gas: GasAmount(96), - l2_gas: GasAmount(1_342_425), + l2_gas: GasAmount(1_350_395), }, ); } @@ -1396,7 +1393,7 @@ fn contract_range_check_cost_sierra_gas() { GasVector { l1_gas: GasAmount(0), l1_data_gas: GasAmount(96), - l2_gas: GasAmount(330_930), + l2_gas: GasAmount(338_900), }, ); } @@ -1447,7 +1444,7 @@ fn storage_write_cost_sierra_gas() { GasVector { l1_gas: GasAmount(0), l1_data_gas: GasAmount(192), - l2_gas: GasAmount(278_750), + l2_gas: GasAmount(286_720), }, ); } @@ -1505,7 +1502,7 @@ fn multiple_storage_writes_cost_sierra_gas() { GasVector { l1_gas: GasAmount(0), l1_data_gas: GasAmount(192), - l2_gas: GasAmount(386_210), + l2_gas: GasAmount(394_160), }, ); } @@ -1555,7 +1552,7 @@ fn l1_message_cost_sierra_gas() { GasVector { l1_gas: GasAmount(29524), l1_data_gas: GasAmount(96), - l2_gas: GasAmount(282_580), + l2_gas: GasAmount(290_550), }, ); } @@ -1617,7 +1614,7 @@ fn l1_message_cost_for_proxy_sierra_gas() { GasVector { l1_gas: GasAmount(29_524), l1_data_gas: GasAmount(192), - l2_gas: GasAmount(543_170), + l2_gas: GasAmount(551_400), }, ); } @@ -1663,7 +1660,7 @@ fn events_cost_sierra_gas() { GasVector { l1_gas: GasAmount(0), l1_data_gas: GasAmount(0), - l2_gas: GasAmount(915_150), + l2_gas: GasAmount(922_880), }, ); } @@ -1709,7 +1706,7 @@ fn events_contract_cost_sierra_gas() { GasVector { l1_gas: GasAmount(0), l1_data_gas: GasAmount(96), - l2_gas: GasAmount(1_176_490), + l2_gas: GasAmount(1_184_460), }, ); } @@ -1781,7 +1778,7 @@ fn nested_call_cost_sierra_gas() { GasVector { l1_gas: GasAmount(0), l1_data_gas: GasAmount(288), - l2_gas: GasAmount(1_938_832), + l2_gas: GasAmount(1_948_352), }, ); } @@ -1855,7 +1852,7 @@ fn nested_call_cost_in_forked_contract_sierra_gas() { GasVector { l1_gas: GasAmount(0), l1_data_gas: GasAmount(192), - l2_gas: GasAmount(1_802_842), + l2_gas: GasAmount(1_812_102), }, ); }