use alloy::primitives::U256;
use degenbot_executor::composers::{HopInfo, PathInfo};
use degenbot_solvers::mixed::SolvePathResult;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum HopFamily {
V2,
V3,
V4,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct HopDescriptor {
pub family: HopFamily,
pub pool_address: alloy::primitives::Address,
pub token0: alloy::primitives::Address,
pub token1: alloy::primitives::Address,
pub zfo: bool,
pub v4_pool_id: Option<String>,
}
impl HopDescriptor {
#[must_use]
pub fn from_hop_info(hop: &HopInfo) -> Self {
match hop {
HopInfo::V2(h) => Self {
family: HopFamily::V2,
pool_address: h.pool_address,
token0: h.token0_address,
token1: h.token1_address,
zfo: h.zfo,
v4_pool_id: None,
},
HopInfo::V3(h) => Self {
family: HopFamily::V3,
pool_address: h.pool_address,
token0: h.token0_address,
token1: h.token1_address,
zfo: h.zfo,
v4_pool_id: None,
},
HopInfo::V4(h) => Self {
family: HopFamily::V4,
pool_address: h.pool_manager_address,
token0: h.currency0_address,
token1: h.currency1_address,
zfo: h.zfo,
v4_pool_id: Some(h.pool_id_hex.clone()),
},
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SolveResult {
pub path_id: u64,
pub hop_count: usize,
pub optimal_input: U256,
pub hop_outputs: Vec<U256>,
pub consumed_inputs: Vec<U256>,
pub net_profit: U256,
pub hop_descriptors: Vec<HopDescriptor>,
}
impl SolveResult {
#[must_use]
pub fn from_solve_path(path_id: u64, result: &SolvePathResult, path: &PathInfo) -> Self {
Self {
path_id,
hop_count: path.hops.len(),
optimal_input: result.optimal_input,
hop_outputs: result.hop_outputs.clone(),
consumed_inputs: result.consumed_inputs.clone(),
net_profit: result.profit,
hop_descriptors: path.hops.iter().map(HopDescriptor::from_hop_info).collect(),
}
}
}