@@ -10,7 +10,11 @@ use crate::Felt252;
1010use crate :: {
1111 hint_processor:: cairo_1_hint_processor:: hint_processor:: Cairo1HintProcessor ,
1212 types:: { builtin_name:: BuiltinName , relocatable:: MaybeRelocatable } ,
13- vm:: runners:: cairo_runner:: { CairoArg , CairoRunner , CairoRunnerBuilder , RunnerMode } ,
13+ vm:: {
14+ errors:: vm_exception:: VmException ,
15+ runners:: cairo_runner:: { CairoArg , CairoRunnerBuilder , RunnerMode } ,
16+ security:: verify_secure_runner,
17+ } ,
1418} ;
1519#[ cfg( feature = "cairo-1-hints" ) ]
1620use cairo_lang_starknet_classes:: casm_contract_class:: CasmContractClass ;
@@ -112,8 +116,10 @@ fn run_cairo_1_entrypoint(
112116 Cairo1HintProcessor :: new ( & contract_class. hints , RunResources :: default ( ) , false ) ;
113117 let program_builtins = get_casm_contract_builtins ( & contract_class, entrypoint_offset) ;
114118
119+ let program = contract_class. clone ( ) . try_into ( ) . unwrap ( ) ;
120+
115121 let mut runner_builder = CairoRunnerBuilder :: new (
116- & ( contract_class . clone ( ) . try_into ( ) . unwrap ( ) ) ,
122+ & program ,
117123 LayoutName :: all_cairo,
118124 None ,
119125 RunnerMode :: ExecutionMode ,
@@ -124,13 +130,12 @@ fn run_cairo_1_entrypoint(
124130 . initialize_builtin_runners ( & program_builtins)
125131 . unwrap ( ) ;
126132 runner_builder. initialize_builtin_segments ( ) ;
127- let mut runner = runner_builder. build ( ) . unwrap ( ) ;
133+ runner_builder. load_program ( ) . unwrap ( ) ;
128134
129135 // Implicit Args
130- let syscall_segment = MaybeRelocatable :: from ( runner . vm . add_memory_segment ( ) ) ;
136+ let syscall_segment = MaybeRelocatable :: from ( runner_builder . add_memory_segment ( ) ) ;
131137
132- let builtin_segment: Vec < MaybeRelocatable > = runner
133- . vm
138+ let builtin_segment: Vec < MaybeRelocatable > = runner_builder
134139 . get_builtin_runners ( )
135140 . iter ( )
136141 . filter ( |b| program_builtins. contains ( & b. name ( ) ) )
@@ -148,28 +153,26 @@ fn run_cairo_1_entrypoint(
148153 // Load builtin costs
149154 let builtin_costs: Vec < MaybeRelocatable > =
150155 vec ! [ 0 . into( ) , 0 . into( ) , 0 . into( ) , 0 . into( ) , 0 . into( ) ] ;
151- let builtin_costs_ptr = runner. vm . add_memory_segment ( ) ;
152- runner
153- . vm
154- . load_data ( builtin_costs_ptr, & builtin_costs)
156+ let builtin_costs_ptr = runner_builder. add_memory_segment ( ) ;
157+ runner_builder
158+ . load_memory ( builtin_costs_ptr, & builtin_costs)
155159 . unwrap ( ) ;
156160
157161 // Load extra data
158- let core_program_end_ptr =
159- ( runner. program_base . unwrap ( ) + runner. program . shared_program_data . data . len ( ) ) . unwrap ( ) ;
162+ let core_program_end_ptr = ( runner_builder. get_program_base ( ) . unwrap ( )
163+ + program. shared_program_data . data . len ( ) )
164+ . unwrap ( ) ;
160165 let program_extra_data: Vec < MaybeRelocatable > =
161166 vec ! [ 0x208B7FFF7FFF7FFE . into( ) , builtin_costs_ptr. into( ) ] ;
162- runner
163- . vm
164- . load_data ( core_program_end_ptr, & program_extra_data)
167+ runner_builder
168+ . load_memory ( core_program_end_ptr, & program_extra_data)
165169 . unwrap ( ) ;
166170
167171 // Load calldata
168- let calldata_start = runner . vm . add_memory_segment ( ) ;
169- let calldata_end = runner . vm . load_data ( calldata_start, args) . unwrap ( ) ;
172+ let calldata_start = runner_builder . add_memory_segment ( ) ;
173+ let calldata_end = runner_builder . load_memory ( calldata_start, args) . unwrap ( ) ;
170174
171175 // Create entrypoint_args
172-
173176 let mut entrypoint_args: Vec < CairoArg > = implicit_args
174177 . iter ( )
175178 . map ( |m| CairoArg :: from ( m. clone ( ) ) )
@@ -180,17 +183,26 @@ fn run_cairo_1_entrypoint(
180183 ] ) ;
181184 let entrypoint_args: Vec < & CairoArg > = entrypoint_args. iter ( ) . collect ( ) ;
182185
183- // Run contract entrypoint
186+ // Initialize entrypoint
187+ let end = runner_builder
188+ . initialize_function_entrypoint_with_args ( entrypoint_offset, & entrypoint_args)
189+ . unwrap ( ) ;
190+ runner_builder. initialize_validation_rules ( ) . unwrap ( ) ;
191+
192+ let mut runner = runner_builder. build ( ) . unwrap ( ) ;
184193
194+ // Run contract entrypoint
185195 runner
186- . run_from_entrypoint (
187- entrypoint_offset,
188- & entrypoint_args,
189- true ,
190- Some ( runner. program . shared_program_data . data . len ( ) + program_extra_data. len ( ) ) ,
191- & mut hint_processor,
192- )
196+ . run_until_pc ( end, & mut hint_processor)
197+ . map_err ( |err| VmException :: from_vm_error ( & runner, err) )
193198 . unwrap ( ) ;
199+ runner. end_run ( true , false , & mut hint_processor) . unwrap ( ) ;
200+ verify_secure_runner (
201+ & runner,
202+ false ,
203+ Some ( program. shared_program_data . data . len ( ) + program_extra_data. len ( ) ) ,
204+ )
205+ . unwrap ( ) ;
194206
195207 // Check return values
196208 let return_values = runner. vm . get_return_values ( 5 ) . unwrap ( ) ;
@@ -218,25 +230,22 @@ fn run_cairo_1_entrypoint_with_run_resources(
218230) -> Result < Vec < Felt252 > , CairoRunError > {
219231 let program_builtins = get_casm_contract_builtins ( & contract_class, entrypoint_offset) ;
220232
233+ let program = contract_class. clone ( ) . try_into ( ) ?;
221234 let mut runner_builder = CairoRunnerBuilder :: new (
222- & ( contract_class . clone ( ) . try_into ( ) . unwrap ( ) ) ,
235+ & program ,
223236 LayoutName :: all_cairo,
224237 None ,
225238 RunnerMode :: ExecutionMode ,
226- )
227- . unwrap ( ) ;
239+ ) ?;
228240 runner_builder. initialize_base_segments ( ) ;
229- runner_builder
230- . initialize_builtin_runners ( & program_builtins)
231- . unwrap ( ) ;
241+ runner_builder. initialize_builtin_runners ( & program_builtins) ?;
232242 runner_builder. initialize_builtin_segments ( ) ;
233- let mut runner = runner_builder. build ( ) . unwrap ( ) ;
243+ runner_builder. load_program ( ) ? ;
234244
235245 // Implicit Args
236- let syscall_segment = MaybeRelocatable :: from ( runner . vm . add_memory_segment ( ) ) ;
246+ let syscall_segment = MaybeRelocatable :: from ( runner_builder . add_memory_segment ( ) ) ;
237247
238- let builtin_segment: Vec < MaybeRelocatable > = runner
239- . vm
248+ let builtin_segment: Vec < MaybeRelocatable > = runner_builder
240249 . get_builtin_runners ( )
241250 . iter ( )
242251 . filter ( |b| program_builtins. contains ( & b. name ( ) ) )
@@ -254,28 +263,21 @@ fn run_cairo_1_entrypoint_with_run_resources(
254263 // Load builtin costs
255264 let builtin_costs: Vec < MaybeRelocatable > =
256265 vec ! [ 0 . into( ) , 0 . into( ) , 0 . into( ) , 0 . into( ) , 0 . into( ) ] ;
257- let builtin_costs_ptr = runner. vm . add_memory_segment ( ) ;
258- runner
259- . vm
260- . load_data ( builtin_costs_ptr, & builtin_costs)
261- . unwrap ( ) ;
266+ let builtin_costs_ptr = runner_builder. add_memory_segment ( ) ;
267+ runner_builder. load_memory ( builtin_costs_ptr, & builtin_costs) ?;
262268
263269 // Load extra data
264- let core_program_end_ptr =
265- ( runner. program_base . unwrap ( ) + runner. program . shared_program_data . data . len ( ) ) . unwrap ( ) ;
270+ let core_program_end_ptr = ( runner_builder. get_program_base ( ) . unwrap ( )
271+ + program. shared_program_data . data . len ( ) )
272+ . unwrap ( ) ;
266273 let program_extra_data: Vec < MaybeRelocatable > =
267274 vec ! [ 0x208B7FFF7FFF7FFE . into( ) , builtin_costs_ptr. into( ) ] ;
268- runner
269- . vm
270- . load_data ( core_program_end_ptr, & program_extra_data)
271- . unwrap ( ) ;
275+ runner_builder. load_memory ( core_program_end_ptr, & program_extra_data) ?;
272276
273277 // Load calldata
274- let calldata_start = runner. vm . add_memory_segment ( ) ;
275- let calldata_end = runner. vm . load_data ( calldata_start, args) . unwrap ( ) ;
276-
278+ let calldata_start = runner_builder. add_memory_segment ( ) ;
279+ let calldata_end = runner_builder. load_memory ( calldata_start, args) ?;
277280 // Create entrypoint_args
278-
279281 let mut entrypoint_args: Vec < CairoArg > = implicit_args
280282 . iter ( )
281283 . map ( |m| CairoArg :: from ( m. clone ( ) ) )
@@ -286,14 +288,22 @@ fn run_cairo_1_entrypoint_with_run_resources(
286288 ] ) ;
287289 let entrypoint_args: Vec < & CairoArg > = entrypoint_args. iter ( ) . collect ( ) ;
288290
289- // Run contract entrypoint
291+ // Initialize entrypoint
292+ let end = runner_builder
293+ . initialize_function_entrypoint_with_args ( entrypoint_offset, & entrypoint_args) ?;
294+ runner_builder. initialize_validation_rules ( ) ?;
295+
296+ let mut runner = runner_builder. build ( ) ?;
290297
291- runner. run_from_entrypoint (
292- entrypoint_offset,
293- & entrypoint_args,
294- true ,
295- Some ( runner. program . shared_program_data . data . len ( ) + program_extra_data. len ( ) ) ,
296- hint_processor,
298+ // Run contract entrypoint
299+ runner
300+ . run_until_pc ( end, hint_processor)
301+ . map_err ( |err| VmException :: from_vm_error ( & runner, err) ) ?;
302+ runner. end_run ( true , false , hint_processor) ?;
303+ verify_secure_runner (
304+ & runner,
305+ false ,
306+ Some ( program. shared_program_data . data . len ( ) + program_extra_data. len ( ) ) ,
297307 ) ?;
298308
299309 // Check return values
0 commit comments