11use {
22 crate :: {
3- api:: GetRandomValueResponse ,
4- chain:: ethereum:: SignablePythContract ,
3+ chain:: ethereum:: { SignablePythContract , RevealedWithCallbackFilter } ,
54 config:: { Config , GenerateOptions } ,
6- } ,
7- anyhow:: Result ,
8- base64:: { engine:: general_purpose:: STANDARD as base64_standard_engine, Engine as _} ,
9- std:: sync:: Arc ,
5+ } , anyhow:: Result , base64:: { engine:: general_purpose:: STANDARD as base64_standard_engine, Engine as _} , ethers:: providers:: Middleware , std:: sync:: Arc ,
6+ tokio:: time:: { self , Duration } ,
107} ;
118
129/// Run the entire random number generation protocol to produce a random number.
@@ -22,42 +19,41 @@ pub async fn generate(opts: &GenerateOptions) -> Result<()> {
2219 let user_randomness = rand:: random :: < [ u8 ; 32 ] > ( ) ;
2320 let provider = opts. provider ;
2421
22+ let mut last_block_number = contract. provider ( ) . get_block_number ( ) . await ?;
23+
2524 // Request a random number on the contract
2625 let sequence_number = contract
27- . request_wrapper ( & provider, & user_randomness, opts . blockhash )
26+ . request_with_callback_wrapper ( & provider, & user_randomness)
2827 . await ?;
2928
3029 tracing:: info!( sequence_number = sequence_number, "random number requested" , ) ;
3130
32- // Get the committed value from the provider
33- let resp = reqwest:: get ( opts. url . join ( & format ! (
34- "/v1/chains/{}/revelations/{}" ,
35- opts. chain_id, sequence_number
36- ) ) ?)
37- . await ?
38- . json :: < GetRandomValueResponse > ( )
39- . await ?;
40-
41- tracing:: info!(
42- response = base64_standard_engine. encode( resp. value. data( ) ) ,
43- "Retrieved the provider's random value." ,
44- ) ;
45- let provider_randomness = resp. value . data ( ) ;
46-
47- // Submit the provider's and our values to the contract to reveal the random number.
48- let random_value = contract
49- . reveal_wrapper (
50- & provider,
51- sequence_number,
52- & user_randomness,
53- provider_randomness,
54- )
55- . await ?;
56-
57- tracing:: info!(
58- number = base64_standard_engine. encode( random_value) ,
59- "Random number generated."
60- ) ;
31+ for _i in [ 0 ..10 ] {
32+ let current_block_number = contract. provider ( ) . get_block_number ( ) . await ?;
33+ tracing:: info!(
34+ start_block = last_block_number. as_u64( ) ,
35+ end_block = current_block_number. as_u64( ) ,
36+ "Checking events between blocks."
37+ ) ;
38+
39+ let mut event = contract. revealed_with_callback_filter ( ) ;
40+ event. filter = event. filter . from_block ( last_block_number) . to_block ( current_block_number) ;
41+
42+ let res: Vec < RevealedWithCallbackFilter > = event. query ( ) . await ?;
43+
44+ for r in res. iter ( ) {
45+ if r. request . sequence_number == sequence_number && r. request . provider == provider {
46+ tracing:: info!(
47+ number = base64_standard_engine. encode( r. random_number) ,
48+ "Random number generated."
49+ ) ;
50+ break ;
51+ }
52+ }
53+
54+ last_block_number = current_block_number;
55+ time:: sleep ( Duration :: from_secs ( 1 ) ) . await ;
56+ }
6157
6258 Ok ( ( ) )
6359}
0 commit comments