1
1
use std:: sync:: Arc ;
2
2
3
+ use assert_matches:: assert_matches;
3
4
use axum:: body:: { Bytes , HttpBody } ;
4
5
use axum:: extract:: State ;
5
6
use axum:: http:: StatusCode ;
6
7
use axum:: response:: { IntoResponse , Response } ;
7
8
use blockifier:: context:: ChainInfo ;
9
+ use blockifier:: execution:: contract_class:: ContractClass ;
8
10
use blockifier:: test_utils:: CairoVersion ;
9
11
use rstest:: { fixture, rstest} ;
10
- use starknet_api:: rpc_transaction:: RPCTransaction ;
12
+ use starknet_api:: core:: CompiledClassHash ;
13
+ use starknet_api:: rpc_transaction:: { RPCDeclareTransaction , RPCTransaction } ;
11
14
use starknet_api:: transaction:: TransactionHash ;
12
15
use starknet_mempool:: communication:: create_mempool_server;
13
16
use starknet_mempool:: mempool:: Mempool ;
@@ -16,6 +19,7 @@ use tokio::sync::mpsc::channel;
16
19
use tokio:: task;
17
20
18
21
use crate :: config:: { StatefulTransactionValidatorConfig , StatelessTransactionValidatorConfig } ;
22
+ use crate :: errors:: GatewayError ;
19
23
use crate :: gateway:: { add_tx, compile_contract_class, AppState , SharedMempoolClient } ;
20
24
use crate :: starknet_api_test_utils:: { declare_tx, deploy_account_tx, invoke_tx} ;
21
25
use crate :: state_reader_test_utils:: {
@@ -100,6 +104,47 @@ async fn test_add_tx(
100
104
assert_eq ! ( tx_hash, serde_json:: from_slice( response_bytes) . unwrap( ) ) ;
101
105
}
102
106
107
+ #[ test]
108
+ fn test_compile_contract_class_failure ( ) {
109
+ let mut declare_tx_v3 = match declare_tx ( ) {
110
+ RPCTransaction :: Declare ( RPCDeclareTransaction :: V3 ( declare_tx) ) => declare_tx,
111
+ _ => panic ! ( "Invalid transaction type" ) ,
112
+ } ;
113
+ let expected_hash_result = declare_tx_v3. compiled_class_hash ;
114
+ let supplied_hash = CompiledClassHash :: default ( ) ;
115
+
116
+ declare_tx_v3. compiled_class_hash = supplied_hash;
117
+ let declare_tx = RPCDeclareTransaction :: V3 ( declare_tx_v3) ;
118
+
119
+ let result = compile_contract_class ( & declare_tx) ;
120
+ assert_matches ! (
121
+ result. unwrap_err( ) ,
122
+ GatewayError :: CompiledClassHashMismatch { supplied, hash_result }
123
+ if supplied == supplied_hash && hash_result == expected_hash_result
124
+ ) ;
125
+ }
126
+
127
+ #[ test]
128
+ fn test_compile_contract_class ( ) {
129
+ let declare_tx = match declare_tx ( ) {
130
+ RPCTransaction :: Declare ( declare_tx) => declare_tx,
131
+ _ => panic ! ( "Invalid transaction type" ) ,
132
+ } ;
133
+ let RPCDeclareTransaction :: V3 ( declare_tx_v3) = & declare_tx;
134
+ let contract_class = & declare_tx_v3. contract_class ;
135
+
136
+ let result = compile_contract_class ( & declare_tx) ;
137
+ assert_matches ! (
138
+ result,
139
+ Ok ( class_info)
140
+ if (
141
+ matches!( class_info. contract_class( ) , ContractClass :: V1 ( _) )
142
+ && class_info. sierra_program_length( ) == contract_class. sierra_program. len( )
143
+ && class_info. abi_length( ) == contract_class. abi. len( )
144
+ )
145
+ ) ;
146
+ }
147
+
103
148
async fn to_bytes ( res : Response ) -> Bytes {
104
149
res. into_body ( ) . collect ( ) . await . unwrap ( ) . to_bytes ( )
105
150
}
0 commit comments