From b55a95077ed13d0f1e92d4947dd232247fa7e163 Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Thu, 23 Oct 2025 16:28:17 +0200 Subject: [PATCH 01/11] Add `get_current_step` --- CHANGELOG.md | 4 ++ .../forge_config_extension.rs | 2 + .../forge_runtime_extension/mod.rs | 9 ++++ crates/runtime/src/lib.rs | 2 + .../src/starknet_commands/script/run.rs | 1 + docs/listings/testing_reference/Scarb.toml | 12 +++++ docs/listings/testing_reference/src/lib.cairo | 33 ++++++++++++ .../testing_reference/tests/tests.cairo | 30 +++++++++++ docs/src/SUMMARY.md | 2 + docs/src/appendix/snforge-library/testing.md | 7 +++ .../testing/get_current_step.md | 51 +++++++++++++++++++ snforge_std/src/lib.cairo | 2 + snforge_std/src/testing.cairo | 6 +++ 13 files changed, 161 insertions(+) create mode 100644 docs/listings/testing_reference/Scarb.toml create mode 100644 docs/listings/testing_reference/src/lib.cairo create mode 100644 docs/listings/testing_reference/tests/tests.cairo create mode 100644 docs/src/appendix/snforge-library/testing.md create mode 100644 docs/src/appendix/snforge-library/testing/get_current_step.md create mode 100644 snforge_std/src/testing.cairo diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b3d370ef7..8054d5ae15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Forge +#### Added + +- `get_current_step` function to get the current step from Cairo VM during test execution. For more see [docs]() + #### Changed - Gas values in fuzzing test output are now displayed as whole numbers without fractional parts diff --git a/crates/cheatnet/src/runtime_extensions/forge_config_extension.rs b/crates/cheatnet/src/runtime_extensions/forge_config_extension.rs index 82b139887e..92e29c8090 100644 --- a/crates/cheatnet/src/runtime_extensions/forge_config_extension.rs +++ b/crates/cheatnet/src/runtime_extensions/forge_config_extension.rs @@ -1,3 +1,4 @@ +use cairo_vm::vm::vm_core::VirtualMachine; use config::RawForgeConfig; use conversions::serde::deserialize::BufferReader; use runtime::{CheatcodeHandlingResult, EnhancedHintError, ExtensionLogic, StarknetRuntime}; @@ -17,6 +18,7 @@ impl<'a> ExtensionLogic for ForgeConfigExtension<'a> { selector: &str, mut input_reader: BufferReader<'_>, _extended_runtime: &mut Self::Runtime, + _vm: &mut VirtualMachine, ) -> Result { macro_rules! config_cheatcode { ( $prop:ident) => {{ 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 8d854afdb2..03725bd8fb 100644 --- a/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs +++ b/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs @@ -81,6 +81,7 @@ impl<'a> ExtensionLogic for ForgeExtension<'a> { selector: &str, mut input_reader: BufferReader<'_>, extended_runtime: &mut Self::Runtime, + vm: &mut VirtualMachine, ) -> Result { if let Some(oracle_selector) = self .oracle_hint_service @@ -552,6 +553,14 @@ impl<'a> ExtensionLogic for ForgeExtension<'a> { .cheat_block_hash(block_number, operation); Ok(CheatcodeHandlingResult::from_serializable(())) } + "get_current_step" => { + let current_step: u32 = vm + .get_current_step() + .try_into() + .context("Current step value exceeds u32")?; + + Ok(CheatcodeHandlingResult::from_serializable(current_step)) + } _ => Ok(CheatcodeHandlingResult::Forwarded), } } diff --git a/crates/runtime/src/lib.rs b/crates/runtime/src/lib.rs index 4cd1882906..e33f3e5f33 100644 --- a/crates/runtime/src/lib.rs +++ b/crates/runtime/src/lib.rs @@ -279,6 +279,7 @@ impl ExtendedRuntime { &selector, BufferReader::new(&inputs), &mut self.extended_runtime, + vm, ); let res = match result { @@ -423,6 +424,7 @@ pub trait ExtensionLogic { _selector: &str, _input_reader: BufferReader, _extended_runtime: &mut Self::Runtime, + _vm: &mut VirtualMachine, ) -> Result { Ok(CheatcodeHandlingResult::Forwarded) } diff --git a/crates/sncast/src/starknet_commands/script/run.rs b/crates/sncast/src/starknet_commands/script/run.rs index ea0b398ee0..a7ef749552 100644 --- a/crates/sncast/src/starknet_commands/script/run.rs +++ b/crates/sncast/src/starknet_commands/script/run.rs @@ -104,6 +104,7 @@ impl<'a> ExtensionLogic for CastScriptExtension<'a> { selector: &str, mut input_reader: BufferReader, _extended_runtime: &mut Self::Runtime, + _vm: &mut VirtualMachine, ) -> Result { match selector { "call" => { diff --git a/docs/listings/testing_reference/Scarb.toml b/docs/listings/testing_reference/Scarb.toml new file mode 100644 index 0000000000..5e79b4acf9 --- /dev/null +++ b/docs/listings/testing_reference/Scarb.toml @@ -0,0 +1,12 @@ +[package] +name = "testing_reference" +version = "0.1.0" +edition = "2024_07" + +[dependencies] +starknet = "2.12.0" + +[dev-dependencies] +snforge_std = { path = "../../../snforge_std" } + +[[target.starknet-contract]] diff --git a/docs/listings/testing_reference/src/lib.cairo b/docs/listings/testing_reference/src/lib.cairo new file mode 100644 index 0000000000..3c1a54aaaa --- /dev/null +++ b/docs/listings/testing_reference/src/lib.cairo @@ -0,0 +1,33 @@ +#[starknet::interface] +pub trait ICounter { + fn increment(ref self: TContractState); + fn decrement(ref self: TContractState); +} + +#[starknet::contract] +pub mod Counter { + use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; + + #[storage] + struct Storage { + i: felt252, + } + + #[constructor] + fn constructor(ref self: ContractState) { + self.i.write(0); + } + + #[abi(embed_v0)] + impl CounterImpl of super::ICounter { + fn increment(ref self: ContractState) { + let current_value = self.i.read(); + self.i.write(current_value + 1); + } + + fn decrement(ref self: ContractState) { + let current_value = self.i.read(); + self.i.write(current_value - 1); + } + } +} diff --git a/docs/listings/testing_reference/tests/tests.cairo b/docs/listings/testing_reference/tests/tests.cairo new file mode 100644 index 0000000000..9416e3a1ef --- /dev/null +++ b/docs/listings/testing_reference/tests/tests.cairo @@ -0,0 +1,30 @@ +use snforge_std::testing::get_current_step; +use snforge_std::{ContractClassTrait, DeclareResultTrait, declare}; +use testing_reference::{ICounterSafeDispatcher, ICounterSafeDispatcherTrait}; + +#[feature("safe_dispatcher")] +fn setup() { + // Deploy contract + let (contract_address, _) = declare("Counter") + .unwrap() + .contract_class() + .deploy(@array![]) + .unwrap(); + + let dispatcher = ICounterSafeDispatcher { contract_address }; + + // Increment counter a few times + dispatcher.increment(); + dispatcher.increment(); + dispatcher.increment(); +} + +#[test] +fn test_setup_steps() { + let steps_start = get_current_step(); + setup(); + let steps_end = get_current_step(); + + // Assert that setup used no more than 100 steps + assert!(steps_end - steps_start <= 100); +} diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index 111a8991b7..b103b57dcf 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -129,6 +129,8 @@ * [env](appendix/snforge-library/env.md) * [signature](appendix/snforge-library/signature.md) * [fuzzable](appendix/snforge-library/fuzzable.md) + * [testing](appendix/snforge-library/testing.md) + * [get_current_step](appendix/snforge-library/testing/get_current_step.md) * [`sncast` Commands](appendix/sncast.md) * [common flags](appendix/sncast/common.md) * [account](appendix/sncast/account/account.md) diff --git a/docs/src/appendix/snforge-library/testing.md b/docs/src/appendix/snforge-library/testing.md new file mode 100644 index 0000000000..9481e9e068 --- /dev/null +++ b/docs/src/appendix/snforge-library/testing.md @@ -0,0 +1,7 @@ +# `testing` Module + +Module containing functions usefule for testing. + +## Functions + +* [`get_current_step`](./testing/get_current_step.md) diff --git a/docs/src/appendix/snforge-library/testing/get_current_step.md b/docs/src/appendix/snforge-library/testing/get_current_step.md new file mode 100644 index 0000000000..ade4c9abb2 --- /dev/null +++ b/docs/src/appendix/snforge-library/testing/get_current_step.md @@ -0,0 +1,51 @@ +# `get_current_step` + +Function for getting the current step from Cairo VM during test execution. + +```rust +fn get_current_step() -> u32; +``` + +## Example + +Let's consider a simple counter contract that increments a value stored in its storage. + +```rust +{{#include ../../../../listings/testing_reference/src/lib.cairo}} +``` + +Now, let's say that we have some kind of setup function which deploys this contract and increments the counter a few times. + +```rust +{{#include ../../../../listings/testing_reference/src/tests/tests.cairo}} +``` + +With `get_current_step`, we can assert that `setup` function does not exceed a certain number of steps during its execution. This is particularly useful for performance testing and ensuring that our setup logic remains efficient. + + +Let's run the test: +```shell +$ snforge test test_setup_steps +``` + +
+Output: + +```shell +Collected 1 test(s) from testing_reference package +Running 0 test(s) from src/ +Running 1 test(s) from tests/ +[FAIL] testing_reference_integrationtest::tests::test_setup_steps + +Failure data: + "assertion failed: `steps_end - steps_start <= 100`." + +Tests: 0 passed, 1 failed, 0 ignored, 0 filtered out + +Failures: + testing_reference_integrationtest::tests::test_setup_steps +``` +
+
+ +As we can see, the test fails because the `setup` function exceeded the allowed number of steps (100 in this case). diff --git a/snforge_std/src/lib.cairo b/snforge_std/src/lib.cairo index f819af4ebb..cf10bb4d02 100644 --- a/snforge_std/src/lib.cairo +++ b/snforge_std/src/lib.cairo @@ -128,6 +128,8 @@ pub mod signature; pub mod trace; +pub mod testing; + #[doc(hidden)] pub mod _internals { pub use cheatcode::{is_config_run, save_fuzzer_arg}; diff --git a/snforge_std/src/testing.cairo b/snforge_std/src/testing.cairo new file mode 100644 index 0000000000..27b41449c6 --- /dev/null +++ b/snforge_std/src/testing.cairo @@ -0,0 +1,6 @@ +use crate::cheatcode::execute_cheatcode_and_deserialize; + +/// Gets the current step from Cairo VM during test execution +pub fn get_current_step() -> u32 { + execute_cheatcode_and_deserialize::<'get_current_step', u32>(array![].span()) +} From 8a8a80f297ab0dae426ec0046509395251386081 Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Thu, 23 Oct 2025 16:39:56 +0200 Subject: [PATCH 02/11] Minor refactor --- docs/listings/testing_reference/src/lib.cairo | 6 ------ docs/src/appendix/snforge-library/testing.md | 2 +- .../appendix/snforge-library/testing/get_current_step.md | 8 +++----- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/docs/listings/testing_reference/src/lib.cairo b/docs/listings/testing_reference/src/lib.cairo index 3c1a54aaaa..7dee15a673 100644 --- a/docs/listings/testing_reference/src/lib.cairo +++ b/docs/listings/testing_reference/src/lib.cairo @@ -1,7 +1,6 @@ #[starknet::interface] pub trait ICounter { fn increment(ref self: TContractState); - fn decrement(ref self: TContractState); } #[starknet::contract] @@ -24,10 +23,5 @@ pub mod Counter { let current_value = self.i.read(); self.i.write(current_value + 1); } - - fn decrement(ref self: ContractState) { - let current_value = self.i.read(); - self.i.write(current_value - 1); - } } } diff --git a/docs/src/appendix/snforge-library/testing.md b/docs/src/appendix/snforge-library/testing.md index 9481e9e068..11ccd1c804 100644 --- a/docs/src/appendix/snforge-library/testing.md +++ b/docs/src/appendix/snforge-library/testing.md @@ -1,6 +1,6 @@ # `testing` Module -Module containing functions usefule for testing. +Module containing functions useful for testing. ## Functions diff --git a/docs/src/appendix/snforge-library/testing/get_current_step.md b/docs/src/appendix/snforge-library/testing/get_current_step.md index ade4c9abb2..ac055fcd85 100644 --- a/docs/src/appendix/snforge-library/testing/get_current_step.md +++ b/docs/src/appendix/snforge-library/testing/get_current_step.md @@ -1,6 +1,6 @@ # `get_current_step` -Function for getting the current step from Cairo VM during test execution. +Gets the current step from Cairo VM during test execution. ```rust fn get_current_step() -> u32; @@ -14,14 +14,12 @@ Let's consider a simple counter contract that increments a value stored in its s {{#include ../../../../listings/testing_reference/src/lib.cairo}} ``` -Now, let's say that we have some kind of setup function which deploys this contract and increments the counter a few times. +Now, let's define `setup` function which deploys this contract and increments the counter a few times and assert that `setup` function does not exceed a certain number of steps during its execution. This is particularly useful for performance testing and ensuring that our setup logic remains efficient. ```rust -{{#include ../../../../listings/testing_reference/src/tests/tests.cairo}} +{{#include ../../../../listings/testing_reference/tests/tests.cairo}} ``` -With `get_current_step`, we can assert that `setup` function does not exceed a certain number of steps during its execution. This is particularly useful for performance testing and ensuring that our setup logic remains efficient. - Let's run the test: ```shell From 073c95fe32ae24762ede93699674b46439f5f779 Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Thu, 23 Oct 2025 16:45:09 +0200 Subject: [PATCH 03/11] Fix scarb formatting --- snforge_std/src/lib.cairo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snforge_std/src/lib.cairo b/snforge_std/src/lib.cairo index cf10bb4d02..7c1ff760ab 100644 --- a/snforge_std/src/lib.cairo +++ b/snforge_std/src/lib.cairo @@ -126,10 +126,10 @@ pub mod fuzzable; pub mod signature; -pub mod trace; - pub mod testing; +pub mod trace; + #[doc(hidden)] pub mod _internals { pub use cheatcode::{is_config_run, save_fuzzer_arg}; From 77dd8b9aa5291123cdaaa01d2aa90e1f0069ae88 Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Thu, 23 Oct 2025 18:45:44 +0200 Subject: [PATCH 04/11] Add test --- .../tests/integration/get_current_step.rs | 39 +++++++++++++++++++ crates/forge/tests/integration/mod.rs | 1 + 2 files changed, 40 insertions(+) create mode 100644 crates/forge/tests/integration/get_current_step.rs diff --git a/crates/forge/tests/integration/get_current_step.rs b/crates/forge/tests/integration/get_current_step.rs new file mode 100644 index 0000000000..420a1099c1 --- /dev/null +++ b/crates/forge/tests/integration/get_current_step.rs @@ -0,0 +1,39 @@ +use forge_runner::forge_config::ForgeTrackedResource; +use indoc::indoc; +use std::path::Path; +use test_utils::runner::{Contract, assert_passed}; +use test_utils::running_tests::run_test_case; +use test_utils::test_case; + +#[test] +fn test_get_current_step() { + let test = test_case!( + indoc!( + r#" + use snforge_std::testing::get_current_step; + use snforge_std::{ContractClassTrait, DeclareResultTrait, declare}; + + #[test] + fn check_current_step() { + let step_start = get_current_step(); + + let contract = declare("HelloStarknet").unwrap().contract_class().clone(); + let _ = contract.deploy(@ArrayTrait::new()).unwrap(); + + let step_end = get_current_step(); + + assert!(step_end > step_start); + } + "# + ), + Contract::from_code_path( + "HelloStarknet".to_string(), + Path::new("tests/data/contracts/hello_starknet.cairo"), + ) + .unwrap() + ); + + let result = run_test_case(&test, ForgeTrackedResource::SierraGas); + + assert_passed(&result); +} diff --git a/crates/forge/tests/integration/mod.rs b/crates/forge/tests/integration/mod.rs index f86eae4af6..afcda225b2 100644 --- a/crates/forge/tests/integration/mod.rs +++ b/crates/forge/tests/integration/mod.rs @@ -18,6 +18,7 @@ mod gas; mod generate_random_felt; mod get_available_gas; mod get_class_hash; +mod get_current_step; mod interact_with_state; mod l1_handler_executor; mod message_to_l1; From 5672903e0d3af2e26fecaee351500b2c1f66e02f Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Thu, 23 Oct 2025 18:57:05 +0200 Subject: [PATCH 05/11] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8054d5ae15..03d7acac23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 #### Added -- `get_current_step` function to get the current step from Cairo VM during test execution. For more see [docs]() +- `get_current_step` function to get the current step from Cairo VM during test execution. For more see [docs](https://foundry-rs.github.io/starknet-foundry/snforge-library/testing/get_current_step.html) #### Changed From 53494dab8d7fa579cbcd17efe1e01cbd267b8b30 Mon Sep 17 00:00:00 2001 From: Maksymilian Kowalski Date: Fri, 24 Oct 2025 16:10:20 +0200 Subject: [PATCH 06/11] Ignore cheats test of `meta_tx_v0` on `cairo-native` --- crates/forge/tests/integration/meta_tx_v0.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/forge/tests/integration/meta_tx_v0.rs b/crates/forge/tests/integration/meta_tx_v0.rs index aaa46e0782..eda42965f5 100644 --- a/crates/forge/tests/integration/meta_tx_v0.rs +++ b/crates/forge/tests/integration/meta_tx_v0.rs @@ -95,6 +95,10 @@ fn meta_tx_v0_with_cheat_caller_address() { assert_passed(&result); } +#[cfg_attr( + feature = "cairo-native", + ignore = "Cheats in `meta_tx_v0` are not supported on `cairo-native`" +)] #[test] fn meta_tx_v0_with_cheat_block_hash() { // TODO(#3704) Remove scarb version check From 5dd5177eed36554ac33a51c3882b6512c29de9ca Mon Sep 17 00:00:00 2001 From: Maksymilian Kowalski Date: Fri, 24 Oct 2025 16:10:41 +0200 Subject: [PATCH 07/11] Additional check native test --- Cargo.lock | 16 ++--- .../data/contracts/meta_tx_v0_checkers.cairo | 22 +++++++ crates/forge/tests/integration/meta_tx_v0.rs | 62 +++++++++++++++++++ 3 files changed, 92 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c1dcfb1824..26f92ad58f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -224,7 +224,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -709,7 +709,7 @@ version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -720,7 +720,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -2844,7 +2844,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -4396,7 +4396,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -4544,7 +4544,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.106", + "syn 2.0.107", "tblgen", "unindent", ] @@ -4670,7 +4670,7 @@ checksum = "b52c1b33ff98142aecea13138bd399b68aa7ab5d9546c300988c345004001eea" [[package]] name = "native-api" -version = "0.50.0" +version = "0.51.1" dependencies = [ "cairo-lang-starknet-classes", "cairo-native", @@ -5381,7 +5381,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] diff --git a/crates/forge/tests/data/contracts/meta_tx_v0_checkers.cairo b/crates/forge/tests/data/contracts/meta_tx_v0_checkers.cairo index b45f83866f..244c3266b1 100644 --- a/crates/forge/tests/data/contracts/meta_tx_v0_checkers.cairo +++ b/crates/forge/tests/data/contracts/meta_tx_v0_checkers.cairo @@ -55,3 +55,25 @@ mod CheatBlockHashCheckerMetaTxV0 { } } } + +#[starknet::interface] +trait ISimpleCheckerMetaTxV0 { + fn __execute__(ref self: TContractState) -> felt252; +} + +#[starknet::contract(account)] +mod SimpleCheckerMetaTxV0 { + use starknet::SyscallResultTrait; + use starknet::syscalls::get_block_hash_syscall; + + #[storage] + struct Storage {} + + #[abi(embed_v0)] + impl ISimpleCheckerMetaTxV0 of super::ISimpleCheckerMetaTxV0 { + fn __execute__(ref self: ContractState) -> felt252 { + 1234567890.into() + } + } +} + diff --git a/crates/forge/tests/integration/meta_tx_v0.rs b/crates/forge/tests/integration/meta_tx_v0.rs index eda42965f5..6c3bf49d42 100644 --- a/crates/forge/tests/integration/meta_tx_v0.rs +++ b/crates/forge/tests/integration/meta_tx_v0.rs @@ -21,6 +21,68 @@ fn skip_scarb_lt_2_11_0() -> bool { } } +#[cfg(feature = "cairo-native")] +#[test] +fn check_meta_tx_v0_syscall_work_on_native() { + // TODO(#3704) Remove scarb version check + if skip_scarb_lt_2_11_0() { + return; + } + + let test = test_case!( + indoc!( + r#" + use result::ResultTrait; + use array::ArrayTrait; + use option::OptionTrait; + use traits::TryInto; + use starknet::ContractAddress; + use snforge_std::{ + declare, ContractClassTrait, DeclareResultTrait + }; + + #[starknet::interface] + trait IMetaTxV0Test { + fn execute_meta_tx_v0( + ref self: TContractState, + target: starknet::ContractAddress, + signature: Span, + ) -> felt252; + } + + #[test] + fn test_meta_tx_v0_verify_tx_context_modification() { + let checker_contract = declare("SimpleCheckerMetaTxV0").unwrap().contract_class(); + let (checker_address, _) = checker_contract.deploy(@ArrayTrait::new()).unwrap(); + + let meta_contract = declare("MetaTxV0Test").unwrap().contract_class(); + let (meta_address, _) = meta_contract.deploy(@ArrayTrait::new()).unwrap(); + let meta_dispatcher = IMetaTxV0TestDispatcher { contract_address: meta_address }; + + let mut signature = ArrayTrait::new(); + + let result = meta_dispatcher.execute_meta_tx_v0(checker_address, signature.span()); + + assert(result == 1234567890, 'Result should be 1234567890'); + } + "# + ), + Contract::from_code_path( + "SimpleCheckerMetaTxV0".to_string(), + Path::new("tests/data/contracts/meta_tx_v0_checkers.cairo"), + ) + .unwrap(), + Contract::from_code_path( + "MetaTxV0Test".to_string(), + Path::new("tests/data/contracts/meta_tx_v0_test.cairo"), + ) + .unwrap() + ); + + let result = run_test_case(&test, ForgeTrackedResource::SierraGas); + assert_passed(&result); +} + #[test] fn meta_tx_v0_with_cheat_caller_address() { // TODO(#3704) Remove scarb version check From ab287a44af84b29336f765b61a8ca7150c915b99 Mon Sep 17 00:00:00 2001 From: Maksymilian Kowalski Date: Fri, 24 Oct 2025 16:45:39 +0200 Subject: [PATCH 08/11] Enable test on vm --- crates/forge/tests/integration/meta_tx_v0.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/forge/tests/integration/meta_tx_v0.rs b/crates/forge/tests/integration/meta_tx_v0.rs index 6c3bf49d42..b1469d5721 100644 --- a/crates/forge/tests/integration/meta_tx_v0.rs +++ b/crates/forge/tests/integration/meta_tx_v0.rs @@ -21,9 +21,8 @@ fn skip_scarb_lt_2_11_0() -> bool { } } -#[cfg(feature = "cairo-native")] #[test] -fn check_meta_tx_v0_syscall_work_on_native() { +fn check_meta_tx_v0_syscall_work_without_cheats() { // TODO(#3704) Remove scarb version check if skip_scarb_lt_2_11_0() { return; From feed6d5317fd18375b6068c5937d8b6b87fbc1ac Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Tue, 28 Oct 2025 08:57:20 +0100 Subject: [PATCH 09/11] Apply code review suggestions --- .../runtime_extensions/forge_config_extension.rs | 2 +- .../forge_runtime_extension/mod.rs | 13 ++++--------- crates/runtime/src/lib.rs | 2 +- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/crates/cheatnet/src/runtime_extensions/forge_config_extension.rs b/crates/cheatnet/src/runtime_extensions/forge_config_extension.rs index 92e29c8090..2a7b0890b6 100644 --- a/crates/cheatnet/src/runtime_extensions/forge_config_extension.rs +++ b/crates/cheatnet/src/runtime_extensions/forge_config_extension.rs @@ -18,7 +18,7 @@ impl<'a> ExtensionLogic for ForgeConfigExtension<'a> { selector: &str, mut input_reader: BufferReader<'_>, _extended_runtime: &mut Self::Runtime, - _vm: &mut VirtualMachine, + _vm: &VirtualMachine, ) -> Result { macro_rules! config_cheatcode { ( $prop:ident) => {{ 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 03725bd8fb..d2577acf39 100644 --- a/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs +++ b/crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs @@ -81,7 +81,7 @@ impl<'a> ExtensionLogic for ForgeExtension<'a> { selector: &str, mut input_reader: BufferReader<'_>, extended_runtime: &mut Self::Runtime, - vm: &mut VirtualMachine, + vm: &VirtualMachine, ) -> Result { if let Some(oracle_selector) = self .oracle_hint_service @@ -553,14 +553,9 @@ impl<'a> ExtensionLogic for ForgeExtension<'a> { .cheat_block_hash(block_number, operation); Ok(CheatcodeHandlingResult::from_serializable(())) } - "get_current_step" => { - let current_step: u32 = vm - .get_current_step() - .try_into() - .context("Current step value exceeds u32")?; - - Ok(CheatcodeHandlingResult::from_serializable(current_step)) - } + "get_current_step" => Ok(CheatcodeHandlingResult::from_serializable( + vm.get_current_step(), + )), _ => Ok(CheatcodeHandlingResult::Forwarded), } } diff --git a/crates/runtime/src/lib.rs b/crates/runtime/src/lib.rs index e33f3e5f33..fb89e2343e 100644 --- a/crates/runtime/src/lib.rs +++ b/crates/runtime/src/lib.rs @@ -424,7 +424,7 @@ pub trait ExtensionLogic { _selector: &str, _input_reader: BufferReader, _extended_runtime: &mut Self::Runtime, - _vm: &mut VirtualMachine, + _vm: &VirtualMachine, ) -> Result { Ok(CheatcodeHandlingResult::Forwarded) } From 2afa790067f1a658b404a09fc4432d09d5d47af3 Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Tue, 28 Oct 2025 08:58:06 +0100 Subject: [PATCH 10/11] Fix linting --- crates/sncast/src/starknet_commands/script/run.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/sncast/src/starknet_commands/script/run.rs b/crates/sncast/src/starknet_commands/script/run.rs index a7ef749552..b9baeda866 100644 --- a/crates/sncast/src/starknet_commands/script/run.rs +++ b/crates/sncast/src/starknet_commands/script/run.rs @@ -104,7 +104,7 @@ impl<'a> ExtensionLogic for CastScriptExtension<'a> { selector: &str, mut input_reader: BufferReader, _extended_runtime: &mut Self::Runtime, - _vm: &mut VirtualMachine, + _vm: &VirtualMachine, ) -> Result { match selector { "call" => { From 30d1404303ccd4a0ed22dbc3611d61292cbb1a06 Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Tue, 28 Oct 2025 09:00:25 +0100 Subject: [PATCH 11/11] Fix lock --- Cargo.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 72df01fdf6..ffb81d2069 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -224,7 +224,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.107", + "syn 2.0.108", ] [[package]] @@ -720,7 +720,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.107", + "syn 2.0.108", ] [[package]] @@ -2844,7 +2844,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.107", + "syn 2.0.108", ] [[package]] @@ -4544,7 +4544,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.107", + "syn 2.0.108", "tblgen", "unindent", ] @@ -5381,7 +5381,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.107", + "syn 2.0.108", ] [[package]]