1
+ use std:: collections:: BTreeMap ;
2
+
1
3
use apollo_starknet_os_program:: { AGGREGATOR_PROGRAM , OS_PROGRAM } ;
2
4
use blockifier:: state:: state_api:: StateReader ;
5
+ use cairo_lang_starknet_classes:: casm_contract_class:: CasmContractClass ;
3
6
use cairo_vm:: cairo_run:: CairoRunConfig ;
4
7
use cairo_vm:: hint_processor:: hint_processor_definition:: HintProcessor ;
5
8
use cairo_vm:: types:: layout_name:: LayoutName ;
6
9
use cairo_vm:: types:: program:: Program ;
7
10
use cairo_vm:: vm:: errors:: vm_exception:: VmException ;
8
11
use cairo_vm:: vm:: runners:: cairo_pie:: CairoPie ;
9
12
use cairo_vm:: vm:: runners:: cairo_runner:: CairoRunner ;
10
- #[ cfg( feature = "include_program_output" ) ]
13
+ use starknet_api:: core:: CompiledClassHash ;
14
+ use starknet_api:: deprecated_contract_class:: ContractClass ;
11
15
use starknet_types_core:: felt:: Felt ;
12
16
13
17
use crate :: errors:: StarknetOsError ;
14
18
use crate :: hint_processor:: aggregator_hint_processor:: { AggregatorHintProcessor , AggregatorInput } ;
15
19
use crate :: hint_processor:: common_hint_processor:: CommonHintProcessor ;
20
+ use crate :: hint_processor:: os_logger:: OsTransactionTrace ;
16
21
use crate :: hint_processor:: panicking_state_reader:: PanickingStateReader ;
17
22
use crate :: hint_processor:: snos_hint_processor:: SnosHintProcessor ;
18
- use crate :: io:: os_input:: { OsHints , StarknetOsInput } ;
23
+ use crate :: io:: os_input:: {
24
+ CachedStateInput ,
25
+ OsBlockInput ,
26
+ OsHints ,
27
+ OsHintsConfig ,
28
+ StarknetOsInput ,
29
+ } ;
19
30
use crate :: io:: os_output:: { StarknetAggregatorRunnerOutput , StarknetOsRunnerOutput } ;
20
31
use crate :: metrics:: OsMetrics ;
21
32
@@ -105,6 +116,33 @@ pub fn run_os<S: StateReader>(
105
116
} : OsHints ,
106
117
state_readers : Vec < S > ,
107
118
) -> Result < StarknetOsRunnerOutput , StarknetOsError > {
119
+ let ( runner_output, snos_hint_processor) = create_hint_processor_and_run_os (
120
+ layout,
121
+ os_hints_config,
122
+ & os_block_inputs,
123
+ cached_state_inputs,
124
+ deprecated_compiled_classes,
125
+ compiled_classes,
126
+ state_readers,
127
+ public_key_x,
128
+ public_key_y,
129
+ ) ?;
130
+
131
+ generate_os_output ( runner_output, snos_hint_processor)
132
+ }
133
+
134
+ #[ allow( clippy:: too_many_arguments) ]
135
+ fn create_hint_processor_and_run_os < ' a , S : StateReader > (
136
+ layout : LayoutName ,
137
+ os_hints_config : OsHintsConfig ,
138
+ os_block_inputs : & ' a [ OsBlockInput ] ,
139
+ cached_state_inputs : Vec < CachedStateInput > ,
140
+ deprecated_compiled_classes : BTreeMap < CompiledClassHash , ContractClass > ,
141
+ compiled_classes : BTreeMap < CompiledClassHash , CasmContractClass > ,
142
+ state_readers : Vec < S > ,
143
+ public_key_x : Felt ,
144
+ public_key_y : Felt ,
145
+ ) -> Result < ( RunnerReturnObject , SnosHintProcessor < ' a , S > ) , StarknetOsError > {
108
146
// Create the hint processor.
109
147
let mut snos_hint_processor = SnosHintProcessor :: new (
110
148
& OS_PROGRAM ,
@@ -118,8 +156,16 @@ pub fn run_os<S: StateReader>(
118
156
public_key_y,
119
157
) ?;
120
158
121
- let mut runner_output = run_program ( layout, & OS_PROGRAM , & mut snos_hint_processor) ?;
159
+ // Run the OS program.
160
+ let runner_output = run_program ( layout, & OS_PROGRAM , & mut snos_hint_processor) ?;
161
+
162
+ Ok ( ( runner_output, snos_hint_processor) )
163
+ }
122
164
165
+ fn generate_os_output (
166
+ mut runner_output : RunnerReturnObject ,
167
+ mut snos_hint_processor : SnosHintProcessor < ' _ , impl StateReader > ,
168
+ ) -> Result < StarknetOsRunnerOutput , StarknetOsError > {
123
169
Ok ( StarknetOsRunnerOutput {
124
170
#[ cfg( feature = "include_program_output" ) ]
125
171
os_output : {
@@ -143,6 +189,43 @@ pub fn run_os<S: StateReader>(
143
189
} )
144
190
}
145
191
192
+ /// Runs the OS the same way as `run_os`. Returns also the transactions trace which are needed for
193
+ /// some tests.
194
+ #[ cfg( any( test, feature = "testing" ) ) ]
195
+ pub fn run_os_for_testing < S : StateReader > (
196
+ layout : LayoutName ,
197
+ OsHints {
198
+ os_hints_config,
199
+ os_input :
200
+ StarknetOsInput {
201
+ os_block_inputs,
202
+ cached_state_inputs,
203
+ deprecated_compiled_classes,
204
+ compiled_classes,
205
+ public_key_x,
206
+ public_key_y,
207
+ } ,
208
+ } : OsHints ,
209
+ state_readers : Vec < S > ,
210
+ ) -> Result < ( StarknetOsRunnerOutput , Vec < OsTransactionTrace > ) , StarknetOsError > {
211
+ let ( runner_output, snos_hint_processor) = create_hint_processor_and_run_os (
212
+ layout,
213
+ os_hints_config,
214
+ & os_block_inputs,
215
+ cached_state_inputs,
216
+ deprecated_compiled_classes,
217
+ compiled_classes,
218
+ state_readers,
219
+ public_key_x,
220
+ public_key_y,
221
+ ) ?;
222
+
223
+ let txs_trace: Vec < OsTransactionTrace > =
224
+ snos_hint_processor. get_current_execution_helper ( ) . unwrap ( ) . os_logger . get_txs ( ) . clone ( ) ;
225
+
226
+ Ok ( ( generate_os_output ( runner_output, snos_hint_processor) ?, txs_trace) )
227
+ }
228
+
146
229
/// Run the OS with a "stateless" state reader - panics if the state is accessed for data that was
147
230
/// not pre-loaded as part of the input.
148
231
pub fn run_os_stateless (
@@ -153,6 +236,14 @@ pub fn run_os_stateless(
153
236
run_os ( layout, os_hints, vec ! [ PanickingStateReader ; n_blocks] )
154
237
}
155
238
239
+ pub fn run_os_stateless_for_testing (
240
+ layout : LayoutName ,
241
+ os_hints : OsHints ,
242
+ ) -> Result < ( StarknetOsRunnerOutput , Vec < OsTransactionTrace > ) , StarknetOsError > {
243
+ let n_blocks = os_hints. os_input . os_block_inputs . len ( ) ;
244
+ run_os_for_testing ( layout, os_hints, vec ! [ PanickingStateReader ; n_blocks] )
245
+ }
246
+
156
247
/// Run the Aggregator.
157
248
pub fn run_aggregator (
158
249
layout : LayoutName ,
0 commit comments