1
1
use assert_matches:: assert_matches;
2
2
use blockifier:: execution:: contract_class:: ContractClass ;
3
3
use cairo_lang_starknet_classes:: allowed_libfuncs:: AllowedLibfuncsError ;
4
+ use rstest:: rstest;
4
5
use starknet_api:: core:: CompiledClassHash ;
5
6
use starknet_api:: rpc_transaction:: { RPCDeclareTransaction , RPCTransaction } ;
6
7
use starknet_sierra_compile:: errors:: CompilationUtilError ;
7
8
use test_utils:: starknet_api_test_utils:: declare_tx;
8
9
9
- use crate :: compilation:: compile_contract_class;
10
+ use crate :: compilation:: { compile_contract_class, SierraToCasmCompilationConfig } ;
10
11
use crate :: errors:: GatewayError ;
11
12
13
+ const SIERRA_TO_CASM_COMPILATION_CONFIG : SierraToCasmCompilationConfig =
14
+ SierraToCasmCompilationConfig { max_bytecode_size : usize:: MAX , max_raw_class_size : usize:: MAX } ;
15
+
12
16
#[ test]
13
17
fn test_compile_contract_class_compiled_class_hash_missmatch ( ) {
14
18
let mut tx = assert_matches ! (
@@ -21,14 +25,57 @@ fn test_compile_contract_class_compiled_class_hash_missmatch() {
21
25
tx. compiled_class_hash = supplied_hash;
22
26
let declare_tx = RPCDeclareTransaction :: V3 ( tx) ;
23
27
24
- let result = compile_contract_class ( & declare_tx) ;
28
+ let result = compile_contract_class ( & declare_tx, SIERRA_TO_CASM_COMPILATION_CONFIG ) ;
25
29
assert_matches ! (
26
30
result. unwrap_err( ) ,
27
31
GatewayError :: CompiledClassHashMismatch { supplied, hash_result }
28
32
if supplied == supplied_hash && hash_result == expected_hash_result
29
33
) ;
30
34
}
31
35
36
+ #[ rstest]
37
+ #[ case:: bytecode_size(
38
+ SierraToCasmCompilationConfig { max_bytecode_size: 1 , max_raw_class_size: usize :: MAX } ,
39
+ GatewayError :: CasmBytecodeSizeTooLarge { bytecode_size: 4800 , max_bytecode_size: 1 }
40
+ ) ]
41
+ #[ case:: raw_class_size(
42
+ SierraToCasmCompilationConfig { max_bytecode_size: usize :: MAX , max_raw_class_size: 1 } ,
43
+ GatewayError :: CasmContractClassObjectSizeTooLarge {
44
+ contract_class_object_size: 111037 , max_contract_class_object_size: 1
45
+ }
46
+ ) ]
47
+ fn test_compile_contract_class_size_validation (
48
+ #[ case] sierra_to_casm_compilation_config : SierraToCasmCompilationConfig ,
49
+ #[ case] expected_error : GatewayError ,
50
+ ) {
51
+ let declare_tx = match declare_tx ( ) {
52
+ RPCTransaction :: Declare ( declare_tx) => declare_tx,
53
+ _ => panic ! ( "Invalid transaction type" ) ,
54
+ } ;
55
+
56
+ let result = compile_contract_class ( & declare_tx, sierra_to_casm_compilation_config) ;
57
+ if let GatewayError :: CasmBytecodeSizeTooLarge {
58
+ bytecode_size : expected_bytecode_size, ..
59
+ } = expected_error
60
+ {
61
+ assert_matches ! (
62
+ result. unwrap_err( ) ,
63
+ GatewayError :: CasmBytecodeSizeTooLarge { bytecode_size, .. }
64
+ if bytecode_size == expected_bytecode_size
65
+ )
66
+ } else if let GatewayError :: CasmContractClassObjectSizeTooLarge {
67
+ contract_class_object_size : expected_contract_class_object_size,
68
+ ..
69
+ } = expected_error
70
+ {
71
+ assert_matches ! (
72
+ result. unwrap_err( ) ,
73
+ GatewayError :: CasmContractClassObjectSizeTooLarge { contract_class_object_size, .. }
74
+ if contract_class_object_size == expected_contract_class_object_size
75
+ )
76
+ }
77
+ }
78
+
32
79
#[ test]
33
80
fn test_compile_contract_class_bad_sierra ( ) {
34
81
let mut tx = assert_matches ! (
@@ -39,7 +86,7 @@ fn test_compile_contract_class_bad_sierra() {
39
86
tx. contract_class . sierra_program = tx. contract_class . sierra_program [ ..100 ] . to_vec ( ) ;
40
87
let declare_tx = RPCDeclareTransaction :: V3 ( tx) ;
41
88
42
- let result = compile_contract_class ( & declare_tx) ;
89
+ let result = compile_contract_class ( & declare_tx, SIERRA_TO_CASM_COMPILATION_CONFIG ) ;
43
90
assert_matches ! (
44
91
result. unwrap_err( ) ,
45
92
GatewayError :: CompilationError ( CompilationUtilError :: AllowedLibfuncsError (
@@ -57,7 +104,8 @@ fn test_compile_contract_class() {
57
104
let RPCDeclareTransaction :: V3 ( declare_tx_v3) = & declare_tx;
58
105
let contract_class = & declare_tx_v3. contract_class ;
59
106
60
- let class_info = compile_contract_class ( & declare_tx) . unwrap ( ) ;
107
+ let class_info =
108
+ compile_contract_class ( & declare_tx, SIERRA_TO_CASM_COMPILATION_CONFIG ) . unwrap ( ) ;
61
109
assert_matches ! ( class_info. contract_class( ) , ContractClass :: V1 ( _) ) ;
62
110
assert_eq ! ( class_info. sierra_program_length( ) , contract_class. sierra_program. len( ) ) ;
63
111
assert_eq ! ( class_info. abi_length( ) , contract_class. abi. len( ) ) ;
0 commit comments