diff --git a/cairo_programs/poseidon_builtin_hole.cairo b/cairo_programs/poseidon_builtin_hole.cairo new file mode 100644 index 0000000000..9a8d719c30 --- /dev/null +++ b/cairo_programs/poseidon_builtin_hole.cairo @@ -0,0 +1,12 @@ +%builtins poseidon +from starkware.cairo.common.cairo_builtins import PoseidonBuiltin +from starkware.cairo.common.poseidon_state import PoseidonBuiltinState + +func main{poseidon_ptr: PoseidonBuiltin*}() { + assert poseidon_ptr[0].input = PoseidonBuiltinState(1, 2, 3); + let result = poseidon_ptr[0].output; + let poseidon_ptr = poseidon_ptr + PoseidonBuiltin.SIZE; + assert result.s0 = 442682200349489646213731521593476982257703159825582578145778919623645026501; + assert result.s2 = 2512222140811166287287541003826449032093371832913959128171347018667852712082; + return (); +} diff --git a/vm/src/vm/runners/cairo_runner.rs b/vm/src/vm/runners/cairo_runner.rs index 1990cd8329..dba5cb9fb9 100644 --- a/vm/src/vm/runners/cairo_runner.rs +++ b/vm/src/vm/runners/cairo_runner.rs @@ -5696,6 +5696,42 @@ mod tests { assert!(cairo_runner.vm.segments.memory.data[8].len() as u32 % CELLS_PER_KECCAK == 0); } + #[test] + // TODO(Stav): add another test that checks filling holes in the middle of the segment. + fn end_run_fill_middle_holes() { + let program = Program::from_bytes( + include_bytes!("../../../../cairo_programs/proof_programs/poseidon_builtin_hole.json"), + Some("main"), + ) + .unwrap(); + + let mut hint_processor = BuiltinHintProcessor::new_empty(); + let mut cairo_runner = cairo_runner!(program, LayoutName::all_cairo, true, true); + + let end = cairo_runner.initialize(false).unwrap(); + cairo_runner + .run_until_pc(end, &mut hint_processor) + .expect("Call to `CairoRunner::run_until_pc()` failed."); + + // Before end run + assert!(cairo_runner.vm.segments.memory.data[9][4].is_none()); + + assert_matches!( + cairo_runner.end_run(false, false, &mut hint_processor), + Ok(()) + ); + + // After end run + assert!(!cairo_runner.vm.segments.memory.data[9][4].is_none()); + + // // Check prover input info + let prover_input = cairo_runner + .get_prover_input_info() + .expect("Failed to get prover input info"); + assert!(prover_input.relocatable_memory[9][4].is_some()); + assert!(prover_input.builtins_segments.get(&9) == Some(&BuiltinName::poseidon)); + } + #[rstest] #[case(include_bytes!("../../../../cairo_programs/proof_programs/fibonacci.json"))] #[case(include_bytes!("../../../../cairo_programs/proof_programs/bitwise_output.json"))]