pub const MAX_LP_FEE: u32 = 1_000_000;
pub const DYNAMIC_FEE_FLAG: u32 = 0x800000;
const REMOVE_OVERRIDE_MASK: u32 = 0xBFFFFF;
#[inline]
pub fn remove_override_flag(fee: u32) -> u32 {
fee & REMOVE_OVERRIDE_MASK
}
#[inline]
pub fn is_dynamic(fee: u32) -> bool {
fee == DYNAMIC_FEE_FLAG
}
#[inline]
pub fn is_valid(fee: u32) -> bool {
fee <= MAX_LP_FEE
}
#[cfg(test)]
mod tests {
use rstest::rstest;
use super::*;
const OVERRIDE_FEE_FLAG: u32 = 0x400000;
const DYNAMIC_FEE_FLAG: u32 = 0x800000;
#[rstest]
#[case::with_override_flag(3000u32 | OVERRIDE_FEE_FLAG, 3000u32)]
#[case::without_flag(3000u32, 3000u32)]
#[case::with_dynamic_flag(DYNAMIC_FEE_FLAG, DYNAMIC_FEE_FLAG)]
#[case::real_world_override(4_197_304, 3000)] fn test_remove_override_flag(#[case] input: u32, #[case] expected: u32) {
assert_eq!(remove_override_flag(input), expected);
}
#[rstest]
#[case::zero_fee(0, true)]
#[case::mid_range_fee(500_000, true)] #[case::max_fee(MAX_LP_FEE, true)] #[case::exceeds_max_by_one(MAX_LP_FEE + 1, false)]
#[case::exceeds_max_significantly(2_000_000, false)]
fn test_is_valid(#[case] fee: u32, #[case] expected: bool) {
assert_eq!(is_valid(fee), expected);
}
#[test]
fn test_constants_match_uniswap() {
assert_eq!(MAX_LP_FEE, 1_000_000);
assert_eq!(REMOVE_OVERRIDE_MASK, 0xBFFFFF);
assert_eq!(OVERRIDE_FEE_FLAG, 1u32 << 22);
assert_eq!(DYNAMIC_FEE_FLAG, 1u32 << 23);
}
#[test]
fn test_combined_flags() {
let fee_with_both_flags = OVERRIDE_FEE_FLAG | DYNAMIC_FEE_FLAG;
let cleaned = remove_override_flag(fee_with_both_flags);
assert_eq!(cleaned, DYNAMIC_FEE_FLAG);
}
}