@@ -5,6 +5,7 @@ use blockifier::execution::contract_class::{ClassInfo, ContractClass, ContractCl
5
5
use cairo_lang_starknet_classes:: casm_contract_class:: {
6
6
CasmContractClass , CasmContractEntryPoints ,
7
7
} ;
8
+ use cairo_lang_starknet_classes:: contract_class:: ContractClass as CairoLangContractClass ;
8
9
use starknet_api:: core:: CompiledClassHash ;
9
10
use starknet_api:: rpc_transaction:: RPCDeclareTransaction ;
10
11
use starknet_sierra_compile:: compile:: compile_sierra_to_casm;
@@ -29,44 +30,37 @@ impl GatewayCompiler {
29
30
/// Formats the contract class for compilation, compiles it, and returns the compiled contract
30
31
/// class wrapped in a [`ClassInfo`].
31
32
/// Assumes the contract class is of a Sierra program which is compiled to Casm.
32
- pub fn compile_contract_class (
33
+ pub fn process_declare_tx (
33
34
& self ,
34
35
declare_tx : & RPCDeclareTransaction ,
35
36
) -> GatewayResult < ClassInfo > {
36
37
let RPCDeclareTransaction :: V3 ( tx) = declare_tx;
37
- let starknet_api_contract_class = & tx. contract_class ;
38
- let cairo_lang_contract_class =
39
- into_contract_class_for_compilation ( starknet_api_contract_class) ;
38
+ let rpc_contract_class = & tx. contract_class ;
39
+ let cairo_lang_contract_class = into_contract_class_for_compilation ( rpc_contract_class) ;
40
40
41
- // Compile Sierra to Casm.
42
- let catch_unwind_result =
43
- panic:: catch_unwind ( || compile_sierra_to_casm ( cairo_lang_contract_class) ) ;
44
- let casm_contract_class = match catch_unwind_result {
45
- Ok ( compilation_result) => compilation_result?,
46
- Err ( _) => {
47
- // TODO(Arni): Log the panic.
48
- return Err ( GatewayError :: CompilationError ( CompilationUtilError :: CompilationPanic ) ) ;
49
- }
50
- } ;
41
+ let casm_contract_class = self . compile ( cairo_lang_contract_class) ?;
42
+
43
+ validate_compiled_class_hash ( & casm_contract_class, & tx. compiled_class_hash ) ?;
51
44
self . validate_casm_class ( & casm_contract_class) ?;
52
45
53
- let hash_result = CompiledClassHash ( casm_contract_class. compiled_class_hash ( ) ) ;
54
- if hash_result != tx. compiled_class_hash {
55
- return Err ( GatewayError :: CompiledClassHashMismatch {
56
- supplied : tx. compiled_class_hash ,
57
- hash_result,
58
- } ) ;
59
- }
46
+ Ok ( ClassInfo :: new (
47
+ & ContractClass :: V1 ( ContractClassV1 :: try_from ( casm_contract_class) ?) ,
48
+ rpc_contract_class. sierra_program . len ( ) ,
49
+ rpc_contract_class. abi . len ( ) ,
50
+ ) ?)
51
+ }
60
52
61
- // Convert Casm contract class to Starknet contract class directly.
62
- let blockifier_contract_class =
63
- ContractClass :: V1 ( ContractClassV1 :: try_from ( casm_contract_class) ?) ;
64
- let class_info = ClassInfo :: new (
65
- & blockifier_contract_class,
66
- starknet_api_contract_class. sierra_program . len ( ) ,
67
- starknet_api_contract_class. abi . len ( ) ,
68
- ) ?;
69
- Ok ( class_info)
53
+ /// TODO(Arni): Pass the compilation args from the config.
54
+ fn compile (
55
+ & self ,
56
+ cairo_lang_contract_class : CairoLangContractClass ,
57
+ ) -> Result < CasmContractClass , GatewayError > {
58
+ let catch_unwind_result =
59
+ panic:: catch_unwind ( || compile_sierra_to_casm ( cairo_lang_contract_class) ) ;
60
+ let casm_contract_class =
61
+ catch_unwind_result. map_err ( |_| CompilationUtilError :: CompilationPanic ) ??;
62
+
63
+ Ok ( casm_contract_class)
70
64
}
71
65
72
66
// TODO(Arni): Add test.
@@ -101,3 +95,19 @@ fn supported_builtins() -> &'static Vec<String> {
101
95
SUPPORTED_BUILTIN_NAMES . iter ( ) . map ( |builtin| builtin. to_string ( ) ) . collect :: < Vec < String > > ( )
102
96
} )
103
97
}
98
+
99
+ /// Validates that the compiled class hash of the compiled contract class matches the supplied
100
+ /// compiled class hash.
101
+ fn validate_compiled_class_hash (
102
+ casm_contract_class : & CasmContractClass ,
103
+ supplied_compiled_class_hash : & CompiledClassHash ,
104
+ ) -> Result < ( ) , GatewayError > {
105
+ let compiled_class_hash = CompiledClassHash ( casm_contract_class. compiled_class_hash ( ) ) ;
106
+ if compiled_class_hash != * supplied_compiled_class_hash {
107
+ return Err ( GatewayError :: CompiledClassHashMismatch {
108
+ supplied : * supplied_compiled_class_hash,
109
+ hash_result : compiled_class_hash,
110
+ } ) ;
111
+ }
112
+ Ok ( ( ) )
113
+ }
0 commit comments