add config.rs
This commit is contained in:
parent
505a594fcf
commit
afd25649fb
76
src/config.rs
Normal file
76
src/config.rs
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
use ethers::prelude::{Block, TxHash};
|
||||||
|
use governor::clock::QuantaClock;
|
||||||
|
use serde::Deserialize;
|
||||||
|
use std::collections::{BTreeMap, HashMap};
|
||||||
|
use std::num::NonZeroU32;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use tokio::sync::mpsc;
|
||||||
|
|
||||||
|
use crate::block_watcher::BlockWatcherSender;
|
||||||
|
// use crate::block_watcher::BlockWatcher;
|
||||||
|
use crate::connection::Web3Connection;
|
||||||
|
use crate::Web3ProxyApp;
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct RootConfig {
|
||||||
|
pub config: Web3ProxyConfig,
|
||||||
|
pub balanced_rpc_tiers: BTreeMap<String, HashMap<String, Web3ConnectionConfig>>,
|
||||||
|
pub private_rpcs: HashMap<String, Web3ConnectionConfig>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct Web3ProxyConfig {
|
||||||
|
pub listen_port: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct Web3ConnectionConfig {
|
||||||
|
url: String,
|
||||||
|
soft_limit: u32,
|
||||||
|
hard_limit: Option<u32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RootConfig {
|
||||||
|
pub async fn try_build(self) -> anyhow::Result<Web3ProxyApp> {
|
||||||
|
let balanced_rpc_tiers = self
|
||||||
|
.balanced_rpc_tiers
|
||||||
|
.into_values()
|
||||||
|
.map(|x| x.into_values().collect())
|
||||||
|
.collect();
|
||||||
|
let private_rpcs = self.private_rpcs.into_values().collect();
|
||||||
|
|
||||||
|
Web3ProxyApp::try_new(balanced_rpc_tiers, private_rpcs).await
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Web3ConnectionConfig {
|
||||||
|
pub async fn try_build(
|
||||||
|
self,
|
||||||
|
clock: &QuantaClock,
|
||||||
|
block_watcher_sender: BlockWatcherSender,
|
||||||
|
http_client: Option<reqwest::Client>,
|
||||||
|
) -> anyhow::Result<Arc<Web3Connection>> {
|
||||||
|
let hard_rate_limiter = if let Some(hard_limit) = self.hard_limit {
|
||||||
|
let quota = governor::Quota::per_second(NonZeroU32::new(hard_limit).unwrap());
|
||||||
|
|
||||||
|
let rate_limiter = governor::RateLimiter::direct_with_clock(quota, clock);
|
||||||
|
|
||||||
|
Some(rate_limiter)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
|
Web3Connection::try_new(
|
||||||
|
self.url,
|
||||||
|
http_client,
|
||||||
|
block_watcher_sender,
|
||||||
|
hard_rate_limiter,
|
||||||
|
self.soft_limit,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn url(&self) -> &str {
|
||||||
|
&self.url
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user