1
+ use crate :: chain:: reader:: BlockNumber ;
1
2
use {
2
3
crate :: api:: { ChainId , RequestLabel , RestError } ,
3
4
anyhow:: Result ,
@@ -30,7 +31,10 @@ params(RevelationPathParams, RevelationQueryParams)
30
31
pub async fn revelation (
31
32
State ( state) : State < crate :: api:: ApiState > ,
32
33
Path ( RevelationPathParams { chain_id, sequence } ) : Path < RevelationPathParams > ,
33
- Query ( RevelationQueryParams { encoding } ) : Query < RevelationQueryParams > ,
34
+ Query ( RevelationQueryParams {
35
+ encoding,
36
+ block_number,
37
+ } ) : Query < RevelationQueryParams > ,
34
38
) -> Result < Json < GetRandomValueResponse > , RestError > {
35
39
state
36
40
. metrics
@@ -45,40 +49,68 @@ pub async fn revelation(
45
49
. get ( & chain_id)
46
50
. ok_or ( RestError :: InvalidChainId ) ?;
47
51
48
- let maybe_request_fut = state. contract . get_request ( state. provider_address , sequence) ;
49
-
50
52
let current_block_number_fut = state
51
53
. contract
52
54
. get_block_number ( state. confirmed_block_status ) ;
53
55
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
+ } ?;
78
97
}
79
- Some ( _) => Err ( RestError :: PendingConfirmation ) ,
80
- None => Err ( RestError :: NoPendingRequest ) ,
81
98
}
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
+ } ) )
82
114
}
83
115
84
116
#[ derive( Debug , serde:: Serialize , serde:: Deserialize , IntoParams ) ]
@@ -93,6 +125,8 @@ pub struct RevelationPathParams {
93
125
#[ into_params( parameter_in=Query ) ]
94
126
pub struct RevelationQueryParams {
95
127
pub encoding : Option < BinaryEncoding > ,
128
+ #[ param( value_type = u64 ) ]
129
+ pub block_number : Option < BlockNumber > ,
96
130
}
97
131
98
132
#[ derive( Debug , serde:: Serialize , serde:: Deserialize , ToSchema ) ]
0 commit comments