From e0aa055fa604a1ac175c90ebc8f67e1d4b8fbe5c Mon Sep 17 00:00:00 2001 From: Alex Pikme <30472093+reject-i@users.noreply.github.com> Date: Tue, 18 Nov 2025 16:03:19 +0100 Subject: [PATCH 1/6] fix: preserve verified offset flags --- vm/src/vm/runners/builtin_runner/hash.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vm/src/vm/runners/builtin_runner/hash.rs b/vm/src/vm/runners/builtin_runner/hash.rs index ad241e154b..56a7246f67 100644 --- a/vm/src/vm/runners/builtin_runner/hash.rs +++ b/vm/src/vm/runners/builtin_runner/hash.rs @@ -134,10 +134,10 @@ impl HashBuiltinRunner { return Err(RunnerError::InvalidAdditionalData(BuiltinName::pedersen)); } // Mark offset as verified - if addr.offset > verified_addresses.len() { - verified_addresses.resize(addr.offset, false); + if addr.offset >= verified_addresses.len() { + verified_addresses.resize(addr.offset + 1, false); } - verified_addresses.insert(addr.offset, true) + verified_addresses[addr.offset] = true; } Ok(()) } From 7559b498bca869290f0e0d6d7b14e788c3f373a3 Mon Sep 17 00:00:00 2001 From: Alex Pikme <30472093+reject-i@users.noreply.github.com> Date: Sun, 21 Dec 2025 12:43:07 +0000 Subject: [PATCH 2/6] add CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfdb3468f7..55de324e6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ #### Upcoming Changes +* fix: preserve verified offset flags in `HashBuiltinRunner::extend_additional_data` [#2269](https://github.com/lambdaclass/cairo-vm/pull/2269) + #### [3.0.0] - 2025-11-19 #### [3.0.0-rc.5] - 2025-11-14 @@ -2494,3 +2496,4 @@ * `pub fn get_location(pc: &usize, runner: &CairoRunner) -> Option` is now `pub fn get_location(pc: usize, runner: &CairoRunner) -> Option` * `pub fn decode_instruction(encoded_instr: i64, mut imm: Option) -> Result` is now `pub fn decode_instruction(encoded_instr: i64, mut imm: Option<&BigInt>) -> Result` * `VmException` fields' string format now mirrors their cairo-lang counterparts. + From 2fc1bee21b10952dc1609f9bf6cbf8e076787aa4 Mon Sep 17 00:00:00 2001 From: Alex Pikme <30472093+reject-i@users.noreply.github.com> Date: Sun, 21 Dec 2025 12:43:34 +0000 Subject: [PATCH 3/6] add test --- vm/src/vm/runners/builtin_runner/hash.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/vm/src/vm/runners/builtin_runner/hash.rs b/vm/src/vm/runners/builtin_runner/hash.rs index 56a7246f67..dff1e18ac8 100644 --- a/vm/src/vm/runners/builtin_runner/hash.rs +++ b/vm/src/vm/runners/builtin_runner/hash.rs @@ -483,6 +483,24 @@ mod tests { assert_eq!(builtin_a.verified_addresses, builtin_b.verified_addresses); } + #[test] + fn extend_additional_data_preserves_existing_verified_flags() { + let mut builtin = HashBuiltinRunner::new(Some(1), true); + builtin.verified_addresses = RefCell::new(vec![false, false, true, false, false, true]); + + let additional_data = BuiltinAdditionalData::Hash(vec![ + Relocatable::from((0, 0)), + Relocatable::from((0, 4)), + ]); + + builtin.extend_additional_data(&additional_data).unwrap(); + + assert_eq!( + *builtin.verified_addresses.borrow(), + vec![true, false, true, false, true, true] + ); + } + #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn get_air_private_input() { From 8a1e62d9c9a9503785da059bd6ebad8671f2368a Mon Sep 17 00:00:00 2001 From: Alex Pikme <30472093+reject-i@users.noreply.github.com> Date: Sun, 21 Dec 2025 12:45:11 +0000 Subject: [PATCH 4/6] fix --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55de324e6a..e8eb28c62b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2496,4 +2496,3 @@ * `pub fn get_location(pc: &usize, runner: &CairoRunner) -> Option` is now `pub fn get_location(pc: usize, runner: &CairoRunner) -> Option` * `pub fn decode_instruction(encoded_instr: i64, mut imm: Option) -> Result` is now `pub fn decode_instruction(encoded_instr: i64, mut imm: Option<&BigInt>) -> Result` * `VmException` fields' string format now mirrors their cairo-lang counterparts. - From 03370ccef7b819799d9d16c5bc5faa3cd2591c95 Mon Sep 17 00:00:00 2001 From: Alex Pikme <30472093+reject-i@users.noreply.github.com> Date: Sat, 10 Jan 2026 07:02:38 +0000 Subject: [PATCH 5/6] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e8eb28c62b..5b88c7ec51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ #### Upcoming Changes +* fix: rename y_cube_int to y_square_int in get_point_from_x [#2271](https://github.com/lambdaclass/cairo-vm/pull/2271) + +* fix: correct duplicate tuple index in InvalidTrackingGroup error message [#2276](https://github.com/lambdaclass/cairo-vm/pull/2276) + * fix: preserve verified offset flags in `HashBuiltinRunner::extend_additional_data` [#2269](https://github.com/lambdaclass/cairo-vm/pull/2269) #### [3.0.0] - 2025-11-19 From b41a9e98382aa5b4cc4ecb94bd13d665e9ddfca6 Mon Sep 17 00:00:00 2001 From: Alex Pikme <30472093+reject-i@users.noreply.github.com> Date: Tue, 27 Jan 2026 07:55:27 +0000 Subject: [PATCH 6/6] rustfmt --- vm/src/vm/runners/builtin_runner/hash.rs | 114 ++++++----------------- 1 file changed, 26 insertions(+), 88 deletions(-) diff --git a/vm/src/vm/runners/builtin_runner/hash.rs b/vm/src/vm/runners/builtin_runner/hash.rs index dff1e18ac8..0bc295f00b 100644 --- a/vm/src/vm/runners/builtin_runner/hash.rs +++ b/vm/src/vm/runners/builtin_runner/hash.rs @@ -61,11 +61,7 @@ impl HashBuiltinRunner { memory: &Memory, ) -> Result, RunnerError> { if address.offset.mod_floor(&(CELLS_PER_HASH as usize)) != 2 - || *self - .verified_addresses - .borrow() - .get(address.offset) - .unwrap_or(&false) + || *self.verified_addresses.borrow().get(address.offset).unwrap_or(&false) { return Ok(None); }; @@ -78,14 +74,11 @@ impl HashBuiltinRunner { segment_index: address.segment_index, offset: address.offset - 2, })); - if let (Some(MaybeRelocatable::Int(num_a)), Some(MaybeRelocatable::Int(num_b))) = ( - num_a.as_ref().map(|x| x.as_ref()), - num_b.as_ref().map(|x| x.as_ref()), - ) { + if let (Some(MaybeRelocatable::Int(num_a)), Some(MaybeRelocatable::Int(num_b))) = + (num_a.as_ref().map(|x| x.as_ref()), num_b.as_ref().map(|x| x.as_ref())) + { if self.verified_addresses.borrow().len() <= address.offset { - self.verified_addresses - .borrow_mut() - .resize(address.offset + 1, false); + self.verified_addresses.borrow_mut().resize(address.offset + 1, false); } self.verified_addresses.borrow_mut()[address.offset] = true; //Compute pedersen Hash @@ -96,9 +89,7 @@ impl HashBuiltinRunner { } pub fn get_used_cells(&self, segments: &MemorySegmentManager) -> Result { - segments - .get_segment_used_size(self.base()) - .ok_or(MemoryError::MissingSegmentUsedSizes) + segments.get_segment_used_size(self.base()).ok_or(MemoryError::MissingSegmentUsedSizes) } pub fn get_used_instances( @@ -146,10 +137,7 @@ impl HashBuiltinRunner { let mut private_inputs = vec![]; if let Some(segment) = memory.data.get(self.base) { let segment_len = segment.len(); - for (index, off) in (0..segment_len) - .step_by(CELLS_PER_HASH as usize) - .enumerate() - { + for (index, off) in (0..segment_len).step_by(CELLS_PER_HASH as usize).enumerate() { // Add the input cells of each hash instance to the private inputs if let (Ok(x), Ok(y)) = ( memory.get_integer((self.base as isize, off).into()), @@ -199,21 +187,14 @@ mod tests { let mut vm = vm!(); - vm.segments = segments![ - ((0, 0), (0, 0)), - ((0, 1), (0, 1)), - ((2, 0), (0, 0)), - ((2, 1), (0, 0)) - ]; + vm.segments = + segments![((0, 0), (0, 0)), ((0, 1), (0, 1)), ((2, 0), (0, 0)), ((2, 1), (0, 0))]; vm.segments.segment_used_sizes = Some(vec![0]); let pointer = Relocatable::from((2, 2)); - assert_eq!( - builtin.final_stack(&vm.segments, pointer).unwrap(), - Relocatable::from((2, 1)) - ); + assert_eq!(builtin.final_stack(&vm.segments, pointer).unwrap(), Relocatable::from((2, 1))); } #[test] @@ -223,12 +204,8 @@ mod tests { let mut vm = vm!(); - vm.segments = segments![ - ((0, 0), (0, 0)), - ((0, 1), (0, 1)), - ((2, 0), (0, 0)), - ((2, 1), (0, 0)) - ]; + vm.segments = + segments![((0, 0), (0, 0)), ((0, 1), (0, 1)), ((2, 0), (0, 0)), ((2, 1), (0, 0))]; vm.segments.segment_used_sizes = Some(vec![999]); @@ -251,21 +228,14 @@ mod tests { let mut vm = vm!(); - vm.segments = segments![ - ((0, 0), (0, 0)), - ((0, 1), (0, 1)), - ((2, 0), (0, 0)), - ((2, 1), (0, 0)) - ]; + vm.segments = + segments![((0, 0), (0, 0)), ((0, 1), (0, 1)), ((2, 0), (0, 0)), ((2, 1), (0, 0))]; vm.segments.segment_used_sizes = Some(vec![0]); let pointer = Relocatable::from((2, 2)); - assert_eq!( - builtin.final_stack(&vm.segments, pointer).unwrap(), - Relocatable::from((2, 2)) - ); + assert_eq!(builtin.final_stack(&vm.segments, pointer).unwrap(), Relocatable::from((2, 2))); } #[test] @@ -275,12 +245,7 @@ mod tests { let mut vm = vm!(); - vm.segments = segments![ - ((0, 0), (0, 0)), - ((0, 1), (0, 1)), - ((2, 0), (0, 0)), - ((2, 1), 2) - ]; + vm.segments = segments![((0, 0), (0, 0)), ((0, 1), (0, 1)), ((2, 0), (0, 0)), ((2, 1), 2)]; vm.segments.segment_used_sizes = Some(vec![0]); @@ -329,14 +294,9 @@ mod tests { let address = cairo_runner.initialize(false).unwrap(); - cairo_runner - .run_until_pc(address, &mut hint_processor) - .unwrap(); + cairo_runner.run_until_pc(address, &mut hint_processor).unwrap(); - assert_eq!( - builtin.get_used_cells_and_allocated_size(&cairo_runner.vm), - Ok((0, 3)) - ); + assert_eq!(builtin.get_used_cells_and_allocated_size(&cairo_runner.vm), Ok((0, 3))); } #[test] @@ -374,9 +334,7 @@ mod tests { let address = cairo_runner.initialize(false).unwrap(); - cairo_runner - .run_until_pc(address, &mut hint_processor) - .unwrap(); + cairo_runner.run_until_pc(address, &mut hint_processor).unwrap(); assert_eq!(builtin.get_allocated_memory_units(&cairo_runner.vm), Ok(3)); } @@ -434,10 +392,7 @@ mod tests { let builtin = BuiltinRunner::Hash(HashBuiltinRunner::new(Some(256), true)); let vm = vm!(); - assert_eq!( - builtin.get_used_cells(&vm.segments), - Err(MemoryError::MissingSegmentUsedSizes) - ); + assert_eq!(builtin.get_used_cells(&vm.segments), Err(MemoryError::MissingSegmentUsedSizes)); } #[test] @@ -466,10 +421,7 @@ mod tests { let verified_addresses = vec![Relocatable::from((0, 3)), Relocatable::from((0, 6))]; builtin.verified_addresses = RefCell::new(vec![false, false, false, true, false, false, true]); - assert_eq!( - builtin.get_additional_data(), - BuiltinAdditionalData::Hash(verified_addresses) - ) + assert_eq!(builtin.get_additional_data(), BuiltinAdditionalData::Hash(verified_addresses)) } #[test] @@ -488,10 +440,8 @@ mod tests { let mut builtin = HashBuiltinRunner::new(Some(1), true); builtin.verified_addresses = RefCell::new(vec![false, false, true, false, false, true]); - let additional_data = BuiltinAdditionalData::Hash(vec![ - Relocatable::from((0, 0)), - Relocatable::from((0, 4)), - ]); + let additional_data = + BuiltinAdditionalData::Hash(vec![Relocatable::from((0, 0)), Relocatable::from((0, 4))]); builtin.extend_additional_data(&additional_data).unwrap(); @@ -521,21 +471,9 @@ mod tests { assert_eq!( builtin.air_private_input(&segments), (vec![ - PrivateInput::Pair(PrivateInputPair { - index: 0, - x: 0.into(), - y: 1.into() - }), - PrivateInput::Pair(PrivateInputPair { - index: 1, - x: 3.into(), - y: 4.into() - }), - PrivateInput::Pair(PrivateInputPair { - index: 2, - x: 6.into(), - y: 7.into() - }), + PrivateInput::Pair(PrivateInputPair { index: 0, x: 0.into(), y: 1.into() }), + PrivateInput::Pair(PrivateInputPair { index: 1, x: 3.into(), y: 4.into() }), + PrivateInput::Pair(PrivateInputPair { index: 2, x: 6.into(), y: 7.into() }), ]), ); }