@@ -7,23 +7,31 @@ use cairo_lang_starknet_classes::contract_class::ContractClass;
7
7
use cairo_native:: executor:: AotContractExecutor ;
8
8
use starknet_api:: contract_class:: SierraVersion ;
9
9
10
+ #[ derive( Debug , thiserror:: Error ) ]
11
+ pub enum NativeCompilationError {
12
+ #[ error( "Unsupported Sierra version {0}. cairo-native requires version 1.7.0 or later." ) ]
13
+ UnsupportedSierraVersion ( String ) ,
14
+ }
15
+
10
16
/// Compiles a given Sierra [`ContractClass`] into an [`AotContractExecutor`] for `cairo-native` execution.
11
- #[ must_use]
12
- pub fn compile_contract_class ( contract_class : & ContractClass ) -> AotContractExecutor {
17
+ pub fn compile_contract_class (
18
+ contract_class : & ContractClass ,
19
+ ) -> Result < AotContractExecutor , NativeCompilationError > {
20
+ let sierra_version = extract_sierra_version ( contract_class) ;
21
+ check_sierra_version ( & sierra_version) ?;
22
+
13
23
let sierra_program = contract_class
14
24
. extract_sierra_program ( )
15
25
. expect ( "extraction should succeed" ) ;
16
26
17
- let sierra_version = extract_sierra_version ( contract_class) ;
18
-
19
- AotContractExecutor :: new (
27
+ Ok ( AotContractExecutor :: new (
20
28
& sierra_program,
21
29
& contract_class. entry_points_by_type ,
22
30
sierra_version. clone ( ) . into ( ) ,
23
31
cairo_native:: OptLevel :: Default ,
24
32
None ,
25
33
)
26
- . expect ( "compilation should succeed" )
34
+ . expect ( "compilation should succeed" ) )
27
35
}
28
36
29
37
/// Extracts the Sierra version from the given [`ContractClass`].
@@ -38,3 +46,15 @@ fn extract_sierra_version(contract_class: &ContractClass) -> SierraVersion {
38
46
SierraVersion :: extract_from_program ( & sierra_version_values)
39
47
. expect ( "version extraction should succeed" )
40
48
}
49
+
50
+ /// Checks if the given Sierra version is supported by `cairo-native`.
51
+ fn check_sierra_version ( sierra_version : & SierraVersion ) -> Result < ( ) , NativeCompilationError > {
52
+ let minimal_supported_version = SierraVersion :: new ( 1 , 7 , 0 ) ;
53
+ if sierra_version < & minimal_supported_version {
54
+ Err ( NativeCompilationError :: UnsupportedSierraVersion (
55
+ sierra_version. to_string ( ) ,
56
+ ) )
57
+ } else {
58
+ Ok ( ( ) )
59
+ }
60
+ }
0 commit comments