use ethers::{
    types::{serde_helpers::Numeric, U256},
    utils::{parse_units, ParseUnits},
};

fn main() {
    // From strings
    let a = U256::from_dec_str("42").unwrap();
    assert_eq!(format!("{a:?}"), "42");

    let amount = "42";
    let units = 4;
    let pu: ParseUnits = parse_units(amount, units).unwrap();
    let b = U256::from(pu);
    assert_eq!(format!("{b:?}"), "420000");

    // From numbers
    let c = U256::from(42_u8);
    assert_eq!(format!("{c:?}"), "42");

    let d = U256::from(42_u16);
    assert_eq!(format!("{d:?}"), "42");

    let e = U256::from(42_u32);
    assert_eq!(format!("{e:?}"), "42");

    let f = U256::from(42_u64);
    assert_eq!(format!("{f:?}"), "42");

    let g = U256::from(42_u128);
    assert_eq!(format!("{g:?}"), "42");

    let h = U256::from(0x2a);
    assert_eq!(format!("{h:?}"), "42");

    let i: U256 = 42.into();
    assert_eq!(format!("{i:?}"), "42");

    // From `Numeric`
    let num: Numeric = Numeric::U256(U256::one());
    let l = U256::from(num);
    assert_eq!(format!("{l:?}"), "1");

    let num: Numeric = Numeric::Num(42);
    let m = U256::from(num);
    assert_eq!(format!("{m:?}"), "42");
}
