44
55use std:: collections:: HashMap ;
66use std:: io:: { self , Read } ;
7+ use std:: sync:: LazyLock ;
78
8- use apollo_gateway:: errors:: serde_err_to_state_err;
9+ use apollo_compile_to_casm:: { create_sierra_compiler, SierraCompiler } ;
10+ use apollo_compile_to_casm_types:: RawClass ;
11+ use apollo_sierra_compilation_config:: config:: {
12+ SierraCompilationConfig ,
13+ DEFAULT_MAX_BYTECODE_SIZE ,
14+ } ;
915use blockifier:: state:: state_api:: StateResult ;
10- use cairo_lang_starknet_classes:: contract_class:: ContractEntryPoints ;
11- use cairo_lang_utils:: bigint:: BigUintAsHex ;
1216use flate2:: bufread;
13- use serde:: Deserialize ;
1417use starknet_api:: contract_class:: { ContractClass , EntryPointType , SierraVersion } ;
1518use starknet_api:: core:: EntryPointSelector ;
1619use starknet_api:: deprecated_contract_class:: {
@@ -20,19 +23,20 @@ use starknet_api::deprecated_contract_class::{
2023 Program ,
2124} ;
2225use starknet_api:: hash:: StarkHash ;
26+ use starknet_api:: state:: SierraContractClass ;
2327use starknet_core:: types:: {
2428 CompressedLegacyContractClass ,
2529 FlattenedSierraClass ,
2630 LegacyContractEntryPoint ,
2731 LegacyEntryPointsByType ,
2832} ;
2933
30- # [ derive ( Debug , Deserialize ) ]
31- pub struct MiddleSierraContractClass {
32- pub sierra_program : Vec < BigUintAsHex > ,
33- pub contract_class_version : String ,
34- pub entry_points_by_type : ContractEntryPoints ,
35- }
34+ static SIERRA_COMPILER : LazyLock < SierraCompiler > = LazyLock :: new ( || {
35+ create_sierra_compiler ( SierraCompilationConfig {
36+ max_bytecode_size : 10 * DEFAULT_MAX_BYTECODE_SIZE ,
37+ .. Default :: default ( )
38+ } )
39+ } ) ;
3640
3741/// Maps `LegacyEntryPointsByType` to a `HashMap` where each `EntryPointType`
3842/// is associated with a vector of `EntryPoint`. Converts selectors and offsets
@@ -73,37 +77,30 @@ pub fn decode_reader(bytes: Vec<u8>) -> io::Result<String> {
7377}
7478
7579/// Compile a FlattenedSierraClass to a versioned ContractClass V1 (casm) using
76- /// cairo_lang_starknet_classes .
80+ /// apollo_compile_to_casm .
7781pub fn sierra_to_versioned_contract_class_v1 (
78- sierra : FlattenedSierraClass ,
82+ flattened_sierra : FlattenedSierraClass ,
7983) -> StateResult < ( ContractClass , SierraVersion ) > {
80- let middle_sierra: MiddleSierraContractClass = {
81- let v = serde_json:: to_value ( sierra) . map_err ( serde_err_to_state_err) ;
82- serde_json:: from_value ( v?) . map_err ( serde_err_to_state_err) ?
83- } ;
84- let sierra = cairo_lang_starknet_classes:: contract_class:: ContractClass {
85- sierra_program : middle_sierra. sierra_program ,
86- contract_class_version : middle_sierra. contract_class_version ,
87- entry_points_by_type : middle_sierra. entry_points_by_type ,
88- sierra_program_debug_info : None ,
89- abi : None ,
90- } ;
91-
92- let sierra_program_values =
93- sierra. sierra_program . iter ( ) . take ( 3 ) . map ( |felt| felt. value . clone ( ) ) . collect :: < Vec < _ > > ( ) ;
94-
95- let sierra_version = SierraVersion :: extract_from_program ( & sierra_program_values) . unwrap ( ) ;
84+ let serde_value = serde_json:: to_value ( & flattened_sierra)
85+ . unwrap_or_else ( |err| panic ! ( "Failed to serialize flattened Sierra: {err}" ) ) ;
86+ let sierra_contract: SierraContractClass =
87+ serde_json:: from_value ( serde_value) . unwrap_or_else ( |err| {
88+ panic ! (
89+ "Failed to deserialize SierraContractClass: {err} for flattened_sierra: \
90+ {flattened_sierra:?}"
91+ ) ;
92+ } ) ;
93+ let sierra_version = SierraVersion :: extract_from_program ( & sierra_contract. sierra_program )
94+ . unwrap_or_else ( |err| panic ! ( "Failed to extract Sierra version: {err}" ) ) ;
95+ let raw_class = RawClass :: try_from ( sierra_contract)
96+ . unwrap_or_else ( |err| panic ! ( "Failed to convert SierraContractClass into RawClass: {err}" ) ) ;
97+ let ( raw_executable_class, _) = SIERRA_COMPILER
98+ . compile ( raw_class)
99+ . unwrap_or_else ( |err| panic ! ( "Failed to compile Sierra to Casm: {err}" ) ) ;
100+ let contract_class: ContractClass = serde_json:: from_value ( raw_executable_class. into_value ( ) )
101+ . unwrap_or_else ( |err| panic ! ( "Failed to deserialize ContractClass: {err}" ) ) ;
96102
97- let casm =
98- cairo_lang_starknet_classes:: casm_contract_class:: CasmContractClass :: from_contract_class (
99- sierra,
100- false ,
101- usize:: MAX ,
102- )
103- // TODO(Aviv): Reconsider the unwrap.
104- . unwrap ( ) ;
105- // TODO(AVIV): return only ContractClass.
106- Ok ( ( ContractClass :: V1 ( ( casm, sierra_version. clone ( ) ) ) , sierra_version) )
103+ Ok ( ( contract_class, sierra_version) )
107104}
108105
109106/// Compile a CompressedLegacyContractClass to a ContractClass V0 using cairo_lang_starknet_classes.
0 commit comments