1- use reqwest:: Client ;
1+ use alloy:: network:: EthereumWallet ;
2+ use reqwest:: { multipart, Client } ;
23use serde:: de:: DeserializeOwned ;
34
45use crate :: {
56 aggregation_layer:: gateway:: types:: {
67 GatewayResponse , NonceResponse , Receipt , ReceiptsQuery , ReceiptsResponse ,
8+ SubmitProofResponse , SubmitSP1ProofMessage ,
79 } ,
810 common:: types:: Network ,
911} ;
1012
1113pub struct AggregationModeGatewayProvider {
1214 gateway_url : String ,
15+ signer : Option < EthereumWallet > ,
1316 http_client : Client ,
1417}
1518
@@ -18,6 +21,7 @@ pub enum AggregationModeError {
1821 UnsupportedNetwork ,
1922 Request ( String ) ,
2023 Api { status : u16 , message : String } ,
24+ SignerNotConfigured ,
2125}
2226
2327impl AggregationModeGatewayProvider {
@@ -31,12 +35,29 @@ impl AggregationModeGatewayProvider {
3135 Ok ( Self {
3236 gateway_url,
3337 http_client : Client :: new ( ) ,
38+ signer : None ,
3439 } )
3540 }
3641
37- pub fn new_with_signer ( ) { }
42+ pub fn new_with_signer (
43+ network : Network ,
44+ signer : EthereumWallet ,
45+ ) -> Result < Self , AggregationModeError > {
46+ let gateway_url = match network {
47+ Network :: Devnet => "http://127.0.0.1:8089" . into ( ) ,
48+ _ => return Err ( AggregationModeError :: UnsupportedNetwork ) ,
49+ } ;
50+
51+ Ok ( Self {
52+ gateway_url,
53+ http_client : Client :: new ( ) ,
54+ signer : Some ( signer) ,
55+ } )
56+ }
3857
39- pub fn signer ( ) { }
58+ pub fn signer ( & self ) -> Option < & EthereumWallet > {
59+ self . signer . as_ref ( )
60+ }
4061}
4162
4263impl AggregationModeGatewayProvider {
@@ -71,7 +92,37 @@ impl AggregationModeGatewayProvider {
7192 Ok ( response. receipts )
7293 }
7394
74- pub async fn submit_sp1_proof ( & self , serialized_proof : Vec < u8 > , serialized_vk : Vec < u8 > ) { }
95+ pub async fn submit_sp1_proof (
96+ & self ,
97+ serialized_proof : Vec < u8 > ,
98+ serialized_vk : Vec < u8 > ,
99+ ) -> Result < SubmitProofResponse , AggregationModeError > {
100+ let Some ( signer) = & self . signer else {
101+ return Err ( AggregationModeError :: SignerNotConfigured ) ;
102+ } ;
103+ let signer_address = signer. default_signer ( ) . address ( ) . to_string ( ) ;
104+
105+ let nonce = self . get_nonce_for ( signer_address) . await ?;
106+ let message = SubmitSP1ProofMessage :: new ( nonce, serialized_proof, serialized_vk) . sign ( ) ;
107+ let form = multipart:: Form :: new ( )
108+ . text ( "nonce" , message. nonce . to_string ( ) )
109+ . part (
110+ "proof" ,
111+ multipart:: Part :: bytes ( message. proof ) . file_name ( "proof.bin" ) ,
112+ )
113+ . part (
114+ "program_vk" ,
115+ multipart:: Part :: bytes ( message. program_vk ) . file_name ( "program_vk.bin" ) ,
116+ )
117+ . text ( "signature_hex" , hex:: encode ( message. signature ) ) ;
118+
119+ let request = self
120+ . http_client
121+ . post ( format ! ( "{}/proof/sp1" , self . gateway_url) )
122+ . multipart ( form) ;
123+
124+ self . send_request ( request) . await
125+ }
75126
76127 // TODO: verify proof from receipt merkle path
77128
0 commit comments