Skip to content

Commit 1a45daf

Browse files
committed
Move block_number to optional get argument
1 parent 5a1e490 commit 1a45daf

File tree

3 files changed

+45
-26
lines changed

3 files changed

+45
-26
lines changed

apps/entropy-debugger/src/lib/revelation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export async function getRevelation(
6262
) {
6363
const deployment = EntropyDeployments[chain];
6464
const url = new URL(
65-
`/v1/chains/${chain}/revelations/${blockNumber.toString()}/${sequenceNumber.toString()}`,
65+
`/v1/chains/${chain}/revelations/${sequenceNumber.toString()}?blockNumber=${blockNumber.toString()}`,
6666
deployment.network === "mainnet"
6767
? "https://fortuna.dourolabs.app"
6868
: "https://fortuna-staging.dourolabs.app",

apps/fortuna/src/api.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ pub fn routes(state: ApiState) -> Router<(), Body> {
154154
.route("/ready", get(ready))
155155
.route("/v1/chains", get(chain_ids))
156156
.route(
157-
"/v1/chains/:chain_id/revelations/:block_number/:sequence",
157+
"/v1/chains/:chain_id/revelations/:sequence",
158158
get(revelation),
159159
)
160160
.with_state(state)

apps/fortuna/src/api/revelation.rs

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use {
2121
/// Callers must pass the appropriate chain_id to ensure they fetch the correct random number.
2222
#[utoipa::path(
2323
get,
24-
path = "/v1/chains/{chain_id}/revelations/{block_number}/{sequence}",
24+
path = "/v1/chains/{chain_id}/revelations/{sequence}",
2525
responses(
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)]
106123
pub 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

Comments
 (0)