riptide-amm-math 1.0.3

The Riptide program math library
Documentation
use super::{super::error::CoreError, QuoteType, SingleSideLiquidity};

pub(crate) fn flat_liquidity(
    price: u128,
    quote_type: QuoteType,
    reserves_a: u64,
    reserves_b: u64,
) -> Result<SingleSideLiquidity, CoreError> {
    let mut liquidity = SingleSideLiquidity::new();
    if quote_type.a_to_b() {
        liquidity.push((price, reserves_b));
    } else {
        liquidity.push((price, reserves_a));
    }
    Ok(liquidity)
}

#[cfg(test)]
mod tests {
    use super::*;
    use rstest::rstest;

    #[rstest]
    #[case(QuoteType::TokenAExactIn, 1000, 2000, Ok(2000))]
    #[case(QuoteType::TokenAExactOut, 1000, 2000, Ok(1000))]
    #[case(QuoteType::TokenBExactIn, 1000, 2000, Ok(1000))]
    #[case(QuoteType::TokenBExactOut, 1000, 2000, Ok(2000))]
    fn test_flat_liquidity(
        #[case] quote_type: QuoteType,
        #[case] reserves_a: u64,
        #[case] reserves_b: u64,
        #[case] expected: Result<u64, CoreError>,
    ) {
        let price = 1 << 64;
        let liquidity = flat_liquidity(price, quote_type, reserves_a, reserves_b);
        let expected = expected.map(|x| SingleSideLiquidity::from_slice(&[(price, x)]));
        assert_eq!(liquidity, expected);
    }
}