diff --git a/common/src/asset.rs b/common/src/asset.rs index e3c72727..9fdbe2bd 100644 --- a/common/src/asset.rs +++ b/common/src/asset.rs @@ -506,4 +506,100 @@ mod tests { let deserialized: BorrowAssetAmount = serde_json::from_str(&serialized).unwrap(); assert_eq!(deserialized, amount); } + + #[test] + fn checked_add() { + let v = BorrowAssetAmount::new(0).checked_add(BorrowAssetAmount::new(0)); + assert_eq!(v, Some(BorrowAssetAmount::new(0))); + let v = BorrowAssetAmount::new(0).checked_add(BorrowAssetAmount::new(100)); + assert_eq!(v, Some(BorrowAssetAmount::new(100))); + let v = BorrowAssetAmount::new(100).checked_add(BorrowAssetAmount::new(0)); + assert_eq!(v, Some(BorrowAssetAmount::new(100))); + let v = BorrowAssetAmount::new(100).checked_add(BorrowAssetAmount::new(100)); + assert_eq!(v, Some(BorrowAssetAmount::new(200))); + let v = BorrowAssetAmount::new(1).checked_add(BorrowAssetAmount::new(u128::MAX)); + assert_eq!(v, None); + } + + #[test] + fn checked_sub() { + let v = BorrowAssetAmount::new(0).checked_sub(BorrowAssetAmount::new(0)); + assert_eq!(v, Some(BorrowAssetAmount::new(0))); + let v = BorrowAssetAmount::new(0).checked_sub(BorrowAssetAmount::new(100)); + assert_eq!(v, None); + let v = BorrowAssetAmount::new(100).checked_sub(BorrowAssetAmount::new(0)); + assert_eq!(v, Some(BorrowAssetAmount::new(100))); + let v = BorrowAssetAmount::new(100).checked_sub(BorrowAssetAmount::new(100)); + assert_eq!(v, Some(BorrowAssetAmount::new(0))); + let v = BorrowAssetAmount::new(1).checked_sub(BorrowAssetAmount::new(u128::MAX - 33)); + assert_eq!(v, None); + } + + #[test] + fn saturating_add() { + let v = BorrowAssetAmount::new(0).saturating_add(BorrowAssetAmount::new(0)); + assert_eq!(v, BorrowAssetAmount::new(0)); + let v = BorrowAssetAmount::new(0).saturating_add(BorrowAssetAmount::new(100)); + assert_eq!(v, BorrowAssetAmount::new(100)); + let v = BorrowAssetAmount::new(100).saturating_add(BorrowAssetAmount::new(0)); + assert_eq!(v, BorrowAssetAmount::new(100)); + let v = BorrowAssetAmount::new(100).saturating_add(BorrowAssetAmount::new(100)); + assert_eq!(v, BorrowAssetAmount::new(200)); + let v = BorrowAssetAmount::new(100).saturating_add(BorrowAssetAmount::new(u128::MAX - 33)); + assert_eq!(v, BorrowAssetAmount::new(u128::MAX)); + } + + #[test] + fn saturating_sub() { + let v = BorrowAssetAmount::new(0).saturating_sub(BorrowAssetAmount::new(0)); + assert_eq!(v, BorrowAssetAmount::new(0)); + let v = BorrowAssetAmount::new(0).saturating_sub(BorrowAssetAmount::new(100)); + assert_eq!(v, BorrowAssetAmount::new(0)); + let v = BorrowAssetAmount::new(100).saturating_sub(BorrowAssetAmount::new(0)); + assert_eq!(v, BorrowAssetAmount::new(100)); + let v = BorrowAssetAmount::new(100).saturating_sub(BorrowAssetAmount::new(100)); + assert_eq!(v, BorrowAssetAmount::new(0)); + let v = BorrowAssetAmount::new(100).saturating_sub(BorrowAssetAmount::new(u128::MAX - 33)); + assert_eq!(v, BorrowAssetAmount::new(0)); + } + + #[test] + #[should_panic = "overflow"] + fn overflow_unwrap_add() { + let _ = + BorrowAssetAmount::new(100).unwrap_add(BorrowAssetAmount::new(u128::MAX), "overflow"); + } + + #[test] + #[should_panic = "overflow"] + fn overflow_unwrap_sub() { + let _ = + BorrowAssetAmount::new(100).unwrap_sub(BorrowAssetAmount::new(u128::MAX), "overflow"); + } + + #[test] + #[should_panic = "attempt to add with overflow"] + fn overflow_add() { + let _ = BorrowAssetAmount::new(u128::MAX) + BorrowAssetAmount::new(1); + } + + #[test] + #[should_panic = "attempt to add with overflow"] + fn overflow_add_assign() { + let mut v = BorrowAssetAmount::new(u128::MAX); + v += BorrowAssetAmount::new(1); + } + + #[test] + #[should_panic = "attempt to subtract with overflow"] + fn overflow_sub() { + let _ = BorrowAssetAmount::new(0) - BorrowAssetAmount::new(1); + } + + #[test] + #[should_panic = "attempt to subtract with overflow"] + fn overflow_sub_assign() { + let mut v = BorrowAssetAmount::new(1); + v -= BorrowAssetAmount::new(u128::MAX); + } } diff --git a/contract/market/tests/collateral.rs b/contract/market/tests/collateral.rs index cf22c2dc..ce064e63 100644 --- a/contract/market/tests/collateral.rs +++ b/contract/market/tests/collateral.rs @@ -64,3 +64,18 @@ async fn collateral_withdrawal(#[future(awt)] worker: Worker) { assert_eq!(withdrawn + collateral_deposit, total); } + +#[rstest] +#[tokio::test] +#[should_panic = "attempt to subtract with overflow"] +async fn excessive_collateral_withdrawal(#[future(awt)] worker: Worker) { + setup_test!(worker extract(c) accounts(borrow_user_1, borrow_user_2)); + + c.collateralize(&borrow_user_1, 1_000_000).await; + c.collateralize(&borrow_user_2, 1_000_000).await; + + let balance_before = c.collateral_asset.balance_of(borrow_user_1.id()).await; + eprintln!("Balance before: {balance_before}"); + + c.withdraw_collateral(&borrow_user_1, 1_000_000 + 1).await; +}