use crate::record::FailureDetail;
use alloy::primitives::U256;
use degenbot_arbitrage::{DispatchCandidate, SimResult, SolveStep};
use degenbot_executor::composers::{EncodeOptions, PathInfo};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RawResult {
pub path_id: u64,
pub optimal_input: u128,
pub profit: u128,
pub hop_outputs: Vec<u128>,
pub consumed_inputs: Vec<u128>,
pub solve_block: u64,
pub state_nonces: Vec<u64>,
}
impl RawResult {
#[must_use]
pub fn has_hops(&self) -> bool {
!self.hop_outputs.is_empty()
}
#[must_use]
pub fn to_candidate(&self, path_info: PathInfo, opts: EncodeOptions) -> DispatchCandidate {
let count = self
.hop_outputs
.len()
.min(self.consumed_inputs.len())
.min(self.state_nonces.len());
let steps: Vec<SolveStep> = (0..count)
.map(|i| SolveStep {
output: self.hop_outputs[i],
consumed_input: self.consumed_inputs[i],
state_nonce: self.state_nonces[i],
})
.collect();
DispatchCandidate {
path_id: self.path_id,
optimal_input: self.optimal_input,
engine_profit: self.profit,
steps: steps.into_boxed_slice(),
solve_block: self.solve_block,
path_info,
opts,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct PayloadRow {
pub path_id: u64,
pub gross_profit: U256,
pub net_profit: U256,
pub gas_used: u64,
pub priority_fee: u128,
pub base_fee_next: u128,
pub execute_calldata: alloy::primitives::Bytes,
pub access_list: Option<alloy::rpc::types::AccessList>,
pub failure: Option<PayloadFailure>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PayloadFailure {
pub bucket: String,
pub fail_index: Option<usize>,
pub revert_data: alloy::primitives::Bytes,
}
impl PayloadRow {
#[must_use]
pub fn sim_result(&self) -> SimResult {
SimResult {
path_id: self.path_id,
gross_profit: self.gross_profit,
net_profit: self.net_profit,
gas_used: self.gas_used,
priority_fee: self.priority_fee,
base_fee_next: self.base_fee_next,
execute_calldata: self.execute_calldata.clone(),
access_list: self.access_list.clone(),
captured_swaps: Vec::new(),
hop_count: 0,
}
}
#[must_use]
pub fn failure_detail(&self) -> Option<FailureDetail> {
self.failure.as_ref().map(|f| FailureDetail {
path_id: self.path_id,
bucket: f.bucket.clone(),
fail_index: f.fail_index,
revert_data: f.revert_data.clone(),
reverting_frame: None,
captured_swaps: Vec::new(),
log_full_count: 0,
reverted_swaps: Vec::new(),
optimal_input: 0,
hop_outputs: Vec::new(),
call_trace: Vec::new(),
weth_before: 0,
weth_after: 0,
eth_before: 0,
eth_after: 0,
erc6909_before: 0,
erc6909_after: 0,
})
}
}