Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
bcee2c1
Use CairoRunnerBuilder for cairo_run, but as a placeholder
JulianGCalderon Oct 15, 2025
9558d3d
Initialize full runner in builder
JulianGCalderon Oct 15, 2025
c56cb71
Use builder in vm::cairo_run program tests
JulianGCalderon Oct 15, 2025
fef6e8a
Use builder for custom mod builtin params test
JulianGCalderon Oct 15, 2025
fbc21fa
Use builder for air private input with mod builtin test
JulianGCalderon Oct 15, 2025
b3f104c
Use builder in cairo pie test
JulianGCalderon Oct 15, 2025
7bb23f6
Use builder in fuzzed program test
JulianGCalderon Oct 15, 2025
68188d0
Add builder in run from entrypoint tests
JulianGCalderon Oct 16, 2025
f02f267
Use builder for initializing contract entrypoint
JulianGCalderon Oct 17, 2025
57085b0
Improve entrypoint initialization (better readability)
JulianGCalderon Oct 17, 2025
5e8ab19
Update comment
JulianGCalderon Oct 21, 2025
09524a9
Improve docs
JulianGCalderon Oct 21, 2025
6aadd99
Improve docs
JulianGCalderon Oct 21, 2025
f0d0b7f
Add missing config
JulianGCalderon Oct 21, 2025
0bbae7d
Add comment
JulianGCalderon Oct 21, 2025
b8abe63
Uncomment deny[warnings]
JulianGCalderon Oct 21, 2025
f18073c
Use builder for loading arguments
JulianGCalderon Oct 21, 2025
f53adb6
Remove unwrap
JulianGCalderon Oct 21, 2025
ce22aab
Improve documentation
JulianGCalderon Oct 21, 2025
666cd17
Merge branch 'cairo-runner-builder' into cairo-runner-builder-2
JulianGCalderon Oct 21, 2025
2c7f7bb
Fix lifetime for wasm test
JulianGCalderon Oct 21, 2025
b12f3b1
Format
JulianGCalderon Oct 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 27 additions & 15 deletions cairo1-run/src/cairo_run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ use cairo_vm::{
},
vm::{
errors::{runner_errors::RunnerError, vm_errors::VirtualMachineError},
runners::cairo_runner::{CairoRunner, RunResources, RunnerMode},
runners::cairo_runner::{CairoRunner, CairoRunnerBuilder, RunResources, RunnerMode},
vm_core::VirtualMachine,
},
Felt252,
Expand Down Expand Up @@ -250,16 +250,25 @@ pub fn cairo_run_program(
RunnerMode::ExecutionMode
};

let mut runner = CairoRunner::new_v2(
let mut runner_builder = CairoRunnerBuilder::new(
&program,
cairo_run_config.layout,
cairo_run_config.dynamic_layout_params.clone(),
runner_mode,
cairo_run_config.trace_enabled,
false,
)?;
let end = runner.initialize(cairo_run_config.proof_mode)?;
load_arguments(&mut runner, &cairo_run_config, main_func)?;
runner_builder.enable_trace(cairo_run_config.trace_enabled);
runner_builder.allow_missing_builtins(cairo_run_config.proof_mode);
runner_builder.initialize_builtin_runners_for_layout()?;
runner_builder.initialize_base_segments();
runner_builder.load_program()?;
runner_builder.initialize_builtin_segments();
runner_builder.initialize_builtin_zero_segments();
let end = runner_builder.initialize_main_entrypoint()?;
runner_builder.initialize_validation_rules()?;

load_arguments(&mut runner_builder, &cairo_run_config, main_func)?;

let mut runner = runner_builder.build()?;

// Run it until the end / infinite loop in proof_mode
runner.run_until_pc(end, &mut hint_processor)?;
Expand Down Expand Up @@ -460,7 +469,7 @@ After the entry_code (up until calling main) has been ran by the VM:
(*4) if gas builtin is present
*/
fn load_arguments(
runner: &mut CairoRunner,
runner: &mut CairoRunnerBuilder,
cairo_run_config: &Cairo1RunConfig,
main_func: &Function,
) -> Result<(), Error> {
Expand Down Expand Up @@ -500,25 +509,28 @@ fn load_arguments(
for arg in cairo_run_config.args {
match arg {
FuncArg::Array(args) => {
let array_start = runner.vm.add_memory_segment();
let array_end = runner.vm.load_data(
let array_start = runner.add_memory_segment();
let array_end = runner.load_memory_array(
array_start,
&args.iter().map(|f| f.into()).collect::<Vec<_>>(),
)?;
runner.vm.insert_value(
(runner.vm.get_ap() + ap_offset).map_err(VirtualMachineError::Math)?,
runner.load_memory_value(
(runner.get_initial_ap().ok_or(RunnerError::NoAP)? + ap_offset)
.map_err(VirtualMachineError::Math)?,
array_start,
)?;
ap_offset += 1;
runner.vm.insert_value(
(runner.vm.get_ap() + ap_offset).map_err(VirtualMachineError::Math)?,
runner.load_memory_value(
(runner.get_initial_ap().ok_or(RunnerError::NoAP)? + ap_offset)
.map_err(VirtualMachineError::Math)?,
array_end,
)?;
ap_offset += 1;
}
FuncArg::Single(arg) => {
runner.vm.insert_value(
(runner.vm.get_ap() + ap_offset).map_err(VirtualMachineError::Math)?,
runner.load_memory_value(
(runner.get_initial_ap().ok_or(RunnerError::NoAP)? + ap_offset)
.map_err(VirtualMachineError::Math)?,
arg,
)?;
ap_offset += 1;
Expand Down
71 changes: 54 additions & 17 deletions vm/src/cairo_run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ use crate::{
errors::{
cairo_run_errors::CairoRunError, runner_errors::RunnerError, vm_exception::VmException,
},
runners::{cairo_pie::CairoPie, cairo_runner::CairoRunner},
runners::{
cairo_pie::CairoPie,
cairo_runner::{CairoRunner, CairoRunnerBuilder, RunnerMode},
},
security::verify_secure_runner,
},
};
Expand Down Expand Up @@ -77,18 +80,31 @@ pub fn cairo_run_program_with_initial_scope(
.allow_missing_builtins
.unwrap_or(cairo_run_config.proof_mode);

let mut cairo_runner = CairoRunner::new(
let mut runner_builder = CairoRunnerBuilder::new(
program,
cairo_run_config.layout,
cairo_run_config.dynamic_layout_params.clone(),
cairo_run_config.proof_mode,
cairo_run_config.trace_enabled,
cairo_run_config.disable_trace_padding,
if cairo_run_config.proof_mode {
RunnerMode::ProofModeCanonical
} else {
RunnerMode::ExecutionMode
},
)?;
runner_builder.enable_trace(cairo_run_config.trace_enabled);
runner_builder.disable_trace_padding(cairo_run_config.disable_trace_padding);
runner_builder.allow_missing_builtins(allow_missing_builtins);
runner_builder.initialize_builtin_runners_for_layout()?;
runner_builder.initialize_base_segments();
runner_builder.load_program()?;
runner_builder.initialize_builtin_segments();
runner_builder.initialize_builtin_zero_segments();
let end = runner_builder.initialize_main_entrypoint()?;
runner_builder.initialize_validation_rules()?;

let mut cairo_runner = runner_builder.build()?;

cairo_runner.exec_scopes = exec_scopes;

let end = cairo_runner.initialize(allow_missing_builtins)?;
// check step calculation

cairo_runner
Expand Down Expand Up @@ -171,16 +187,26 @@ pub fn cairo_run_pie(
let allow_missing_builtins = cairo_run_config.allow_missing_builtins.unwrap_or_default();

let program = Program::from_stripped_program(&pie.metadata.program);
let mut cairo_runner = CairoRunner::new(

let mut runner_builder = CairoRunnerBuilder::new(
&program,
cairo_run_config.layout,
cairo_run_config.dynamic_layout_params.clone(),
false,
cairo_run_config.trace_enabled,
cairo_run_config.disable_trace_padding,
RunnerMode::ExecutionMode,
)?;
runner_builder.enable_trace(cairo_run_config.trace_enabled);
runner_builder.disable_trace_padding(cairo_run_config.disable_trace_padding);
runner_builder.allow_missing_builtins(allow_missing_builtins);
runner_builder.initialize_builtin_runners_for_layout()?;
runner_builder.initialize_base_segments();
runner_builder.load_program()?;
runner_builder.initialize_builtin_segments();
runner_builder.initialize_builtin_zero_segments();
let end = runner_builder.initialize_main_entrypoint()?;
runner_builder.initialize_validation_rules()?;

let mut cairo_runner = runner_builder.build()?;

let end = cairo_runner.initialize(allow_missing_builtins)?;
cairo_runner.vm.finalize_segments_by_cairo_pie(pie);
// Load builtin additional data
for (name, data) in pie.additional_data.0.iter() {
Expand Down Expand Up @@ -246,16 +272,27 @@ pub fn cairo_run_fuzzed_program(
.allow_missing_builtins
.unwrap_or(cairo_run_config.proof_mode);

let mut cairo_runner = CairoRunner::new(
let mut runner_builder = CairoRunnerBuilder::new(
&program,
cairo_run_config.layout,
cairo_run_config.dynamic_layout_params.clone(),
cairo_run_config.proof_mode,
cairo_run_config.trace_enabled,
cairo_run_config.disable_trace_padding,
if cairo_run_config.proof_mode {
RunnerMode::ProofModeCanonical
} else {
RunnerMode::ExecutionMode
},
)?;

let _end = cairo_runner.initialize(allow_missing_builtins)?;
runner_builder.enable_trace(cairo_run_config.trace_enabled);
runner_builder.allow_missing_builtins(allow_missing_builtins);
runner_builder.disable_trace_padding(cairo_run_config.disable_trace_padding);
runner_builder.initialize_builtin_runners_for_layout()?;
runner_builder.initialize_base_segments();
runner_builder.load_program()?;
runner_builder.initialize_builtin_segments();
runner_builder.initialize_builtin_zero_segments();
runner_builder.initialize_main_entrypoint()?;
runner_builder.initialize_validation_rules()?;
let mut cairo_runner = runner_builder.build()?;

let res = match cairo_runner.run_until_steps(steps_limit, hint_processor) {
Err(VirtualMachineError::EndOfProgram(_remaining)) => Ok(()), // program ran OK but ended before steps limit
Expand Down
32 changes: 25 additions & 7 deletions vm/src/tests/cairo_run_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ use crate::{tests::*, types::layout_name::LayoutName};
use crate::{
utils::test_utils::Program,
vm::{
runners::{builtin_runner::BuiltinRunner, cairo_runner::CairoRunner},
runners::{
builtin_runner::BuiltinRunner,
cairo_runner::{CairoRunnerBuilder, RunnerMode},
},
security::verify_secure_runner,
},
};
Expand Down Expand Up @@ -1213,17 +1216,32 @@ fn run_program_with_custom_mod_builtin_params(
};
let mut hint_processor = BuiltinHintProcessor::new_empty();
let program = Program::from_bytes(data, Some(cairo_run_config.entrypoint)).unwrap();
let mut cairo_runner = CairoRunner::new(
let mut runner_builder = CairoRunnerBuilder::new(
&program,
cairo_run_config.layout,
cairo_run_config.dynamic_layout_params,
cairo_run_config.proof_mode,
cairo_run_config.trace_enabled,
cairo_run_config.disable_trace_padding,
cairo_run_config.dynamic_layout_params.clone(),
if cairo_run_config.proof_mode {
RunnerMode::ProofModeCanonical
} else {
RunnerMode::ExecutionMode
},
)
.unwrap();
runner_builder.enable_trace(cairo_run_config.trace_enabled);
runner_builder.allow_missing_builtins(false);
runner_builder.disable_trace_padding(cairo_run_config.disable_trace_padding);
runner_builder
.initialize_builtin_runners_for_layout()
.unwrap();
runner_builder.initialize_base_segments();
runner_builder.load_program().unwrap();
runner_builder.initialize_builtin_segments();
runner_builder.initialize_builtin_zero_segments();
let end = runner_builder.initialize_main_entrypoint().unwrap();
runner_builder.initialize_validation_rules().unwrap();

let mut cairo_runner = runner_builder.build().unwrap();

let end = cairo_runner.initialize(false).unwrap();
// Modify add_mod & mul_mod params
for runner in cairo_runner.vm.get_builtin_runners_as_mut() {
if let BuiltinRunner::Mod(runner) = runner {
Expand Down
Loading
Loading