1- use super :: garaga_convert:: { to_groth16_proof, to_groth16_proof_from_mopro, to_groth16_vk} ;
2- use super :: snarkjs_types:: {
3- parse_snarkjs_proof_json, parse_snarkjs_public_json, parse_snarkjs_vk_json, GROTH16_PROTOCOL ,
4- SNARKJS_BN128_CURVE ,
5- } ;
1+ use super :: garaga_convert:: { to_groth16_proof_from_mopro, to_groth16_vk} ;
2+ use super :: snarkjs_types:: { parse_snarkjs_vk_json, GROTH16_PROTOCOL , SNARKJS_BN128_CURVE } ;
63use super :: { CircomProof , CircomProofResult } ;
74use crate :: MoproError ;
85use garaga_rs:: calldata:: full_proof_with_hints:: groth16:: {
@@ -20,6 +17,20 @@ fn garaga_calldata_core(
2017 Ok ( felts. into_iter ( ) . map ( |f| f. to_string ( ) ) . collect ( ) )
2118}
2219
20+ fn validate_public_input_count (
21+ public_inputs : & [ String ] ,
22+ n_public : usize ,
23+ ) -> Result < ( ) , MoproError > {
24+ if public_inputs. len ( ) != n_public {
25+ return Err ( MoproError :: CircomError ( format ! (
26+ "Garaga calldata error: public input count mismatch: got {}, nPublic {}" ,
27+ public_inputs. len( ) ,
28+ n_public
29+ ) ) ) ;
30+ }
31+ Ok ( ( ) )
32+ }
33+
2334fn validate_mopro_groth16_bn254 ( proof : & CircomProof ) -> Result < ( ) , String > {
2435 if proof. protocol != GROTH16_PROTOCOL {
2536 return Err ( format ! (
@@ -53,51 +64,25 @@ fn circom_proof_to_groth16(
5364 )
5465}
5566
56- /// Build Starknet-compatible Groth16 calldata (BN254) from SnarkJS JSON artifacts.
57- ///
58- /// `proof_json` — contents of snarkjs `proof.json`
59- /// `public_json` — contents of snarkjs `public.json` (array of decimal field elements)
60- /// `verification_key_json` — contents of snarkjs `verification_key.json`
61- ///
62- /// Returns each Starknet felt as a decimal string, suitable for Flutter/Dart and
63- /// `starknet.dart` invoke calldata. Does not send transactions.
64- ///
65- /// Prefer [`generate_circom_groth16_garaga_calldata_from_proof_result`] when you already
66- /// have output from [`super::generate_circom_proof`].
67- #[ cfg_attr( feature = "uniffi" , uniffi:: export) ]
68- pub fn generate_circom_groth16_garaga_calldata (
69- proof_json : String ,
70- public_json : String ,
71- verification_key_json : String ,
72- ) -> Result < Vec < String > , MoproError > {
73- let proof = parse_snarkjs_proof_json ( & proof_json)
74- . map_err ( |e| MoproError :: CircomError ( format ! ( "Garaga calldata error: {e}" ) ) ) ?;
75- let public_inputs = parse_snarkjs_public_json ( & public_json)
76- . map_err ( |e| MoproError :: CircomError ( format ! ( "Garaga calldata error: {e}" ) ) ) ?;
77- let vk = parse_snarkjs_vk_json ( & verification_key_json)
78- . map_err ( |e| MoproError :: CircomError ( format ! ( "Garaga calldata error: {e}" ) ) ) ?;
79-
80- let garaga_proof = to_groth16_proof ( & proof, & public_inputs)
81- . map_err ( |e| MoproError :: CircomError ( format ! ( "Garaga calldata error: {e}" ) ) ) ?;
82- let garaga_vk = to_groth16_vk ( & vk)
83- . map_err ( |e| MoproError :: CircomError ( format ! ( "Garaga calldata error: {e}" ) ) ) ?;
84-
85- garaga_calldata_core ( garaga_proof, garaga_vk)
86- }
87-
8867/// Build Starknet-compatible Groth16 calldata (BN254) from a [`CircomProofResult`].
8968///
69+ /// Prove with [`super::generate_circom_proof`], then pass the result here together with
70+ /// `verification_key_json` (contents of snarkjs `verification_key.json` from a one-time
71+ /// zkey export).
72+ ///
9073/// `proof_result.inputs` has the same content as SnarkJS `public.json` (decimal field
9174/// elements). No separate public-inputs file is required.
9275///
93- /// `verification_key_json` — contents of snarkjs `verification_key.json` (one-time zkey export).
76+ /// Returns each Starknet felt as a decimal string, suitable for Flutter/Dart and
77+ /// `starknet.dart` invoke calldata. Does not send transactions.
9478#[ cfg_attr( feature = "uniffi" , uniffi:: export) ]
95- pub fn generate_circom_groth16_garaga_calldata_from_proof_result (
79+ pub fn generate_circom_groth16_garaga_calldata (
9680 proof_result : CircomProofResult ,
9781 verification_key_json : String ,
9882) -> Result < Vec < String > , MoproError > {
9983 let vk = parse_snarkjs_vk_json ( & verification_key_json)
10084 . map_err ( |e| MoproError :: CircomError ( format ! ( "Garaga calldata error: {e}" ) ) ) ?;
85+ validate_public_input_count ( & proof_result. inputs , vk. n_public ) ?;
10186
10287 let garaga_proof = circom_proof_to_groth16 ( & proof_result. proof , & proof_result. inputs )
10388 . map_err ( |e| MoproError :: CircomError ( format ! ( "Garaga calldata error: {e}" ) ) ) ?;
0 commit comments