mars-core 1.0.0

Mars is a fully automated, on-chain credit protocol built on Terra and governed by a decentralised community of users and developers
Documentation
pub mod decimal;

use cosmwasm_std::{StdResult, Uint128};

pub fn uint128_checked_div_with_ceil(
    numerator: Uint128,
    denominator: Uint128,
) -> StdResult<Uint128> {
    let mut result = numerator.checked_div(denominator)?;

    if numerator.checked_rem(denominator)? > Uint128::zero() {
        result += Uint128::from(1_u128);
    }

    Ok(result)
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_uint128_checked_div_with_ceil() {
        let a = Uint128::new(120u128);
        let b = Uint128::zero();
        uint128_checked_div_with_ceil(a, b).unwrap_err();

        let a = Uint128::new(120u128);
        let b = Uint128::new(60_u128);
        let c = uint128_checked_div_with_ceil(a, b).unwrap();
        assert_eq!(c, Uint128::new(2u128));

        let a = Uint128::new(120u128);
        let b = Uint128::new(119_u128);
        let c = uint128_checked_div_with_ceil(a, b).unwrap();
        assert_eq!(c, Uint128::new(2u128));

        let a = Uint128::new(120u128);
        let b = Uint128::new(120_u128);
        let c = uint128_checked_div_with_ceil(a, b).unwrap();
        assert_eq!(c, Uint128::new(1u128));

        let a = Uint128::new(120u128);
        let b = Uint128::new(121_u128);
        let c = uint128_checked_div_with_ceil(a, b).unwrap();
        assert_eq!(c, Uint128::new(1u128));

        let a = Uint128::zero();
        let b = Uint128::new(121_u128);
        let c = uint128_checked_div_with_ceil(a, b).unwrap();
        assert_eq!(c, Uint128::zero());
    }
}