Skip to content

Commit 771f815

Browse files
committed
CLI for testing
1 parent 55843c1 commit 771f815

File tree

4 files changed

+64
-45
lines changed

4 files changed

+64
-45
lines changed

apps/fortuna/src/chain/ethereum.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,38 @@ impl<T: JsonRpcClient + 'static + Clone> SignablePythContractInner<T> {
9393
}
9494
}
9595

96+
/// Submit a request for a random number to the contract.
97+
///
98+
/// This method is a version of the autogenned `request` method that parses the emitted logs
99+
/// to return the sequence number of the created Request.
100+
pub async fn request_with_callback_wrapper(
101+
&self,
102+
provider: &Address,
103+
user_randomness: &[u8; 32],
104+
) -> Result<u64> {
105+
let fee = self.get_fee(*provider).call().await?;
106+
107+
let hashed_randomness: [u8; 32] = Keccak256::digest(user_randomness).into();
108+
109+
if let Some(r) = self
110+
.request_with_callback(*provider, hashed_randomness)
111+
.value(fee)
112+
.send()
113+
.await?
114+
.await?
115+
{
116+
// Extract Log from TransactionReceipt.
117+
let l: RawLog = r.logs[0].clone().into();
118+
if let PythRandomEvents::RequestedFilter(r) = PythRandomEvents::decode_log(&l)? {
119+
Ok(r.request.sequence_number)
120+
} else {
121+
Err(anyhow!("No log with sequence number"))
122+
}
123+
} else {
124+
Err(anyhow!("Request failed"))
125+
}
126+
}
127+
96128
/// Reveal the generated random number to the contract.
97129
///
98130
/// This method is a version of the autogenned `reveal` method that parses the emitted logs
Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
use {
22
crate::{
3-
api::GetRandomValueResponse,
4-
chain::ethereum::SignablePythContract,
3+
chain::ethereum::{SignablePythContract, RevealedWithCallbackFilter},
54
config::{Config, GenerateOptions},
6-
},
7-
anyhow::Result,
8-
base64::{engine::general_purpose::STANDARD as base64_standard_engine, Engine as _},
9-
std::sync::Arc,
5+
}, anyhow::Result, base64::{engine::general_purpose::STANDARD as base64_standard_engine, Engine as _}, ethers::providers::Middleware, std::sync::Arc,
6+
tokio::time::{self, Duration},
107
};
118

129
/// Run the entire random number generation protocol to produce a random number.
@@ -22,42 +19,41 @@ pub async fn generate(opts: &GenerateOptions) -> Result<()> {
2219
let user_randomness = rand::random::<[u8; 32]>();
2320
let provider = opts.provider;
2421

22+
let mut last_block_number = contract.provider().get_block_number().await?;
23+
2524
// Request a random number on the contract
2625
let sequence_number = contract
27-
.request_wrapper(&provider, &user_randomness, opts.blockhash)
26+
.request_with_callback_wrapper(&provider, &user_randomness)
2827
.await?;
2928

3029
tracing::info!(sequence_number = sequence_number, "random number requested",);
3130

32-
// Get the committed value from the provider
33-
let resp = reqwest::get(opts.url.join(&format!(
34-
"/v1/chains/{}/revelations/{}",
35-
opts.chain_id, sequence_number
36-
))?)
37-
.await?
38-
.json::<GetRandomValueResponse>()
39-
.await?;
40-
41-
tracing::info!(
42-
response = base64_standard_engine.encode(resp.value.data()),
43-
"Retrieved the provider's random value.",
44-
);
45-
let provider_randomness = resp.value.data();
46-
47-
// Submit the provider's and our values to the contract to reveal the random number.
48-
let random_value = contract
49-
.reveal_wrapper(
50-
&provider,
51-
sequence_number,
52-
&user_randomness,
53-
provider_randomness,
54-
)
55-
.await?;
56-
57-
tracing::info!(
58-
number = base64_standard_engine.encode(random_value),
59-
"Random number generated."
60-
);
31+
for _i in [0..10] {
32+
let current_block_number = contract.provider().get_block_number().await?;
33+
tracing::info!(
34+
start_block = last_block_number.as_u64(),
35+
end_block = current_block_number.as_u64(),
36+
"Checking events between blocks."
37+
);
38+
39+
let mut event = contract.revealed_with_callback_filter();
40+
event.filter = event.filter.from_block(last_block_number).to_block(current_block_number);
41+
42+
let res: Vec<RevealedWithCallbackFilter> = event.query().await?;
43+
44+
for r in res.iter() {
45+
if r.request.sequence_number == sequence_number && r.request.provider == provider {
46+
tracing::info!(
47+
number = base64_standard_engine.encode(r.random_number),
48+
"Random number generated."
49+
);
50+
break;
51+
}
52+
}
53+
54+
last_block_number = current_block_number;
55+
time::sleep(Duration::from_secs(1)).await;
56+
}
6157

6258
Ok(())
6359
}

apps/fortuna/src/config.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ mod setup_provider;
2525
mod withdraw_fees;
2626

2727
const DEFAULT_RPC_ADDR: &str = "127.0.0.1:34000";
28-
const DEFAULT_HTTP_ADDR: &str = "http://127.0.0.1:34000";
2928

3029
#[derive(Parser, Debug)]
3130
#[command(name = crate_name!())]

apps/fortuna/src/config/generate.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use {
22
crate::{api::ChainId, config::ConfigOptions},
33
clap::Args,
44
ethers::types::Address,
5-
reqwest::Url,
65
};
76

87
#[derive(Args, Clone, Debug)]
@@ -27,11 +26,4 @@ pub struct GenerateOptions {
2726
/// Submit a randomness request to this provider
2827
#[arg(long = "provider")]
2928
pub provider: Address,
30-
31-
#[arg(long = "url")]
32-
#[arg(default_value = super::DEFAULT_HTTP_ADDR)]
33-
pub url: Url,
34-
35-
#[arg(short = 'b')]
36-
pub blockhash: bool,
3729
}

0 commit comments

Comments
 (0)