use std::{str::FromStr, time::Duration};
use clap::Parser;
use ethers_core::types::{Address, H256};
use ethers_providers::{Http, Provider};
use eyre::Result;
use serde::{Deserialize, Serialize};
use crate::{errors::ConfigError, extract_env};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Config {
pub sequencer_private_key: String,
pub sequencer_address: String,
pub proposer_private_key: String,
pub proposer_address: String,
pub l1_client_rpc_url: String,
pub l2_client_rpc_url: String,
pub data_availability_layer: String,
pub network: String,
pub polling_interval: Option<Duration>,
}
impl Default for Config {
fn default() -> Self {
Self {
sequencer_private_key: String::from(
"0xa0bba68a40ddd0b573c344de2e7dd597af69b3d90e30a87ec91fa0547ddb6ab8",
),
sequencer_address: String::from("0xf4031e0983177452c9e7F27f46ff6bB9CA5933E1"),
proposer_private_key: String::from(
"0x4a6e5ceb37cd67ed8e740cc25b0ee6d11f6cfabe366daad1c908dec1d178bc72",
),
proposer_address: String::from("0x87A159604e2f18B01a080F672ee011F39777E640"),
l1_client_rpc_url: String::from(""),
l2_client_rpc_url: String::from(""),
data_availability_layer: String::from("mainnet"),
network: String::from("optimism-mainnet"),
polling_interval: Some(Duration::from_secs(5)),
}
}
}
impl Config {
pub fn get_sequencer_priv_key(&self) -> H256 {
H256::from_str(&self.sequencer_private_key).unwrap()
}
pub fn get_sequencer_address(&self) -> Address {
Address::from_str(&self.sequencer_address).unwrap()
}
pub fn get_proposer_priv_key(&self) -> H256 {
H256::from_str(&self.proposer_private_key).unwrap()
}
pub fn get_proposer_address(&self) -> Address {
Address::from_str(&self.proposer_address).unwrap()
}
pub fn get_l1_client(&self) -> Result<Provider<Http>> {
Ok(Provider::<Http>::try_from(&self.l1_client_rpc_url)
.map_err(|_| ConfigError::InvalidL1ClientUrl)?)
}
pub fn get_l2_client(&self) -> Result<Provider<Http>> {
Ok(Provider::<Http>::try_from(&self.l2_client_rpc_url)
.map_err(|_| ConfigError::InvalidL2ClientUrl)?)
}
}
#[derive(Parser)]
pub struct Cli {
#[clap(
short = 'k',
long,
default_value = "0xa0bba68a40ddd0b573c344de2e7dd597af69b3d90e30a87ec91fa0547ddb6ab8"
)]
sequencer_private_key: String,
#[clap(
short = 's',
long,
default_value = "0xf4031e0983177452c9e7F27f46ff6bB9CA5933E1"
)]
sequencer_address: String,
#[clap(
short = 'p',
long,
default_value = "0x4a6e5ceb37cd67ed8e740cc25b0ee6d11f6cfabe366daad1c908dec1d178bc72"
)]
proposer_private_key: String,
#[clap(
short = 'a',
long,
default_value = "0x87A159604e2f18B01a080F672ee011F39777E640"
)]
proposer_address: String,
#[clap(short = 'l', long)]
l1_client_rpc_url: Option<String>,
#[clap(short = 'c', long)]
l2_client_rpc_url: Option<String>,
#[clap(short = 'd', long, default_value = "mainnet")]
data_availability_layer: String,
#[clap(short = 'n', long, default_value = "optimism-mainnet")]
network: String,
#[clap(short = 'i', long, default_value = "5")]
polling_interval: u64,
}
impl Cli {
pub fn to_config(self) -> Config {
let l1_rpc_url = self.l1_client_rpc_url.unwrap_or(extract_env!("L1_RPC_URL"));
let l2_rpc_url = self.l2_client_rpc_url.unwrap_or(extract_env!("L2_RPC_URL"));
Config {
sequencer_private_key: self.sequencer_private_key,
sequencer_address: self.sequencer_address,
proposer_private_key: self.proposer_private_key,
proposer_address: self.proposer_address,
l1_client_rpc_url: l1_rpc_url,
l2_client_rpc_url: l2_rpc_url,
data_availability_layer: self.data_availability_layer,
network: self.network,
polling_interval: Some(Duration::from_secs(self.polling_interval)),
}
}
}