11#![ feature( slice_flatten) ]
22use std:: io;
3+ use std:: str:: FromStr ;
34
4- use aligned_sdk:: core:: types:: {
5- AlignedVerificationData , Network , PriceEstimate , ProvingSystemId , VerificationData ,
6- } ;
5+ use aligned_sdk:: core:: types:: { AlignedVerificationData , FeeEstimationType , Network , ProvingSystemId , VerificationData } ;
76use aligned_sdk:: sdk:: { deposit_to_aligned, estimate_fee} ;
87use aligned_sdk:: sdk:: { get_nonce_from_ethereum, submit_and_wait_verification} ;
98use clap:: Parser ;
@@ -29,14 +28,99 @@ struct Args {
2928 default_value = "https://ethereum-holesky-rpc.publicnode.com"
3029 ) ]
3130 rpc_url : String ,
32- #[ arg( short, long, default_value = "wss://batcher.alignedlayer.com" ) ]
33- batcher_url : String ,
34- #[ arg( short, long, default_value = "holesky" ) ]
35- network : Network ,
31+ #[ clap( flatten) ]
32+ network : NetworkArg ,
3633 #[ arg( short, long) ]
3734 verifier_contract_address : H160 ,
3835}
3936
37+ #[ derive( Debug , Clone , Copy ) ]
38+ enum NetworkNameArg {
39+ Devnet ,
40+ Holesky ,
41+ HoleskyStage ,
42+ Mainnet ,
43+ }
44+
45+ impl FromStr for NetworkNameArg {
46+ type Err = String ;
47+
48+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
49+ match s {
50+ "devnet" => Ok ( NetworkNameArg :: Devnet ) ,
51+ "holesky" => Ok ( NetworkNameArg :: Holesky ) ,
52+ "holesky-stage" => Ok ( NetworkNameArg :: HoleskyStage ) ,
53+ "mainnet" => Ok ( NetworkNameArg :: Mainnet ) ,
54+ _ => Err (
55+ "Unknown network. Possible values: devnet, holesky, holesky-stage, mainnet"
56+ . to_string ( ) ,
57+ ) ,
58+ }
59+ }
60+ }
61+
62+ #[ derive( Debug , clap:: Args , Clone ) ]
63+ struct NetworkArg {
64+ #[ arg(
65+ name = "The working network's name" ,
66+ long = "network" ,
67+ default_value = "devnet" ,
68+ help = "[possible values: devnet, holesky, holesky-stage, mainnet]"
69+ ) ]
70+ network : Option < NetworkNameArg > ,
71+ #[ arg(
72+ name = "Aligned Service Manager Contract Address" ,
73+ long = "aligned_service_manager" ,
74+ conflicts_with( "The working network's name" ) ,
75+ requires( "Batcher Payment Service Contract Address" ) ,
76+ requires( "Batcher URL" )
77+ ) ]
78+ aligned_service_manager_address : Option < String > ,
79+
80+ #[ arg(
81+ name = "Batcher Payment Service Contract Address" ,
82+ long = "batcher_payment_service" ,
83+ conflicts_with( "The working network's name" ) ,
84+ requires( "Aligned Service Manager Contract Address" ) ,
85+ requires( "Batcher URL" )
86+ ) ]
87+ batcher_payment_service_address : Option < String > ,
88+
89+ #[ arg(
90+ name = "Batcher URL" ,
91+ long = "batcher_url" ,
92+ conflicts_with( "The working network's name" ) ,
93+ requires( "Aligned Service Manager Contract Address" ) ,
94+ requires( "Batcher Payment Service Contract Address" )
95+ ) ]
96+ batcher_url : Option < String > ,
97+ }
98+
99+ impl From < NetworkArg > for Network {
100+ fn from ( network_arg : NetworkArg ) -> Self {
101+ let mut processed_network_argument = network_arg. clone ( ) ;
102+
103+ if network_arg. batcher_url . is_some ( )
104+ || network_arg. aligned_service_manager_address . is_some ( )
105+ || network_arg. batcher_payment_service_address . is_some ( )
106+ {
107+ processed_network_argument. network = None ; // We need this because network is Devnet as default, which is not true for a Custom network
108+ }
109+
110+ match processed_network_argument. network {
111+ None => Network :: Custom (
112+ network_arg. aligned_service_manager_address . unwrap ( ) ,
113+ network_arg. batcher_payment_service_address . unwrap ( ) ,
114+ network_arg. batcher_url . unwrap ( ) ,
115+ ) ,
116+ Some ( NetworkNameArg :: Devnet ) => Network :: Devnet ,
117+ Some ( NetworkNameArg :: Holesky ) => Network :: Holesky ,
118+ Some ( NetworkNameArg :: HoleskyStage ) => Network :: HoleskyStage ,
119+ Some ( NetworkNameArg :: Mainnet ) => Network :: Mainnet ,
120+ }
121+ }
122+ }
123+
40124#[ tokio:: main]
41125async fn main ( ) {
42126 println ! ( "Welcome to the zkQuiz! Answer questions, generate a zkProof, and claim your NFT!" ) ;
@@ -66,7 +150,7 @@ async fn main() {
66150 . interact ( )
67151 . expect ( "Failed to read user input" ) {
68152
69- deposit_to_aligned ( U256 :: from ( 4000000000000000u128 ) , signer. clone ( ) , args. network ) . await
153+ deposit_to_aligned ( U256 :: from ( 4000000000000000u128 ) , signer. clone ( ) , args. network . clone ( ) . into ( ) ) . await
70154 . expect ( "Failed to pay for proof submission" ) ;
71155 }
72156
@@ -120,7 +204,7 @@ async fn main() {
120204 pub_input : None ,
121205 } ;
122206
123- let max_fee = estimate_fee ( & rpc_url, PriceEstimate :: Instant )
207+ let max_fee = estimate_fee ( & rpc_url, FeeEstimationType :: Instant )
124208 . await
125209 . expect ( "failed to fetch gas price from the blockchain" ) ;
126210
@@ -132,16 +216,15 @@ async fn main() {
132216 . expect ( "Failed to read user input" )
133217 { return ; }
134218
135- let nonce = get_nonce_from_ethereum ( & rpc_url, wallet. address ( ) , args. network )
219+ let nonce = get_nonce_from_ethereum ( & rpc_url, wallet. address ( ) , args. network . clone ( ) . into ( ) )
136220 . await
137221 . expect ( "Failed to get next nonce" ) ;
138222
139- println ! ( "Submitting your proof..." ) ;
223+ println ! ( "Submitting your proof..." ) ;
140224
141225 let aligned_verification_data = submit_and_wait_verification (
142- & args. batcher_url ,
143226 & rpc_url,
144- args. network ,
227+ args. network . clone ( ) . into ( ) ,
145228 & verification_data,
146229 max_fee,
147230 wallet. clone ( ) ,
@@ -207,6 +290,7 @@ async fn claim_nft_with_verified_proof(
207290 signer : SignerMiddleware < Provider < Http > , LocalWallet > ,
208291 verifier_contract_addr : & Address ,
209292) -> anyhow:: Result < ( ) > {
293+ println ! ( "Verifier contract address: {}" , verifier_contract_addr) ;
210294 let verifier_contract = VerifierContract :: new ( * verifier_contract_addr, signer. into ( ) ) ;
211295
212296 let index_in_batch = U256 :: from ( aligned_verification_data. index_in_batch ) ;
0 commit comments