Skip to content

Commit 56bf530

Browse files
committed
Use the block number of event instead of request data for revelation api
1 parent 05b7928 commit 56bf530

File tree

8 files changed

+67
-35
lines changed

8 files changed

+67
-35
lines changed

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ export async function requestCallback(
1010
chain: keyof typeof EntropyDeployments,
1111
): Promise<string> {
1212
const deployment = EntropyDeployments[chain];
13-
const { provider, sequenceNumber, userRandomNumber } = await fetchInfoFromTx(
14-
txHash,
15-
deployment,
13+
const { provider, sequenceNumber, userRandomNumber, blockNumber } =
14+
await fetchInfoFromTx(txHash, deployment);
15+
const revelation = await getRevelation(
16+
chain,
17+
blockNumber,
18+
Number(sequenceNumber),
1619
);
17-
const revelation = await getRevelation(chain, Number(sequenceNumber));
1820

1921
return `cast send ${deployment.address} 'revealWithCallback(address, uint64, bytes32, bytes32)' ${provider} ${sequenceNumber.toString()} ${userRandomNumber} ${revelation.value.data} -r ${deployment.rpc} --private-key <YOUR_PRIVATE_KEY>`;
2022
}
@@ -40,7 +42,12 @@ export async function fetchInfoFromTx(
4042
const firstLog = logs[0];
4143
if (firstLog) {
4244
const { provider, sequenceNumber, userRandomNumber } = firstLog.args;
43-
return { provider, sequenceNumber, userRandomNumber };
45+
return {
46+
provider,
47+
sequenceNumber,
48+
userRandomNumber,
49+
blockNumber: receipt.blockNumber,
50+
};
4451
} else {
4552
throw new Error(
4653
`No logs found for ${txHash}. Are you sure you send the requestCallback Transaction?`,
@@ -50,11 +57,12 @@ export async function fetchInfoFromTx(
5057

5158
export async function getRevelation(
5259
chain: keyof typeof EntropyDeployments,
60+
blockNumber: number,
5361
sequenceNumber: number,
5462
) {
5563
const deployment = EntropyDeployments[chain];
5664
const url = new URL(
57-
`/v1/chains/${chain}/revelations/${sequenceNumber.toString()}`,
65+
`/v1/chains/${chain}/revelations/${blockNumber.toString()}/${sequenceNumber.toString()}`,
5866
deployment.network === "mainnet"
5967
? "https://fortuna.dourolabs.app"
6068
: "https://fortuna-staging.dourolabs.app",

apps/fortuna/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/fortuna/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "fortuna"
3-
version = "7.4.10"
3+
version = "7.5.0"
44
edition = "2021"
55

66
[lib]

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/:sequence",
157+
"/v1/chains/:chain_id/revelations/:block_number/:sequence",
158158
get(revelation),
159159
)
160160
.with_state(state)

apps/fortuna/src/api/revelation.rs

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::chain::reader::BlockNumber;
12
use {
23
crate::api::{ChainId, RequestLabel, RestError},
34
anyhow::Result,
@@ -20,7 +21,7 @@ use {
2021
/// Callers must pass the appropriate chain_id to ensure they fetch the correct random number.
2122
#[utoipa::path(
2223
get,
23-
path = "/v1/chains/{chain_id}/revelations/{sequence}",
24+
path = "/v1/chains/{chain_id}/revelations/{block_number}/{sequence}",
2425
responses(
2526
(status = 200, description = "Random value successfully retrieved", body = GetRandomValueResponse),
2627
(status = 403, description = "Random value cannot currently be retrieved", body = String)
@@ -29,7 +30,11 @@ params(RevelationPathParams, RevelationQueryParams)
2930
)]
3031
pub async fn revelation(
3132
State(state): State<crate::api::ApiState>,
32-
Path(RevelationPathParams { chain_id, sequence }): Path<RevelationPathParams>,
33+
Path(RevelationPathParams {
34+
chain_id,
35+
sequence,
36+
block_number,
37+
}): Path<RevelationPathParams>,
3338
Query(RevelationQueryParams { encoding }): Query<RevelationQueryParams>,
3439
) -> Result<Json<GetRandomValueResponse>, RestError> {
3540
state
@@ -45,7 +50,11 @@ pub async fn revelation(
4550
.get(&chain_id)
4651
.ok_or(RestError::InvalidChainId)?;
4752

48-
let maybe_request_fut = state.contract.get_request(state.provider_address, sequence);
53+
let maybe_request_fut = state.contract.get_request_with_callback_events(
54+
block_number,
55+
block_number,
56+
state.provider_address,
57+
);
4958

5059
let current_block_number_fut = state
5160
.contract
@@ -57,28 +66,29 @@ pub async fn revelation(
5766
RestError::TemporarilyUnavailable
5867
})?;
5968

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-
}))
78-
}
79-
Some(_) => Err(RestError::PendingConfirmation),
80-
None => Err(RestError::NoPendingRequest),
69+
if current_block_number.saturating_sub(state.reveal_delay_blocks) < block_number {
70+
return Err(RestError::PendingConfirmation);
8171
}
72+
73+
maybe_request
74+
.iter()
75+
.find(|r| r.sequence_number == sequence)
76+
.ok_or(RestError::NoPendingRequest)?;
77+
78+
let value = &state.state.reveal(sequence).map_err(|e| {
79+
tracing::error!(
80+
chain_id = chain_id,
81+
sequence = sequence,
82+
"Reveal failed {}",
83+
e
84+
);
85+
RestError::Unknown
86+
})?;
87+
let encoded_value = Blob::new(encoding.unwrap_or(BinaryEncoding::Hex), *value);
88+
89+
Ok(Json(GetRandomValueResponse {
90+
value: encoded_value,
91+
}))
8292
}
8393

8494
#[derive(Debug, serde::Serialize, serde::Deserialize, IntoParams)]
@@ -87,6 +97,8 @@ pub struct RevelationPathParams {
8797
#[param(value_type = String)]
8898
pub chain_id: ChainId,
8999
pub sequence: u64,
100+
#[param(value_type = u64)]
101+
pub block_number: BlockNumber,
90102
}
91103

92104
#[derive(Debug, serde::Serialize, serde::Deserialize, IntoParams)]

apps/fortuna/src/chain/ethereum.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,14 @@ impl<T: JsonRpcClient + 'static> EntropyReader for PythRandom<Provider<T>> {
244244
&self,
245245
from_block: BlockNumber,
246246
to_block: BlockNumber,
247+
provider: Address,
247248
) -> Result<Vec<RequestedWithCallbackEvent>> {
248249
let mut event = self.requested_with_callback_filter();
249-
event.filter = event.filter.from_block(from_block).to_block(to_block);
250+
event.filter = event
251+
.filter
252+
.from_block(from_block)
253+
.to_block(to_block)
254+
.topic1(provider);
250255

251256
let res: Vec<RequestedWithCallbackFilter> = event.query().await?;
252257

@@ -257,6 +262,7 @@ impl<T: JsonRpcClient + 'static> EntropyReader for PythRandom<Provider<T>> {
257262
user_random_number: r.user_random_number,
258263
provider_address: r.request.provider,
259264
})
265+
.filter(|r| r.provider_address == provider)
260266
.collect())
261267
}
262268

apps/fortuna/src/chain/reader.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ pub trait EntropyReader: Send + Sync {
5151
&self,
5252
from_block: BlockNumber,
5353
to_block: BlockNumber,
54+
provider: Address,
5455
) -> Result<Vec<RequestedWithCallbackEvent>>;
5556

5657
/// Estimate the gas required to reveal a random number with a callback.
@@ -166,6 +167,7 @@ pub mod mock {
166167
&self,
167168
_from_block: BlockNumber,
168169
_to_block: BlockNumber,
170+
_provider: Address,
169171
) -> Result<Vec<super::RequestedWithCallbackEvent>> {
170172
Ok(vec![])
171173
}

apps/fortuna/src/keeper/block.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,11 @@ pub async fn process_single_block_batch(
122122
loop {
123123
let events_res = chain_state
124124
.contract
125-
.get_request_with_callback_events(block_range.from, block_range.to)
125+
.get_request_with_callback_events(
126+
block_range.from,
127+
block_range.to,
128+
chain_state.provider_address,
129+
)
126130
.await;
127131

128132
match events_res {

0 commit comments

Comments
 (0)