kabu_types_entities/
swap.rs1use std::fmt::{Display, Formatter};
2use std::sync::Arc;
3
4use crate::{PoolId, PoolWrapper, SwapLine, SwapStep, Token};
5use alloy_primitives::{Address, U256};
6
7#[derive(Clone, Debug)]
8pub enum Swap {
9 None,
10 ExchangeSwapLine(SwapLine),
11 BackrunSwapSteps((SwapStep, SwapStep)),
12 BackrunSwapLine(SwapLine),
13 Multiple(Vec<Swap>),
14}
15
16impl Display for Swap {
17 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
18 match self {
19 Swap::ExchangeSwapLine(path) => write!(f, "{path}"),
20 Swap::BackrunSwapLine(path) => write!(f, "{path}"),
21 Swap::BackrunSwapSteps((sp0, sp1)) => write!(f, "{sp0} {sp1}"),
22 Swap::Multiple(_) => write!(f, "MULTIPLE_SWAP"),
23 Swap::None => write!(f, "UNKNOWN_SWAP_TYPE"),
24 }
25 }
26}
27
28impl Swap {
29 pub fn to_swap_steps(self: &Swap, multicaller: Address) -> Option<(SwapStep, SwapStep)> {
30 match self {
31 Swap::BackrunSwapLine(swap_line) => swap_line.to_swap_steps(multicaller),
32 Swap::BackrunSwapSteps((sp0, sp1)) => Some((sp0.clone(), sp1.clone())),
33 _ => None,
34 }
35 }
36
37 pub fn arb_profit(&self) -> U256 {
38 match self {
39 Swap::BackrunSwapLine(path) => path.abs_profit(),
40 Swap::BackrunSwapSteps((sp0, sp1)) => SwapStep::arb_profit(sp0, sp1),
41 Swap::Multiple(swap_vec) => swap_vec.iter().map(|x| x.arb_profit()).sum(),
42 Swap::None => U256::ZERO,
43 Swap::ExchangeSwapLine(_) => U256::ZERO,
44 }
45 }
46
47 pub fn pre_estimate_gas(&self) -> u64 {
48 match self {
49 Swap::ExchangeSwapLine(path) => path.gas_used.unwrap_or_default(),
50 Swap::BackrunSwapLine(path) => path.gas_used.unwrap_or_default(),
51 Swap::BackrunSwapSteps((sp0, sp1)) => {
52 sp0.swap_line_vec().iter().map(|i| i.gas_used.unwrap_or_default()).sum::<u64>()
53 + sp1.swap_line_vec().iter().map(|i| i.gas_used.unwrap_or_default()).sum::<u64>()
54 }
55 Swap::Multiple(swap_vec) => swap_vec.iter().map(|x| x.pre_estimate_gas()).sum(),
56 Swap::None => 0,
57 }
58 }
59
60 pub fn arb_profit_eth(&self) -> U256 {
61 match self {
62 Swap::ExchangeSwapLine(_) => U256::ZERO,
63 Swap::BackrunSwapLine(path) => path.abs_profit_eth(),
64 Swap::BackrunSwapSteps((sp0, sp1)) => SwapStep::arb_profit_eth(sp0, sp1),
65 Swap::Multiple(swap_vec) => swap_vec.iter().map(|x| x.arb_profit_eth()).sum(),
66 Swap::None => U256::ZERO,
67 }
68 }
69
70 pub fn get_first_token(&self) -> Option<&Arc<Token>> {
71 match self {
72 Swap::ExchangeSwapLine(swap_path) => swap_path.get_first_token(),
73 Swap::BackrunSwapLine(swap_path) => swap_path.get_first_token(),
74 Swap::BackrunSwapSteps((sp0, _sp1)) => sp0.get_first_token(),
75 Swap::Multiple(_) => None,
76 Swap::None => None,
77 }
78 }
79
80 pub fn get_pool_id_vec(&self) -> Vec<PoolId> {
81 match self {
82 Swap::ExchangeSwapLine(swap_line) => swap_line.pools().iter().map(|item| item.get_pool_id()).collect(),
83 Swap::BackrunSwapLine(swap_line) => swap_line.pools().iter().map(|item| item.get_pool_id()).collect(),
84 Swap::BackrunSwapSteps((sp0, sp1)) => {
85 let mut swap_line_vec = sp0.swap_line_vec().clone();
86 swap_line_vec.extend(sp1.swap_line_vec().clone());
87 swap_line_vec.iter().flat_map(|item| item.pools().iter().map(|p| p.get_pool_id()).collect::<Vec<_>>()).collect()
88 }
89 Swap::Multiple(swap_vec) => swap_vec.iter().flat_map(|x| x.get_pool_id_vec()).collect(),
90 Swap::None => Vec::new(),
91 }
92 }
93
94 pub fn get_pool_address_vec(&self) -> Vec<PoolId> {
95 match self {
96 Swap::ExchangeSwapLine(swap_line) => swap_line.pools().iter().map(|item| item.get_address()).collect(),
97 Swap::BackrunSwapLine(swap_line) => swap_line.pools().iter().map(|item| item.get_address()).collect(),
98 Swap::BackrunSwapSteps((sp0, sp1)) => {
99 let mut swap_line_vec = sp0.swap_line_vec().clone();
100 swap_line_vec.extend(sp1.swap_line_vec().clone());
101 swap_line_vec.iter().flat_map(|item| item.pools().iter().map(|p| p.get_address()).collect::<Vec<_>>()).collect()
102 }
103 Swap::Multiple(swap_vec) => swap_vec.iter().flat_map(|x| x.get_pool_address_vec()).collect(),
104 Swap::None => Vec::new(),
105 }
106 }
107
108 pub fn get_pools_vec(&self) -> Vec<PoolWrapper> {
109 match self {
110 Swap::ExchangeSwapLine(swap_line) => swap_line.pools().clone(),
111 Swap::BackrunSwapLine(swap_line) => swap_line.pools().clone(),
112 Swap::BackrunSwapSteps((sp0, sp1)) => {
113 let mut swap_line_vec = sp0.swap_line_vec().clone();
114 swap_line_vec.extend(sp1.swap_line_vec().clone());
115 swap_line_vec.iter().flat_map(|item| item.pools().iter().cloned()).collect::<Vec<_>>().to_vec()
116 }
117 Swap::Multiple(swap_vec) => swap_vec.iter().flat_map(|x| x.get_pools_vec()).collect(),
118 Swap::None => Vec::new(),
119 }
120 }
121}