@@ -3,12 +3,18 @@ use std::sync::Arc;
33use apollo_proof_manager_types:: MockProofManagerClient ;
44use assert_matches:: assert_matches;
55use blockifier:: context:: ChainInfo ;
6- use mempool_test_utils:: starknet_api_test_utils:: declare_tx;
6+ use blockifier_test_utils:: cairo_versions:: { CairoVersion , RunnableCairo1 } ;
7+ use mempool_test_utils:: starknet_api_test_utils:: {
8+ declare_tx,
9+ invoke_tx,
10+ invoke_tx_client_side_proving,
11+ } ;
712use mockall:: predicate:: eq;
813use rstest:: rstest;
9- use starknet_api:: compiled_class_hash;
1014use starknet_api:: executable_transaction:: ValidateCompiledClassHashError ;
1115use starknet_api:: rpc_transaction:: { RpcDeclareTransaction , RpcTransaction } ;
16+ use starknet_api:: transaction:: fields:: Proof ;
17+ use starknet_api:: { compiled_class_hash, felt, proof_facts} ;
1218
1319use crate :: transaction_converter:: {
1420 TransactionConverter ,
@@ -56,3 +62,94 @@ async fn test_compiled_class_hash_mismatch() {
5662 ) ;
5763 assert_eq ! ( err, expected_code) ;
5864}
65+
66+ #[ rstest]
67+ #[ tokio:: test]
68+ async fn test_proof_verification_called_for_invoke_v3_with_proof_facts ( ) {
69+ // Create an invoke transaction with proof_facts and proof.
70+ let proof_facts = proof_facts ! [ felt!( "0x1" ) , felt!( "0x2" ) , felt!( "0x3" ) ] ;
71+ let proof = Proof :: from ( vec ! [ 1u32 , 2u32 , 3u32 ] ) ;
72+ let invoke_tx = invoke_tx_client_side_proving (
73+ CairoVersion :: Cairo1 ( RunnableCairo1 :: Casm ) ,
74+ proof_facts. clone ( ) ,
75+ proof. clone ( ) ,
76+ ) ;
77+
78+ let mut mock_proof_manager_client = MockProofManagerClient :: new ( ) ;
79+ mock_proof_manager_client
80+ . expect_contains_proof ( )
81+ . once ( )
82+ . with ( eq ( proof_facts. clone ( ) ) )
83+ . return_once ( |_| Ok ( false ) ) ;
84+ mock_proof_manager_client
85+ . expect_set_proof ( )
86+ . once ( )
87+ . with ( eq ( proof_facts) , eq ( proof) )
88+ . return_once ( |_, _| Ok ( ( ) ) ) ;
89+
90+ let mock_class_manager_client = MockClassManagerClient :: new ( ) ;
91+
92+ let transaction_converter = TransactionConverter :: new (
93+ Arc :: new ( mock_class_manager_client) ,
94+ Arc :: new ( mock_proof_manager_client) ,
95+ ChainInfo :: create_for_testing ( ) . chain_id ,
96+ ) ;
97+
98+ // Convert the RPC transaction to an internal RPC transaction.
99+ transaction_converter. convert_rpc_tx_to_internal_rpc_tx ( invoke_tx) . await . unwrap ( ) ;
100+ }
101+
102+ #[ rstest]
103+ #[ tokio:: test]
104+ async fn test_proof_verification_skipped_for_invoke_v3_without_proof_facts ( ) {
105+ // Create an invoke transaction without proof_facts.
106+ let invoke_tx = invoke_tx ( CairoVersion :: Cairo1 ( RunnableCairo1 :: Casm ) ) ;
107+
108+ // Mock proof manager client expects NO calls to contains_proof or set_proof.
109+ let mock_proof_manager_client = MockProofManagerClient :: new ( ) ;
110+ let mock_class_manager_client = MockClassManagerClient :: new ( ) ;
111+
112+ let transaction_converter = TransactionConverter :: new (
113+ Arc :: new ( mock_class_manager_client) ,
114+ Arc :: new ( mock_proof_manager_client) ,
115+ ChainInfo :: create_for_testing ( ) . chain_id ,
116+ ) ;
117+
118+ // Convert the RPC transaction to an internal RPC transaction.
119+ // This should succeed without calling contains_proof or set_proof.
120+ transaction_converter. convert_rpc_tx_to_internal_rpc_tx ( invoke_tx) . await . unwrap ( ) ;
121+ }
122+
123+ #[ rstest]
124+ #[ tokio:: test]
125+ async fn test_proof_verification_skipped_when_proof_already_exists ( ) {
126+ // Create an invoke transaction with proof_facts and proof.
127+ let proof_facts = proof_facts ! [ felt!( "0x1" ) , felt!( "0x2" ) , felt!( "0x3" ) ] ;
128+ let proof = Proof :: from ( vec ! [ 1u32 , 2u32 , 3u32 ] ) ;
129+ let invoke_tx = invoke_tx_client_side_proving (
130+ CairoVersion :: Cairo1 ( RunnableCairo1 :: Casm ) ,
131+ proof_facts. clone ( ) ,
132+ proof. clone ( ) ,
133+ ) ;
134+
135+ let mut mock_proof_manager_client = MockProofManagerClient :: new ( ) ;
136+ // Expect contains_proof to be called and return true (proof already exists).
137+ mock_proof_manager_client
138+ . expect_contains_proof ( )
139+ . once ( )
140+ . with ( eq ( proof_facts) )
141+ . return_once ( |_| Ok ( true ) ) ;
142+ // Since proof already exists, expect set_proof to NOT be called.
143+
144+ let mock_class_manager_client = MockClassManagerClient :: new ( ) ;
145+
146+ let transaction_converter = TransactionConverter :: new (
147+ Arc :: new ( mock_class_manager_client) ,
148+ Arc :: new ( mock_proof_manager_client) ,
149+ ChainInfo :: create_for_testing ( ) . chain_id ,
150+ ) ;
151+
152+ // Convert the RPC transaction to an internal RPC transaction.
153+ // This should succeed and only call contains_proof, not set_proof.
154+ transaction_converter. convert_rpc_tx_to_internal_rpc_tx ( invoke_tx) . await . unwrap ( ) ;
155+ }
0 commit comments