df-papertrade-core 0.0.11-beta

Papertrade SDK for Rust on df-hyperliquid-core: intents, relayer, live account, session keys, signed writes, deposits and exact venue math. Wasm-ready.
Documentation
//! Price scales, raw prices, the oracle's mid and collateral units.

use df_hyperliquid_core::utils::Dec;

use super::*;

#[test]
fn a_scale_is_a_power_of_ten() {
    assert_eq!(scale_places(1), Some(0));
    assert_eq!(scale_places(10), Some(1));
    assert_eq!(scale_places(100), Some(2));
    assert_eq!(scale_places(0), None);
    assert_eq!(scale_places(20), None);
}

#[test]
fn prices_read_at_their_scale() {
    assert_eq!(price(829_105, 10), Some(Dec::parse("82910.5").unwrap()));
    assert_eq!(price(249_235, 100), Some(Dec::parse("2492.35").unwrap()));
    assert_eq!(price_raw(Dec::parse("82910.5").unwrap(), 10), Some(829_105));
    assert_eq!(price_raw(Dec::parse("82910.55").unwrap(), 10), None, "finer than the market quotes");
}

#[test]
fn the_mid_is_the_oracles() {
    assert_eq!(mid(829_100, 829_110), Some(829_105));
    assert_eq!(mid(829_100, 829_101), Some(829_100));
    assert_eq!(mid(u128::MAX, u128::MAX), Some(u128::MAX));
    assert_eq!(mid(0, 1), None);
    assert_eq!(mid(2, 1), None, "crossed");
}

#[test]
fn collateral_is_eighteen_decimals() {
    assert_eq!(usd(10_000_000_000_000_000_000), Some(Dec::from_int(10)));
    assert_eq!(collateral(Dec::parse("10.5").unwrap()), Some(10_500_000_000_000_000_000));
    assert_eq!(collateral(Dec::parse("-1").unwrap()), None);
    assert_eq!(usdc_to_collateral(10_000_000), 10_000_000_000_000_000_000);
    assert_eq!(collateral_to_usdc(10_999_999_999_999_999_999), Some(10_999_999));
}