use degenbot_db::DegenbotDb;
use crate::aave::AAVE_DEPLOYMENTS;
use crate::error::CliError;
use crate::exchange::{resolve_deployment, RETIRED_EXCHANGES};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RegistrationReport {
pub exchanges: usize,
pub aave_markets: usize,
}
pub fn ensure_supported_registrations(
path: &std::path::Path,
) -> Result<RegistrationReport, CliError> {
let (db, _state) = DegenbotDb::open_for_writes(path)?;
let mut report = RegistrationReport {
exchanges: 0,
aave_markets: 0,
};
for entry in RETIRED_EXCHANGES {
let chain = i64::try_from(entry.chain_id).map_err(|_| {
CliError::InvalidArgument(format!("chain id {} is out of range", entry.chain_id))
})?;
if db.fetch_exchange_by_name(chain, entry.dex_slug)?.is_some() {
continue;
}
let deployment = resolve_deployment(entry.chain_id, entry.dex_slug)?;
let row = db.upsert_exchange(
chain,
deployment.dex_slug,
deployment.factory,
deployment.deployer,
)?;
if let Some(manager) = deployment.pool_manager {
db.upsert_pool_manager(
manager.address,
chain,
deployment.dex_slug,
Some(manager.state_view),
row.id,
)?;
}
report.exchanges += 1;
tracing::info!(
chain_id = entry.chain_id,
name = entry.dex_slug,
"registered supported exchange (inactive)"
);
}
for deployment in AAVE_DEPLOYMENTS {
let chain = i64::try_from(deployment.chain_id).map_err(|_| {
CliError::InvalidArgument(format!("chain id {} is out of range", deployment.chain_id))
})?;
if db
.fetch_aave_market_by_name(chain, deployment.market_name)?
.is_some()
{
continue;
}
db.register_aave_market(chain, deployment.market_name)?;
report.aave_markets += 1;
tracing::info!(
chain_id = deployment.chain_id,
name = deployment.market_name,
"registered supported aave market (inactive)"
);
}
Ok(report)
}