@@ -4,6 +4,7 @@ use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
44use num_bigint:: BigUint ;
55use serde:: { Deserialize , Serialize } ;
66use serde_json:: Value ;
7+ use starknet_types_core:: felt:: Felt as Felt252 ;
78use thiserror:: Error ;
89
910use crate :: abi:: Contract ;
@@ -58,14 +59,24 @@ impl ContractClass {
5859 } )
5960 }
6061
61- /// Extracts Sierra program from the ContractClass and populates it with debug info if
62- /// available.
63- pub fn extract_sierra_program ( & self ) -> Result < sierra:: program:: Program , Felt252SerdeError > {
64- let ( _, _, mut sierra_program) = sierra_from_felt252s ( & self . sierra_program ) ?;
65- if let Some ( info) = & self . sierra_program_debug_info {
66- info. populate ( & mut sierra_program) ;
62+ /// Extracts Sierra program from the ContractClass into `ExtractedSierraProgram` and populates
63+ /// it with debug info if `populate_debug_info` is true, and the data is available.
64+ pub fn extract_sierra_program (
65+ & self ,
66+ populate_debug_info : bool ,
67+ ) -> Result < ExtractedSierraProgram , Felt252SerdeError > {
68+ let prime = Felt252 :: prime ( ) ;
69+ for felt252 in & self . sierra_program {
70+ if felt252. value >= prime {
71+ return Err ( Felt252SerdeError :: InvalidInputForDeserialization ) ;
72+ }
73+ }
74+ let ( sierra_version, compiler_version, mut program) =
75+ sierra_from_felt252s ( & self . sierra_program ) ?;
76+ if populate_debug_info && let Some ( info) = & self . sierra_program_debug_info {
77+ info. populate ( & mut program) ;
6778 }
68- Ok ( sierra_program )
79+ Ok ( ExtractedSierraProgram { program , sierra_version , compiler_version } )
6980 }
7081
7182 /// Sanity checks the contract class.
@@ -79,26 +90,35 @@ impl ContractClass {
7990 ) ;
8091 }
8192 }
93+ }
8294
95+ /// The Sierra program extracted from a contract class.
96+ pub struct ExtractedSierraProgram {
97+ /// The actual Sierra program.
98+ pub program : sierra:: program:: Program ,
99+ /// The Sierra version used for the program.
100+ pub sierra_version : VersionId ,
101+ /// The compiler version used for the program.
102+ pub compiler_version : VersionId ,
103+ }
104+ impl ExtractedSierraProgram {
83105 /// Checks that all the used libfuncs in the contract class are allowed in the contract class
84106 /// Sierra version.
85107 pub fn validate_version_compatible (
86- self : & ContractClass ,
108+ & self ,
87109 list_selector : ListSelector ,
88110 ) -> Result < ( ) , AllowedLibfuncsError > {
89111 let list_name = list_selector. to_string ( ) ;
90112 let allowed_libfuncs = lookup_allowed_libfuncs_list ( list_selector) ?;
91- let ( class_version, _, sierra_program) = sierra_from_felt252s ( & self . sierra_program )
92- . map_err ( |_| AllowedLibfuncsError :: SierraProgramError ) ?;
93- for libfunc in & sierra_program. libfunc_declarations {
113+ for libfunc in & self . program . libfunc_declarations {
94114 match allowed_libfuncs. allowed_libfuncs . get ( & libfunc. long_id . generic_id ) {
95115 Some ( None ) => { }
96- Some ( Some ( required_version ) ) if class_version . supports ( * required_version ) => { }
97- Some ( Some ( required_version ) ) => {
116+ Some ( Some ( required ) ) if self . sierra_version . supports ( * required ) => { }
117+ Some ( Some ( required ) ) => {
98118 return Err ( AllowedLibfuncsError :: UnsupportedLibfuncAtVersion {
99119 invalid_libfunc : libfunc. long_id . generic_id . to_string ( ) ,
100- required_version : * required_version ,
101- class_version,
120+ required_version : * required ,
121+ class_version : self . sierra_version ,
102122 } ) ;
103123 }
104124 None => {
0 commit comments