Skip to content

Commit 645f5b2

Browse files
committed
papyrus_base_layer: add CyclicBaseLayerWrapper
1 parent 9137c6a commit 645f5b2

File tree

6 files changed

+441
-1
lines changed

6 files changed

+441
-1
lines changed

Cargo.lock

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

crates/papyrus_base_layer/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,6 @@ validator.workspace = true
3232
apollo_l1_endpoint_monitor_types = { workspace = true, features = ["testing"] }
3333
assert_matches.workspace = true
3434
pretty_assertions.workspace = true
35+
rstest.workspace = true
3536
starknet-types-core.workspace = true
3637
starknet_api = { workspace = true, features = ["testing"] }
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
use std::ops::RangeInclusive;
2+
3+
use async_trait::async_trait;
4+
use starknet_api::block::BlockHashAndNumber;
5+
use url::Url;
6+
7+
use crate::{BaseLayerContract, L1BlockHeader, L1BlockNumber, L1BlockReference, L1Event};
8+
9+
#[cfg(test)]
10+
#[path = "cyclic_base_layer_wrapper_test.rs"]
11+
pub mod cyclic_base_layer_wrapper_test;
12+
13+
pub struct CyclicBaseLayerWrapper<B: BaseLayerContract + Send + Sync> {
14+
base_layer: B,
15+
}
16+
17+
impl<B: BaseLayerContract + Send + Sync> CyclicBaseLayerWrapper<B> {
18+
pub fn new(base_layer: B) -> Self {
19+
Self { base_layer }
20+
}
21+
}
22+
23+
#[async_trait]
24+
impl<B: BaseLayerContract + Send + Sync> BaseLayerContract for CyclicBaseLayerWrapper<B> {
25+
type Error = B::Error;
26+
27+
async fn get_proved_block_at(
28+
&mut self,
29+
l1_block: L1BlockNumber,
30+
) -> Result<BlockHashAndNumber, Self::Error> {
31+
let start_url = self.base_layer.get_url().await?;
32+
loop {
33+
let result = self.base_layer.get_proved_block_at(l1_block).await;
34+
if result.is_ok() {
35+
return result;
36+
}
37+
self.base_layer.cycle_provider_url().await?;
38+
if self.base_layer.get_url().await? == start_url {
39+
return result;
40+
}
41+
}
42+
}
43+
44+
async fn latest_l1_block_number(&mut self) -> Result<L1BlockNumber, Self::Error> {
45+
let start_url = self.base_layer.get_url().await?;
46+
loop {
47+
let result = self.base_layer.latest_l1_block_number().await;
48+
if result.is_ok() {
49+
return result;
50+
}
51+
self.base_layer.cycle_provider_url().await?;
52+
if self.base_layer.get_url().await? == start_url {
53+
return result;
54+
}
55+
}
56+
}
57+
58+
async fn l1_block_at(
59+
&mut self,
60+
block_number: L1BlockNumber,
61+
) -> Result<Option<L1BlockReference>, Self::Error> {
62+
let start_url = self.base_layer.get_url().await?;
63+
loop {
64+
let result = self.base_layer.l1_block_at(block_number).await;
65+
if result.is_ok() {
66+
return result;
67+
}
68+
self.base_layer.cycle_provider_url().await?;
69+
if self.base_layer.get_url().await? == start_url {
70+
return result;
71+
}
72+
}
73+
}
74+
75+
async fn events<'a>(
76+
&'a mut self,
77+
block_range: RangeInclusive<L1BlockNumber>,
78+
event_identifiers: &'a [&'a str],
79+
) -> Result<Vec<L1Event>, Self::Error> {
80+
let start_url = self.base_layer.get_url().await?;
81+
loop {
82+
let result = self.base_layer.events(block_range.clone(), event_identifiers).await;
83+
if result.is_ok() {
84+
return result;
85+
}
86+
self.base_layer.cycle_provider_url().await?;
87+
if self.base_layer.get_url().await? == start_url {
88+
return result;
89+
}
90+
}
91+
}
92+
93+
async fn get_block_header(
94+
&mut self,
95+
block_number: L1BlockNumber,
96+
) -> Result<Option<L1BlockHeader>, Self::Error> {
97+
let start_url = self.base_layer.get_url().await?;
98+
loop {
99+
let result = self.base_layer.get_block_header(block_number).await;
100+
if result.is_ok() {
101+
return result;
102+
}
103+
self.base_layer.cycle_provider_url().await?;
104+
if self.base_layer.get_url().await? == start_url {
105+
return result;
106+
}
107+
}
108+
}
109+
110+
async fn get_block_header_immutable(
111+
&self,
112+
block_number: L1BlockNumber,
113+
) -> Result<Option<L1BlockHeader>, Self::Error> {
114+
self.base_layer.get_block_header_immutable(block_number).await
115+
}
116+
117+
async fn get_url(&self) -> Result<Url, Self::Error> {
118+
self.base_layer.get_url().await
119+
}
120+
121+
async fn set_provider_url(&mut self, url: Url) -> Result<(), Self::Error> {
122+
self.base_layer.set_provider_url(url).await
123+
}
124+
125+
async fn cycle_provider_url(&mut self) -> Result<(), Self::Error> {
126+
self.base_layer.cycle_provider_url().await
127+
}
128+
}

0 commit comments

Comments
 (0)