#[tokio::main]
async fn main() {
tracing_subscriber::fmt::init();
client::run().await;
}
pub struct Http(reqwest::Client);
impl Http {
pub fn new() -> Self {
Self(reqwest::Client::new())
}
}
#[cfg_attr(target_arch = "wasm32", async_trait::async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)]
impl gen::client::HttpClient for Http {
async fn post(
&self,
url: &str,
request: &iamgroot::jsonrpc::Request,
) -> std::result::Result<iamgroot::jsonrpc::Response, iamgroot::jsonrpc::Error> {
Ok(self.0.post(url)
.json(request)
.send()
.await
.map_err(|e| {
iamgroot::jsonrpc::Error::new(-32001, format!("post request failed: {e}"))
})?
.json()
.await
.map_err(|e| {
iamgroot::jsonrpc::Error::new(-32002, format!("post response failed: {e}"))
})?)
}
}
mod client {
use super::*;
pub async fn run() {
use crate::gen::Rpc;
let url = std::env::var("URL").expect("URL");
let client = gen::client::Client::new(&url, Http::new());
let block_id = gen::BlockId::BlockTag(gen::BlockTag::Latest);
let block = match client.getBlockWithTxs(block_id).await.unwrap() {
gen::GetBlockWithTxsResult::BlockWithTxs(block) => block,
_ => panic!("got pending block for some reason..."),
};
let hash = block.block_header.block_hash.0.as_ref();
let number = block.block_header.block_number.as_ref();
println!("{}", serde_json::to_string_pretty(&block).unwrap());
let block_hash = gen::BlockHash(gen::Felt::try_new(hash).unwrap());
let block_id = gen::BlockId::BlockHash { block_hash };
let state = client.getStateUpdate(block_id).await.unwrap();
println!("{}", serde_json::to_string_pretty(&state).unwrap());
let events = client
.getEvents(gen::GetEventsFilter {
event_filter: gen::EventFilter {
from_block: Some(gen::BlockId::BlockNumber {
block_number: gen::BlockNumber::try_new(*number - 10)
.unwrap(),
}),
to_block: Some(gen::BlockId::BlockNumber {
block_number: gen::BlockNumber::try_new(*number)
.unwrap(),
}),
address: None,
keys: None,
},
result_page_request: gen::ResultPageRequest {
continuation_token: None,
chunk_size: gen::ResultPageRequestChunkSize::try_new(1000)
.unwrap(),
},
})
.await
.unwrap();
println!("{}", serde_json::to_string_pretty(&events).unwrap());
tracing::debug!("block hash: {hash}");
tracing::debug!("block number: {number}");
}
}