From d727973000ee154a23192b9c590bca7e70fb381c Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Wed, 24 Sep 2025 08:56:17 -0300 Subject: [PATCH 01/13] Auxiliary function --- cairo1-run/src/cairo_run.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/cairo1-run/src/cairo_run.rs b/cairo1-run/src/cairo_run.rs index 51418afbc3..d3d49eb014 100644 --- a/cairo1-run/src/cairo_run.rs +++ b/cairo1-run/src/cairo_run.rs @@ -469,20 +469,13 @@ fn load_arguments( cairo_run_config: &Cairo1RunConfig, main_func: &Function, ) -> Result<(), Error> { - let got_gas_builtin = main_func - .signature - .param_types - .iter() - .any(|ty| ty.debug_name.as_ref().is_some_and(|n| n == "GasBuiltin")); + let got_gas_builtin = got_implicit_builtin(main_func, "GasBuiltin"); if cairo_run_config.args.is_empty() && !got_gas_builtin { // Nothing to be done return Ok(()); } - let got_segment_arena = main_func - .signature - .param_types - .iter() - .any(|ty| ty.debug_name.as_ref().is_some_and(|n| n == "SegmentArena")); + let got_segment_arena = got_implicit_builtin(main_func, "SegmentArena"); + let got_system_builtin = got_implicit_builtin(main_func, "System"); // This AP correction represents the memory slots taken up by the values created by `create_entry_code`: // These include: // * The builtin bases (not including output) @@ -502,6 +495,9 @@ fn load_arguments( if got_gas_builtin { ap_offset += 1; } + if got_system_builtin { + ap_offset += 1; + } for arg in cairo_run_config.args { match arg { FuncArg::Array(args) => { @@ -1008,6 +1004,13 @@ fn check_only_array_felt_return_type( _ => false, } } +fn got_implicit_builtin(main_func: &Function, builtin_name: &str) -> bool { + main_func + .signature + .param_types + .iter() + .any(|ty| ty.debug_name.as_ref().is_some_and(|n| n == builtin_name)) +} fn is_panic_result(return_type_id: Option<&ConcreteTypeId>) -> bool { return_type_id From 5ca0cf4827e3359078e7fe9f479c4b72863941e8 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Wed, 24 Sep 2025 15:19:09 -0300 Subject: [PATCH 02/13] Add cairo programs --- cairo1-run/src/cairo_run.rs | 10 +++++++--- .../cairo-1-programs/implicit_systen_builtin.cairo | 4 ++++ .../serialized_output/implicit_system_builtin.cairo | 4 ++++ .../with_input/implicit_system_builtin.cairo | 4 ++++ .../with_input/implicit_system_builtin.cairo | 4 ++++ 5 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 cairo_programs/cairo-1-programs/implicit_systen_builtin.cairo create mode 100644 cairo_programs/cairo-1-programs/serialized_output/implicit_system_builtin.cairo create mode 100644 cairo_programs/cairo-1-programs/serialized_output/with_input/implicit_system_builtin.cairo create mode 100644 cairo_programs/cairo-1-programs/with_input/implicit_system_builtin.cairo diff --git a/cairo1-run/src/cairo_run.rs b/cairo1-run/src/cairo_run.rs index d3d49eb014..08fbc9dc51 100644 --- a/cairo1-run/src/cairo_run.rs +++ b/cairo1-run/src/cairo_run.rs @@ -54,6 +54,10 @@ use num_bigint::{BigInt, Sign}; use num_traits::{cast::ToPrimitive, Zero}; use std::{collections::HashMap, iter::Peekable}; +const SEGMENT_ARENA_GAPS: usize = 4; +const GAS_BUILTIN_GAPS: usize = 1; +const SYSTEM_BUILTIN_GAPS: usize = 1; + /// Representation of a cairo argument /// Can consist of a single Felt or an array of Felts #[derive(Debug, Clone)] @@ -490,13 +494,13 @@ fn load_arguments( ap_offset += runner.get_program().builtins_len() - 1; } if got_segment_arena { - ap_offset += 4; + ap_offset += SEGMENT_ARENA_GAPS; } if got_gas_builtin { - ap_offset += 1; + ap_offset += GAS_BUILTIN_GAPS; } if got_system_builtin { - ap_offset += 1; + ap_offset += SYSTEM_BUILTIN_GAPS; } for arg in cairo_run_config.args { match arg { diff --git a/cairo_programs/cairo-1-programs/implicit_systen_builtin.cairo b/cairo_programs/cairo-1-programs/implicit_systen_builtin.cairo new file mode 100644 index 0000000000..227619972f --- /dev/null +++ b/cairo_programs/cairo-1-programs/implicit_systen_builtin.cairo @@ -0,0 +1,4 @@ +fn main() -> Array { + core::internal::require_implicit::(); + array![1] +} diff --git a/cairo_programs/cairo-1-programs/serialized_output/implicit_system_builtin.cairo b/cairo_programs/cairo-1-programs/serialized_output/implicit_system_builtin.cairo new file mode 100644 index 0000000000..227619972f --- /dev/null +++ b/cairo_programs/cairo-1-programs/serialized_output/implicit_system_builtin.cairo @@ -0,0 +1,4 @@ +fn main() -> Array { + core::internal::require_implicit::(); + array![1] +} diff --git a/cairo_programs/cairo-1-programs/serialized_output/with_input/implicit_system_builtin.cairo b/cairo_programs/cairo-1-programs/serialized_output/with_input/implicit_system_builtin.cairo new file mode 100644 index 0000000000..baecc8b4ec --- /dev/null +++ b/cairo_programs/cairo-1-programs/serialized_output/with_input/implicit_system_builtin.cairo @@ -0,0 +1,4 @@ +fn main(input: Array) -> Array { + core::internal::require_implicit::(); + input +} diff --git a/cairo_programs/cairo-1-programs/with_input/implicit_system_builtin.cairo b/cairo_programs/cairo-1-programs/with_input/implicit_system_builtin.cairo new file mode 100644 index 0000000000..baecc8b4ec --- /dev/null +++ b/cairo_programs/cairo-1-programs/with_input/implicit_system_builtin.cairo @@ -0,0 +1,4 @@ +fn main(input: Array) -> Array { + core::internal::require_implicit::(); + input +} From 07613da136a436f0837ac473496340aaf09a3868 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Wed, 24 Sep 2025 16:11:24 -0300 Subject: [PATCH 03/13] Add test case --- cairo1-run/src/main.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cairo1-run/src/main.rs b/cairo1-run/src/main.rs index 2116579d17..27f053f587 100644 --- a/cairo1-run/src/main.rs +++ b/cairo1-run/src/main.rs @@ -454,6 +454,13 @@ mod tests { None, None )] + #[case( + "with_input/implicit_system_builtin.cairo", + "[1 2]", + "[1 2]", + Some("[1 2]"), + Some("[1 2]") + )] fn test_run_program( #[case] program: &str, #[case] expected_output: &str, From d1c7e88d9f38e4b6b54896daf3ff20706cc299ac Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Wed, 24 Sep 2025 16:22:16 -0300 Subject: [PATCH 04/13] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e776dfd3c5..c1eeca34ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ #### Upcoming Changes +* Fix bug affecting cairo1 programs with input and Sysem builtin [#2207](https://github.com/lambdaclass/cairo-vm/pull/2207) + * fix: Added `cairo_1_test_contracts` and `cairo_2_test_contracts` as dependencies for `test-extensive_hints` target [#2201](https://github.com/lambdaclass/cairo-vm/pull/2201) * breaking: Store constants in Hint Data [#2191](https://github.com/lambdaclass/cairo-vm/pull/2191) From 41a9b501107ec4e523b74dd6362d01d329a58fb1 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Wed, 24 Sep 2025 16:34:26 -0300 Subject: [PATCH 05/13] Fix output segment offset --- cairo1-run/src/cairo_run.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cairo1-run/src/cairo_run.rs b/cairo1-run/src/cairo_run.rs index 08fbc9dc51..c82ab4ef4f 100644 --- a/cairo1-run/src/cairo_run.rs +++ b/cairo1-run/src/cairo_run.rs @@ -557,6 +557,11 @@ fn create_entry_code( .map(|x| x.long_id.generic_id == GasBuiltinType::ID) .unwrap_or_default() }); + let got_system_builtin = signature.param_types.iter().any(|ty| { + get_info(sierra_program_registry, ty) + .map(|x| x.long_id.generic_id == SystemType::ID) + .unwrap_or_default() + }); // The builtins in the formatting expected by the runner. let (builtins, builtin_offset) = get_function_builtins(&signature.param_types, copy_to_output_builtin); @@ -741,7 +746,8 @@ fn create_entry_code( // len(builtins - output) + len(builtins) + if segment_arena: segment_arena_ptr + info_ptr + 0 + (segment_arena_ptr + 3) + (gas_builtin) let offset = (2 * builtins.len() - 1 + 4 * got_segment_arena as usize - + got_gas_builtin as usize) as i16; + + got_gas_builtin as usize + + got_system_builtin as usize) as i16; let array_start_ptr = ctx.add_var(CellExpression::Deref(deref!([fp + offset]))); let array_end_ptr = ctx.add_var(CellExpression::Deref(deref!([fp + offset + 1]))); casm_build_extend! {ctx, From d178a2a02845a11d0b5c52609be0dd6976e7dbaf Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Wed, 24 Sep 2025 16:50:10 -0300 Subject: [PATCH 06/13] Add test --- cairo1-run/src/main.rs | 1 + ...plicit_systen_builtin.cairo => implicit_system_builtin.cairo} | 0 2 files changed, 1 insertion(+) rename cairo_programs/cairo-1-programs/{implicit_systen_builtin.cairo => implicit_system_builtin.cairo} (100%) diff --git a/cairo1-run/src/main.rs b/cairo1-run/src/main.rs index 27f053f587..c8f10cfdee 100644 --- a/cairo1-run/src/main.rs +++ b/cairo1-run/src/main.rs @@ -454,6 +454,7 @@ mod tests { None, None )] + #[case("implicit_system_builtin.cairo", "[1]", "[1]", None, None)] #[case( "with_input/implicit_system_builtin.cairo", "[1 2]", diff --git a/cairo_programs/cairo-1-programs/implicit_systen_builtin.cairo b/cairo_programs/cairo-1-programs/implicit_system_builtin.cairo similarity index 100% rename from cairo_programs/cairo-1-programs/implicit_systen_builtin.cairo rename to cairo_programs/cairo-1-programs/implicit_system_builtin.cairo From 979d9806627ea0280dfc2e3392089b2c39844b8b Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Wed, 24 Sep 2025 17:23:41 -0300 Subject: [PATCH 07/13] Add tests --- cairo1-run/src/main.rs | 14 ++++++++++++++ .../with_input/implicit_gas_builtin.cairo | 4 ++++ .../with_input/system_segment_gas.cairo | 5 +++++ .../with_input/implicit_gas_builtin.cairo | 4 ++++ .../with_input/system_segment_gas.cairo | 5 +++++ 5 files changed, 32 insertions(+) create mode 100644 cairo_programs/cairo-1-programs/serialized_output/with_input/implicit_gas_builtin.cairo create mode 100644 cairo_programs/cairo-1-programs/serialized_output/with_input/system_segment_gas.cairo create mode 100644 cairo_programs/cairo-1-programs/with_input/implicit_gas_builtin.cairo create mode 100644 cairo_programs/cairo-1-programs/with_input/system_segment_gas.cairo diff --git a/cairo1-run/src/main.rs b/cairo1-run/src/main.rs index c8f10cfdee..ddc96a8717 100644 --- a/cairo1-run/src/main.rs +++ b/cairo1-run/src/main.rs @@ -462,6 +462,20 @@ mod tests { Some("[1 2]"), Some("[1 2]") )] + #[case( + "with_input/implicit_gas_builtin.cairo", + "[1 2]", + "[1 2]", + Some("[1 2]"), + Some("[1 2]") + )] + #[case( + "with_input/system_segment_gas.cairo", + "[1 2]", + "[1 2]", + Some("[1 2]"), + Some("[1 2]") + )] fn test_run_program( #[case] program: &str, #[case] expected_output: &str, diff --git a/cairo_programs/cairo-1-programs/serialized_output/with_input/implicit_gas_builtin.cairo b/cairo_programs/cairo-1-programs/serialized_output/with_input/implicit_gas_builtin.cairo new file mode 100644 index 0000000000..09d65660f6 --- /dev/null +++ b/cairo_programs/cairo-1-programs/serialized_output/with_input/implicit_gas_builtin.cairo @@ -0,0 +1,4 @@ +fn main(input: Array) -> Array { + core::internal::require_implicit::(); + input +} diff --git a/cairo_programs/cairo-1-programs/serialized_output/with_input/system_segment_gas.cairo b/cairo_programs/cairo-1-programs/serialized_output/with_input/system_segment_gas.cairo new file mode 100644 index 0000000000..71e5d6e1cc --- /dev/null +++ b/cairo_programs/cairo-1-programs/serialized_output/with_input/system_segment_gas.cairo @@ -0,0 +1,5 @@ +fn main(input:Array) -> Array { + core::internal::require_implicit::(); + let _elements: Felt252Dict>> = Default::default(); + input +} diff --git a/cairo_programs/cairo-1-programs/with_input/implicit_gas_builtin.cairo b/cairo_programs/cairo-1-programs/with_input/implicit_gas_builtin.cairo new file mode 100644 index 0000000000..09d65660f6 --- /dev/null +++ b/cairo_programs/cairo-1-programs/with_input/implicit_gas_builtin.cairo @@ -0,0 +1,4 @@ +fn main(input: Array) -> Array { + core::internal::require_implicit::(); + input +} diff --git a/cairo_programs/cairo-1-programs/with_input/system_segment_gas.cairo b/cairo_programs/cairo-1-programs/with_input/system_segment_gas.cairo new file mode 100644 index 0000000000..71e5d6e1cc --- /dev/null +++ b/cairo_programs/cairo-1-programs/with_input/system_segment_gas.cairo @@ -0,0 +1,5 @@ +fn main(input:Array) -> Array { + core::internal::require_implicit::(); + let _elements: Felt252Dict>> = Default::default(); + input +} From 37dbcccde047cfbf1d9e5d5f09ab1cd5246eed94 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Wed, 24 Sep 2025 17:32:33 -0300 Subject: [PATCH 08/13] Remove unnecessary test --- cairo1-run/src/main.rs | 1 - cairo_programs/cairo-1-programs/implicit_system_builtin.cairo | 4 ---- .../serialized_output/implicit_system_builtin.cairo | 4 ---- 3 files changed, 9 deletions(-) delete mode 100644 cairo_programs/cairo-1-programs/implicit_system_builtin.cairo delete mode 100644 cairo_programs/cairo-1-programs/serialized_output/implicit_system_builtin.cairo diff --git a/cairo1-run/src/main.rs b/cairo1-run/src/main.rs index ddc96a8717..f068ef9d47 100644 --- a/cairo1-run/src/main.rs +++ b/cairo1-run/src/main.rs @@ -454,7 +454,6 @@ mod tests { None, None )] - #[case("implicit_system_builtin.cairo", "[1]", "[1]", None, None)] #[case( "with_input/implicit_system_builtin.cairo", "[1 2]", diff --git a/cairo_programs/cairo-1-programs/implicit_system_builtin.cairo b/cairo_programs/cairo-1-programs/implicit_system_builtin.cairo deleted file mode 100644 index 227619972f..0000000000 --- a/cairo_programs/cairo-1-programs/implicit_system_builtin.cairo +++ /dev/null @@ -1,4 +0,0 @@ -fn main() -> Array { - core::internal::require_implicit::(); - array![1] -} diff --git a/cairo_programs/cairo-1-programs/serialized_output/implicit_system_builtin.cairo b/cairo_programs/cairo-1-programs/serialized_output/implicit_system_builtin.cairo deleted file mode 100644 index 227619972f..0000000000 --- a/cairo_programs/cairo-1-programs/serialized_output/implicit_system_builtin.cairo +++ /dev/null @@ -1,4 +0,0 @@ -fn main() -> Array { - core::internal::require_implicit::(); - array![1] -} From 8a80cf3655ccfc11ab6117d68fe1165ee39d97f5 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Thu, 25 Sep 2025 09:12:59 -0300 Subject: [PATCH 09/13] Fix changelog typo --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1eeca34ec..d368d46ba5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ #### Upcoming Changes -* Fix bug affecting cairo1 programs with input and Sysem builtin [#2207](https://github.com/lambdaclass/cairo-vm/pull/2207) +* Fix bug affecting cairo1 programs with input and System builtin [#2207](https://github.com/lambdaclass/cairo-vm/pull/2207) * fix: Added `cairo_1_test_contracts` and `cairo_2_test_contracts` as dependencies for `test-extensive_hints` target [#2201](https://github.com/lambdaclass/cairo-vm/pull/2201) From a83119f49b16c5b4f83076353d4f262763439d7f Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Thu, 25 Sep 2025 09:50:35 -0300 Subject: [PATCH 10/13] Use common func --- cairo1-run/src/cairo_run.rs | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/cairo1-run/src/cairo_run.rs b/cairo1-run/src/cairo_run.rs index c82ab4ef4f..cae7e491f4 100644 --- a/cairo1-run/src/cairo_run.rs +++ b/cairo1-run/src/cairo_run.rs @@ -473,13 +473,13 @@ fn load_arguments( cairo_run_config: &Cairo1RunConfig, main_func: &Function, ) -> Result<(), Error> { - let got_gas_builtin = got_implicit_builtin(main_func, "GasBuiltin"); + let got_gas_builtin = got_implicit_builtin(&main_func.signature.param_types, "GasBuiltin"); if cairo_run_config.args.is_empty() && !got_gas_builtin { // Nothing to be done return Ok(()); } - let got_segment_arena = got_implicit_builtin(main_func, "SegmentArena"); - let got_system_builtin = got_implicit_builtin(main_func, "System"); + let got_segment_arena = got_implicit_builtin(&main_func.signature.param_types, "SegmentArena"); + let got_system_builtin = got_implicit_builtin(&main_func.signature.param_types, "System"); // This AP correction represents the memory slots taken up by the values created by `create_entry_code`: // These include: // * The builtin bases (not including output) @@ -547,21 +547,9 @@ fn create_entry_code( ) -> Result<(CasmContext, Vec), Error> { let copy_to_output_builtin = config.copy_to_output(); let signature = &func.signature; - let got_segment_arena = signature.param_types.iter().any(|ty| { - get_info(sierra_program_registry, ty) - .map(|x| x.long_id.generic_id == SegmentArenaType::ID) - .unwrap_or_default() - }); - let got_gas_builtin = signature.param_types.iter().any(|ty| { - get_info(sierra_program_registry, ty) - .map(|x| x.long_id.generic_id == GasBuiltinType::ID) - .unwrap_or_default() - }); - let got_system_builtin = signature.param_types.iter().any(|ty| { - get_info(sierra_program_registry, ty) - .map(|x| x.long_id.generic_id == SystemType::ID) - .unwrap_or_default() - }); + let got_segment_arena = got_implicit_builtin(&signature.param_types, "SegmentArena"); + let got_gas_builtin = got_implicit_builtin(&signature.param_types, "GasBuiltin"); + let got_system_builtin = got_implicit_builtin(&signature.param_types, "System"); // The builtins in the formatting expected by the runner. let (builtins, builtin_offset) = get_function_builtins(&signature.param_types, copy_to_output_builtin); @@ -1014,10 +1002,8 @@ fn check_only_array_felt_return_type( _ => false, } } -fn got_implicit_builtin(main_func: &Function, builtin_name: &str) -> bool { - main_func - .signature - .param_types +fn got_implicit_builtin(param_types: &Vec, builtin_name: &str) -> bool { + param_types .iter() .any(|ty| ty.debug_name.as_ref().is_some_and(|n| n == builtin_name)) } From 91270a6ac7521550ee8c56c98dcc21c09a70a3af Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Thu, 25 Sep 2025 09:54:02 -0300 Subject: [PATCH 11/13] Add comment --- cairo1-run/src/cairo_run.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/cairo1-run/src/cairo_run.rs b/cairo1-run/src/cairo_run.rs index cae7e491f4..aa3644f017 100644 --- a/cairo1-run/src/cairo_run.rs +++ b/cairo1-run/src/cairo_run.rs @@ -54,6 +54,7 @@ use num_bigint::{BigInt, Sign}; use num_traits::{cast::ToPrimitive, Zero}; use std::{collections::HashMap, iter::Peekable}; +// Necessary memory gaps for the values created on the entry code of each implicit builtin const SEGMENT_ARENA_GAPS: usize = 4; const GAS_BUILTIN_GAPS: usize = 1; const SYSTEM_BUILTIN_GAPS: usize = 1; From 738d6b4efb288a52718d11eb5142e8f7ffbb058a Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Thu, 25 Sep 2025 10:06:04 -0300 Subject: [PATCH 12/13] Fix clippy --- cairo1-run/src/cairo_run.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cairo1-run/src/cairo_run.rs b/cairo1-run/src/cairo_run.rs index aa3644f017..0467677ec5 100644 --- a/cairo1-run/src/cairo_run.rs +++ b/cairo1-run/src/cairo_run.rs @@ -1003,7 +1003,7 @@ fn check_only_array_felt_return_type( _ => false, } } -fn got_implicit_builtin(param_types: &Vec, builtin_name: &str) -> bool { +fn got_implicit_builtin(param_types: &[ConcreteTypeId], builtin_name: &str) -> bool { param_types .iter() .any(|ty| ty.debug_name.as_ref().is_some_and(|n| n == builtin_name)) From 283bd7c915694962d63915094bdd5837064b9c6a Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Thu, 25 Sep 2025 10:50:09 -0300 Subject: [PATCH 13/13] Update comment --- cairo1-run/src/cairo_run.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cairo1-run/src/cairo_run.rs b/cairo1-run/src/cairo_run.rs index 0467677ec5..ae34f38771 100644 --- a/cairo1-run/src/cairo_run.rs +++ b/cairo1-run/src/cairo_run.rs @@ -732,7 +732,8 @@ fn create_entry_code( // We lost the output_ptr var after re-scoping, so we need to create it again // The last instruction will write the last output ptr so we can find it in [ap - 1] let output_ptr = ctx.add_var(CellExpression::Deref(deref!([ap - 1]))); - // len(builtins - output) + len(builtins) + if segment_arena: segment_arena_ptr + info_ptr + 0 + (segment_arena_ptr + 3) + (gas_builtin) + // len(builtins - output) + len(builtins) + if segment_arena: segment_arena_ptr + + // info_ptr + 0 + (segment_arena_ptr + 3) + (gas_builtin) + (system_builtin) let offset = (2 * builtins.len() - 1 + 4 * got_segment_arena as usize + got_gas_builtin as usize