2121/// Callers must pass the appropriate chain_id to ensure they fetch the correct random number.
2222#[ utoipa:: path(
2323get,
24- path = "/v1/chains/{chain_id}/revelations/{block_number}/{ sequence}" ,
24+ path = "/v1/chains/{chain_id}/revelations/{sequence}" ,
2525responses(
2626( status = 200 , description = "Random value successfully retrieved" , body = GetRandomValueResponse ) ,
2727( status = 403 , description = "Random value cannot currently be retrieved" , body = String )
@@ -33,9 +33,8 @@ pub async fn revelation(
3333 Path ( RevelationPathParams {
3434 chain_id,
3535 sequence,
36- block_number,
3736 } ) : Path < RevelationPathParams > ,
38- Query ( RevelationQueryParams { encoding } ) : Query < RevelationQueryParams > ,
37+ Query ( RevelationQueryParams { encoding, block_number } ) : Query < RevelationQueryParams > ,
3938) -> Result < Json < GetRandomValueResponse > , RestError > {
4039 state
4140 . metrics
@@ -50,31 +49,51 @@ pub async fn revelation(
5049 . get ( & chain_id)
5150 . ok_or ( RestError :: InvalidChainId ) ?;
5251
53- let maybe_request_fut = state. contract . get_request_with_callback_events (
54- block_number,
55- block_number,
56- state. provider_address ,
57- ) ;
58-
5952 let current_block_number_fut = state
6053 . contract
6154 . get_block_number ( state. confirmed_block_status ) ;
6255
63- let ( maybe_request, current_block_number) =
64- try_join ! ( maybe_request_fut, current_block_number_fut) . map_err ( |e| {
65- tracing:: error!( chain_id = chain_id, "RPC request failed {}" , e) ;
66- RestError :: TemporarilyUnavailable
67- } ) ?;
68-
69- if current_block_number. saturating_sub ( state. reveal_delay_blocks ) < block_number {
70- return Err ( RestError :: PendingConfirmation ) ;
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 ) >= r. block_number =>
90+ { Ok ( ( ) ) }
91+ Some ( _) => Err ( RestError :: PendingConfirmation ) ,
92+ None => Err ( RestError :: NoPendingRequest ) ,
93+ } ?;
94+ }
7195 }
7296
73- maybe_request
74- . iter ( )
75- . find ( |r| r. sequence_number == sequence)
76- . ok_or ( RestError :: NoPendingRequest ) ?;
77-
7897 let value = & state. state . reveal ( sequence) . map_err ( |e| {
7998 tracing:: error!(
8099 chain_id = chain_id,
@@ -97,14 +116,14 @@ pub struct RevelationPathParams {
97116 #[ param( value_type = String ) ]
98117 pub chain_id : ChainId ,
99118 pub sequence : u64 ,
100- #[ param( value_type = u64 ) ]
101- pub block_number : BlockNumber ,
102119}
103120
104121#[ derive( Debug , serde:: Serialize , serde:: Deserialize , IntoParams ) ]
105122#[ into_params( parameter_in=Query ) ]
106123pub struct RevelationQueryParams {
107124 pub encoding : Option < BinaryEncoding > ,
125+ #[ param( value_type = u64 ) ]
126+ pub block_number : Option < BlockNumber > ,
108127}
109128
110129#[ derive( Debug , serde:: Serialize , serde:: Deserialize , ToSchema ) ]
0 commit comments