44
55use std:: collections:: HashMap ;
66use std:: io:: { self , Read } ;
7+ use std:: sync:: LazyLock ;
78
9+ use apollo_compile_to_casm:: { create_sierra_compiler, SierraCompiler } ;
10+ use apollo_compile_to_casm_types:: RawClass ;
811use apollo_gateway:: errors:: serde_err_to_state_err;
12+ use apollo_sierra_compilation_config:: config:: SierraCompilationConfig ;
13+ use blockifier:: state:: errors:: StateError ;
914use blockifier:: state:: state_api:: StateResult ;
10- use cairo_lang_starknet_classes:: contract_class:: ContractEntryPoints ;
11- use cairo_lang_utils:: bigint:: BigUintAsHex ;
1215use flate2:: bufread;
13- use serde:: Deserialize ;
1416use starknet_api:: contract_class:: { ContractClass , EntryPointType , SierraVersion } ;
1517use starknet_api:: core:: EntryPointSelector ;
1618use starknet_api:: deprecated_contract_class:: {
@@ -20,19 +22,16 @@ use starknet_api::deprecated_contract_class::{
2022 Program ,
2123} ;
2224use starknet_api:: hash:: StarkHash ;
25+ use starknet_api:: state:: SierraContractClass ;
2326use starknet_core:: types:: {
2427 CompressedLegacyContractClass ,
2528 FlattenedSierraClass ,
2629 LegacyContractEntryPoint ,
2730 LegacyEntryPointsByType ,
2831} ;
2932
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- }
33+ static SIERRA_COMPILER : LazyLock < SierraCompiler > =
34+ LazyLock :: new ( || create_sierra_compiler ( SierraCompilationConfig :: default ( ) ) ) ;
3635
3736/// Maps `LegacyEntryPointsByType` to a `HashMap` where each `EntryPointType`
3837/// is associated with a vector of `EntryPoint`. Converts selectors and offsets
@@ -77,33 +76,19 @@ pub fn decode_reader(bytes: Vec<u8>) -> io::Result<String> {
7776pub fn sierra_to_versioned_contract_class_v1 (
7877 sierra : FlattenedSierraClass ,
7978) -> 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 ( ) ;
79+ let serde_value = serde_json:: to_value ( & sierra) . map_err ( serde_err_to_state_err) ?;
80+ let sierra_contract: SierraContractClass =
81+ serde_json:: from_value ( serde_value) . map_err ( serde_err_to_state_err) ?;
82+ let sierra_version = SierraVersion :: extract_from_program ( & sierra_contract. sierra_program )
83+ . map_err ( StateError :: from) ?;
84+ let raw_class = RawClass :: try_from ( sierra_contract. clone ( ) ) . map_err ( serde_err_to_state_err) ?;
85+ let ( raw_executable_class, _) = SIERRA_COMPILER
86+ . compile ( raw_class)
87+ . map_err ( |err| StateError :: StateReadError ( format ! ( "Failed to compile Sierra: {err}" ) ) ) ?;
88+ let contract_class: ContractClass = serde_json:: from_value ( raw_executable_class. into_value ( ) )
89+ . map_err ( serde_err_to_state_err) ?;
9690
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) )
91+ Ok ( ( contract_class, sierra_version) )
10792}
10893
10994/// Compile a CompressedLegacyContractClass to a ContractClass V0 using cairo_lang_starknet_classes.
0 commit comments