1+ use crate :: chain:: reader:: BlockNumber ;
12use {
23 crate :: api:: { ChainId , RequestLabel , RestError } ,
34 anyhow:: Result ,
@@ -30,7 +31,10 @@ params(RevelationPathParams, RevelationQueryParams)
3031pub async fn revelation (
3132 State ( state) : State < crate :: api:: ApiState > ,
3233 Path ( RevelationPathParams { chain_id, sequence } ) : Path < RevelationPathParams > ,
33- Query ( RevelationQueryParams { encoding } ) : Query < RevelationQueryParams > ,
34+ Query ( RevelationQueryParams {
35+ encoding,
36+ block_number,
37+ } ) : Query < RevelationQueryParams > ,
3438) -> Result < Json < GetRandomValueResponse > , RestError > {
3539 state
3640 . metrics
@@ -45,40 +49,68 @@ pub async fn revelation(
4549 . get ( & chain_id)
4650 . ok_or ( RestError :: InvalidChainId ) ?;
4751
48- let maybe_request_fut = state. contract . get_request ( state. provider_address , sequence) ;
49-
5052 let current_block_number_fut = state
5153 . contract
5254 . get_block_number ( state. confirmed_block_status ) ;
5355
54- let ( maybe_request, current_block_number) =
55- try_join ! ( maybe_request_fut, current_block_number_fut) . map_err ( |e| {
56- tracing:: error!( chain_id = chain_id, "RPC request failed {}" , e) ;
57- RestError :: TemporarilyUnavailable
58- } ) ?;
59-
60- match maybe_request {
61- Some ( r)
62- if current_block_number. saturating_sub ( state. reveal_delay_blocks ) >= r. block_number =>
63- {
64- let value = & state. state . reveal ( sequence) . map_err ( |e| {
65- tracing:: error!(
66- chain_id = chain_id,
67- sequence = sequence,
68- "Reveal failed {}" ,
69- e
70- ) ;
71- RestError :: Unknown
72- } ) ?;
73- let encoded_value = Blob :: new ( encoding. unwrap_or ( BinaryEncoding :: Hex ) , * value) ;
74-
75- Ok ( Json ( GetRandomValueResponse {
76- value : encoded_value,
77- } ) )
56+ match block_number {
57+ Some ( block_number) => {
58+ let maybe_request_fut = state. contract . get_request_with_callback_events (
59+ block_number,
60+ block_number,
61+ state. provider_address ,
62+ ) ;
63+
64+ let ( maybe_request, current_block_number) =
65+ try_join ! ( maybe_request_fut, current_block_number_fut) . map_err ( |e| {
66+ tracing:: error!( chain_id = chain_id, "RPC request failed {}" , e) ;
67+ RestError :: TemporarilyUnavailable
68+ } ) ?;
69+
70+ if current_block_number. saturating_sub ( state. reveal_delay_blocks ) < block_number {
71+ return Err ( RestError :: PendingConfirmation ) ;
72+ }
73+
74+ maybe_request
75+ . iter ( )
76+ . find ( |r| r. sequence_number == sequence)
77+ . ok_or ( RestError :: NoPendingRequest ) ?;
78+ }
79+ None => {
80+ let maybe_request_fut = state. contract . get_request ( state. provider_address , sequence) ;
81+ let ( maybe_request, current_block_number) =
82+ try_join ! ( maybe_request_fut, current_block_number_fut) . map_err ( |e| {
83+ tracing:: error!( chain_id = chain_id, "RPC request failed {}" , e) ;
84+ RestError :: TemporarilyUnavailable
85+ } ) ?;
86+
87+ match maybe_request {
88+ Some ( r)
89+ if current_block_number. saturating_sub ( state. reveal_delay_blocks )
90+ >= r. block_number =>
91+ {
92+ Ok ( ( ) )
93+ }
94+ Some ( _) => Err ( RestError :: PendingConfirmation ) ,
95+ None => Err ( RestError :: NoPendingRequest ) ,
96+ } ?;
7897 }
79- Some ( _) => Err ( RestError :: PendingConfirmation ) ,
80- None => Err ( RestError :: NoPendingRequest ) ,
8198 }
99+
100+ let value = & state. state . reveal ( sequence) . map_err ( |e| {
101+ tracing:: error!(
102+ chain_id = chain_id,
103+ sequence = sequence,
104+ "Reveal failed {}" ,
105+ e
106+ ) ;
107+ RestError :: Unknown
108+ } ) ?;
109+ let encoded_value = Blob :: new ( encoding. unwrap_or ( BinaryEncoding :: Hex ) , * value) ;
110+
111+ Ok ( Json ( GetRandomValueResponse {
112+ value : encoded_value,
113+ } ) )
82114}
83115
84116#[ derive( Debug , serde:: Serialize , serde:: Deserialize , IntoParams ) ]
@@ -93,6 +125,8 @@ pub struct RevelationPathParams {
93125#[ into_params( parameter_in=Query ) ]
94126pub struct RevelationQueryParams {
95127 pub encoding : Option < BinaryEncoding > ,
128+ #[ param( value_type = u64 ) ]
129+ pub block_number : Option < BlockNumber > ,
96130}
97131
98132#[ derive( Debug , serde:: Serialize , serde:: Deserialize , ToSchema ) ]
0 commit comments