use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct MevConfig {
pub enabled: bool,
pub relay_url: Option<String>,
pub auto_detect: bool,
}
impl Default for MevConfig {
fn default() -> Self {
Self {
enabled: false,
relay_url: None,
auto_detect: true,
}
}
}
pub fn relay_urls() -> HashMap<u64, &'static str> {
let mut urls = HashMap::new();
urls.insert(1, "https://rpc.flashbots.net"); urls.insert(5, "https://rpc-goerli.flashbots.net"); urls
}
const MEV_SUSCEPTIBLE_SELECTORS: &[&str] = &[
"0x38ed1739", "0x8803dbee", "0x7ff36ab5", "0x18cbafe5", "0x5ae401dc", "0xac9650d8", "0x04e45aaf", "0xb858183f", "0x414bf389", "0xc04b8d59", "0x2e1a7d4d", "0xd0e30db0", ];
pub fn is_mev_susceptible(input: &str) -> bool {
let input = input.strip_prefix("0x").unwrap_or(input);
if input.len() < 8 {
return false;
}
let selector = format!("0x{}", &input[..8]);
MEV_SUSCEPTIBLE_SELECTORS.contains(&selector.as_str())
}
pub fn should_use_relay(config: &MevConfig, input: &str) -> bool {
if !config.enabled {
return false;
}
if config.relay_url.is_none() {
return false;
}
if config.auto_detect {
is_mev_susceptible(input)
} else {
true
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn detect_uniswap_v2_swap() {
assert!(is_mev_susceptible("0x38ed1739000000000000000000000000"));
}
#[test]
fn detect_uniswap_v3_multicall() {
assert!(is_mev_susceptible("0x5ae401dc000000000000000000000000"));
}
#[test]
fn non_mev_transaction() {
assert!(!is_mev_susceptible("0xa9059cbb000000000000000000000000"));
}
#[test]
fn short_input() {
assert!(!is_mev_susceptible("0x"));
assert!(!is_mev_susceptible(""));
assert!(!is_mev_susceptible("0x1234"));
}
#[test]
fn should_use_relay_disabled() {
let config = MevConfig::default(); assert!(!should_use_relay(&config, "0x38ed1739"));
}
#[test]
fn should_use_relay_enabled_auto() {
let config = MevConfig {
enabled: true,
relay_url: Some("https://rpc.flashbots.net".into()),
auto_detect: true,
};
assert!(should_use_relay(&config, "0x38ed1739")); assert!(!should_use_relay(&config, "0xa9059cbb")); }
#[test]
fn should_use_relay_always_when_no_autodetect() {
let config = MevConfig {
enabled: true,
relay_url: Some("https://rpc.flashbots.net".into()),
auto_detect: false,
};
assert!(should_use_relay(&config, "0xa9059cbb")); }
#[test]
fn relay_urls_has_mainnet() {
let urls = relay_urls();
assert!(urls.contains_key(&1));
}
#[test]
fn without_0x_prefix() {
assert!(is_mev_susceptible("38ed1739000000000000000000000000"));
}
}