use std::path::PathBuf;
use crate::{
common::chain,
config::{
contracts::{get_deployment_env, ContractsConfig},
ipfs::IpfsConfig,
rpc::ChainRpcProviderConfig,
},
};
pub mod contracts;
pub mod data_provider;
pub use data_provider::DataProviderConfig;
pub mod encryption;
pub use encryption::EncryptionConfig;
pub mod dotenv;
pub mod error;
pub mod ipfs;
pub mod key;
pub mod loader;
pub use loader::ConfigLoader;
use tracing::info;
pub mod log;
pub mod macros;
pub mod multichain;
pub use multichain::MultiChainConfig;
pub mod rpc;
#[derive(Debug, Clone)]
pub struct NewtonAvsConfig<T: PartialEq + Eq + Clone + ConfigLoader> {
pub env: String,
pub chain_id: u64,
pub source_chain_id: Option<u64>,
pub rpc: ChainRpcProviderConfig,
pub ipfs: IpfsConfig,
pub contracts: ContractsConfig,
pub service: T,
pub data_provider: DataProviderConfig,
}
#[derive(Debug)]
pub struct NewtonAvsConfigBuilder {
chain_id: u64,
service_config_path: Option<PathBuf>,
data_provider: Option<PathBuf>,
skip_contracts: bool,
}
impl NewtonAvsConfigBuilder {
pub fn new(chain_id: u64) -> Self {
Self {
chain_id,
service_config_path: None,
data_provider: None,
skip_contracts: false,
}
}
pub fn with_service_path(mut self, path: PathBuf) -> Self {
self.service_config_path = Some(path);
self
}
pub fn with_data_provider_path(mut self, path: PathBuf) -> Self {
self.data_provider = Some(path);
self
}
pub fn skip_contracts(mut self) -> Self {
self.skip_contracts = true;
self
}
pub fn build<T: PartialEq + Eq + Clone + ConfigLoader>(self) -> Result<NewtonAvsConfig<T>, std::io::Error> {
let service = T::load_config(self.service_config_path).map_err(|e| std::io::Error::other(e.to_string()))?;
let data_provider =
DataProviderConfig::load_config(self.data_provider).map_err(|e| std::io::Error::other(e.to_string()))?;
let config = NewtonAvsConfig::load(self.chain_id, service, data_provider, self.skip_contracts)?;
Ok(config)
}
}
impl<T: PartialEq + Eq + Clone + ConfigLoader> NewtonAvsConfig<T> {
fn load(
chain_id: u64,
service: T,
data_provider: DataProviderConfig,
skip_contracts: bool,
) -> Result<Self, std::io::Error> {
info!("Loading config for chain_id: {}", chain_id);
crate::config::dotenv::init().ok();
let env = get_deployment_env();
let rpc = ChainRpcProviderConfig::load();
let contracts = if skip_contracts {
ContractsConfig::default()
} else if chain::is_destination_chain(chain_id) {
let src_id = chain::get_source_chain_id(chain_id).ok_or_else(|| {
std::io::Error::other(format!("no source chain mapping for destination chain {}", chain_id))
})?;
ContractsConfig::load(src_id, env.clone())?.with_destination_chain_id(chain_id, &env)?
} else {
ContractsConfig::load(chain_id, env.clone())?
};
Ok(Self {
chain_id,
source_chain_id: chain::get_source_chain_id(chain_id),
env,
rpc,
ipfs: IpfsConfig::default(),
contracts,
service,
data_provider,
})
}
pub fn is_destination_chain(&self) -> bool {
chain::is_destination_chain(self.chain_id)
}
pub fn is_source_chain(&self) -> bool {
chain::is_source_chain(self.chain_id)
}
pub fn get_source_chain_id(&self) -> u64 {
chain::get_source_chain_id(self.chain_id).unwrap_or(self.chain_id)
}
}