@@ -20,7 +20,9 @@ use tokio::task;
20
20
21
21
use crate :: config:: { StatefulTransactionValidatorConfig , StatelessTransactionValidatorConfig } ;
22
22
use crate :: errors:: GatewayError ;
23
- use crate :: gateway:: { add_tx, compile_contract_class, AppState , SharedMempoolClient } ;
23
+ use crate :: gateway:: {
24
+ add_tx, compile_contract_class, AppState , SharedMempoolClient , SierraToCasmCompilationConfig ,
25
+ } ;
24
26
use crate :: starknet_api_test_utils:: { declare_tx, deploy_account_tx, invoke_tx} ;
25
27
use crate :: state_reader_test_utils:: {
26
28
local_test_state_reader_factory, local_test_state_reader_factory_for_deploy_account,
@@ -31,6 +33,8 @@ use crate::stateless_transaction_validator::StatelessTransactionValidator;
31
33
use crate :: utils:: { external_tx_to_account_tx, get_tx_hash} ;
32
34
33
35
const MEMPOOL_INVOCATIONS_QUEUE_SIZE : usize = 32 ;
36
+ const SIERRA_TO_CASM_COMPILATION_CONFIG : SierraToCasmCompilationConfig =
37
+ SierraToCasmCompilationConfig { max_bytecode_size : usize:: MAX , max_raw_class_size : usize:: MAX } ;
34
38
35
39
#[ fixture]
36
40
fn mempool ( ) -> Mempool {
@@ -105,7 +109,7 @@ async fn test_add_tx(
105
109
}
106
110
107
111
#[ test]
108
- fn test_compile_contract_class_failure ( ) {
112
+ fn test_compile_contract_class_compiled_class_hash_missmatch ( ) {
109
113
let mut declare_tx_v3 = match declare_tx ( ) {
110
114
RPCTransaction :: Declare ( RPCDeclareTransaction :: V3 ( declare_tx) ) => declare_tx,
111
115
_ => panic ! ( "Invalid transaction type" ) ,
@@ -116,14 +120,57 @@ fn test_compile_contract_class_failure() {
116
120
declare_tx_v3. compiled_class_hash = supplied_hash;
117
121
let declare_tx = RPCDeclareTransaction :: V3 ( declare_tx_v3) ;
118
122
119
- let result = compile_contract_class ( & declare_tx) ;
123
+ let result = compile_contract_class ( & declare_tx, SIERRA_TO_CASM_COMPILATION_CONFIG ) ;
120
124
assert_matches ! (
121
125
result. unwrap_err( ) ,
122
126
GatewayError :: CompiledClassHashMismatch { supplied, hash_result }
123
127
if supplied == supplied_hash && hash_result == expected_hash_result
124
128
) ;
125
129
}
126
130
131
+ #[ rstest]
132
+ #[ case:: bytecode_size(
133
+ SierraToCasmCompilationConfig { max_bytecode_size: 1 , max_raw_class_size: usize :: MAX } ,
134
+ GatewayError :: CasmBytecodeSizeTooLarge { bytecode_size: 4800 , max_bytecode_size: 1 }
135
+ ) ]
136
+ #[ case:: raw_class_size(
137
+ SierraToCasmCompilationConfig { max_bytecode_size: usize :: MAX , max_raw_class_size: 1 } ,
138
+ GatewayError :: CasmContractClassObjectSizeTooLarge {
139
+ contract_class_object_size: 111037 , max_contract_class_object_size: 1
140
+ }
141
+ ) ]
142
+ fn test_compile_contract_class_size_validation (
143
+ #[ case] sierra_to_casm_compilation_config : SierraToCasmCompilationConfig ,
144
+ #[ case] expected_error : GatewayError ,
145
+ ) {
146
+ let declare_tx = match declare_tx ( ) {
147
+ RPCTransaction :: Declare ( declare_tx) => declare_tx,
148
+ _ => panic ! ( "Invalid transaction type" ) ,
149
+ } ;
150
+
151
+ let result = compile_contract_class ( & declare_tx, sierra_to_casm_compilation_config) ;
152
+ if let GatewayError :: CasmBytecodeSizeTooLarge {
153
+ bytecode_size : expected_bytecode_size, ..
154
+ } = expected_error
155
+ {
156
+ assert_matches ! (
157
+ result. unwrap_err( ) ,
158
+ GatewayError :: CasmBytecodeSizeTooLarge { bytecode_size, .. }
159
+ if bytecode_size == expected_bytecode_size
160
+ )
161
+ } else if let GatewayError :: CasmContractClassObjectSizeTooLarge {
162
+ contract_class_object_size : expected_contract_class_object_size,
163
+ ..
164
+ } = expected_error
165
+ {
166
+ assert_matches ! (
167
+ result. unwrap_err( ) ,
168
+ GatewayError :: CasmContractClassObjectSizeTooLarge { contract_class_object_size, .. }
169
+ if contract_class_object_size == expected_contract_class_object_size
170
+ )
171
+ }
172
+ }
173
+
127
174
#[ test]
128
175
fn test_compile_contract_class ( ) {
129
176
let declare_tx = match declare_tx ( ) {
@@ -133,7 +180,7 @@ fn test_compile_contract_class() {
133
180
let RPCDeclareTransaction :: V3 ( declare_tx_v3) = & declare_tx;
134
181
let contract_class = & declare_tx_v3. contract_class ;
135
182
136
- let result = compile_contract_class ( & declare_tx) ;
183
+ let result = compile_contract_class ( & declare_tx, SIERRA_TO_CASM_COMPILATION_CONFIG ) ;
137
184
assert_matches ! (
138
185
result,
139
186
Ok ( class_info)
@@ -151,7 +198,9 @@ async fn to_bytes(res: Response) -> Bytes {
151
198
152
199
fn calculate_hash ( external_tx : & RPCTransaction ) -> TransactionHash {
153
200
let optional_class_info = match & external_tx {
154
- RPCTransaction :: Declare ( declare_tx) => Some ( compile_contract_class ( declare_tx) . unwrap ( ) ) ,
201
+ RPCTransaction :: Declare ( declare_tx) => {
202
+ Some ( compile_contract_class ( declare_tx, SIERRA_TO_CASM_COMPILATION_CONFIG ) . unwrap ( ) )
203
+ }
155
204
_ => None ,
156
205
} ;
157
206
0 commit comments