Skip to content

Commit

Permalink
Add debug assertions for slashes and reserves (#1188)
Browse files Browse the repository at this point in the history
* add debug assertions for missing slashes

* place debug_assert for unreserves
  • Loading branch information
Chralt98 authored Nov 13, 2023
1 parent 186a8ab commit 9333393
Show file tree
Hide file tree
Showing 6 changed files with 147 additions and 17 deletions.
11 changes: 10 additions & 1 deletion zrml/court/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2218,7 +2218,16 @@ mod pallet {
debug_assert!(missing.is_zero());
overall_imbalance.subsume(imb);
} else {
T::Currency::unreserve_named(&Self::reserve_id(), backer, *bond);
let missing = T::Currency::unreserve_named(&Self::reserve_id(), backer, *bond);
debug_assert!(
missing.is_zero(),
"Could not unreserve all of the amount. reserve_id: {:?}, who: {:?}, \
amount: {:?}, missing: {:?}",
Self::reserve_id(),
backer,
bond,
missing,
);
}
}

Expand Down
24 changes: 22 additions & 2 deletions zrml/orderbook/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -174,20 +174,40 @@ mod pallet {

match order_data.side {
OrderSide::Bid => {
T::AssetManager::unreserve_named(
let missing = T::AssetManager::unreserve_named(
&Self::reserve_id(),
order_data.base_asset,
maker,
order_data.base_asset_amount,
);
debug_assert!(
missing.is_zero(),
"Could not unreserve all of the amount. reserve_id: {:?}, asset: {:?} \
who: {:?}, amount: {:?}, missing: {:?}",
Self::reserve_id(),
order_data.base_asset,
maker,
order_data.base_asset_amount,
missing,
);
}
OrderSide::Ask => {
T::AssetManager::unreserve_named(
let missing = T::AssetManager::unreserve_named(
&Self::reserve_id(),
order_data.outcome_asset,
maker,
order_data.outcome_asset_amount,
);
debug_assert!(
missing.is_zero(),
"Could not unreserve all of the amount. reserve_id: {:?}, asset: {:?} \
who: {:?}, amount: {:?}, missing: {:?}",
Self::reserve_id(),
order_data.outcome_asset,
maker,
order_data.outcome_asset_amount,
missing,
);
}
}

Expand Down
43 changes: 39 additions & 4 deletions zrml/prediction-markets/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,14 @@ mod pallet {
debug_assert!(false, "{}", warning);
return Ok(());
}
T::Currency::unreserve_named(&Self::reserve_id(), &bond.who, bond.value);
let missing = T::Currency::unreserve_named(&Self::reserve_id(), &bond.who, bond.value);
debug_assert!(
missing.is_zero(),
"Could not unreserve all of the amount. reserve_id: {:?}, who: {:?}, value: {:?}.",
&Self::reserve_id(),
&bond.who,
bond.value,
);
<zrml_market_commons::Pallet<T>>::mutate_market(market_id, |m| {
m.bonds.$bond_type = Some(Bond { is_settled: true, ..bond.clone() });
Ok(())
Expand Down Expand Up @@ -182,7 +189,20 @@ mod pallet {
debug_assert!(false, "{}", warning);
}
if unreserve_amount != BalanceOf::<T>::zero() {
T::Currency::unreserve_named(&Self::reserve_id(), &bond.who, unreserve_amount);
let missing = T::Currency::unreserve_named(
&Self::reserve_id(),
&bond.who,
unreserve_amount,
);
debug_assert!(
missing.is_zero(),
"Could not unreserve all of the amount. reserve_id: {:?}, \
who: {:?}, amount: {:?}, missing: {:?}",
Self::reserve_id(),
&bond.who,
unreserve_amount,
missing,
);
}
<zrml_market_commons::Pallet<T>>::mutate_market(market_id, |m| {
m.bonds.$bond_type = Some(Bond { is_settled: true, ..bond.clone() });
Expand Down Expand Up @@ -1063,7 +1083,15 @@ mod pallet {

for (currency_id, payout, balance) in winning_assets {
// Destroy the shares.
T::AssetManager::slash(currency_id, &sender, balance);
let missing = T::AssetManager::slash(currency_id, &sender, balance);
debug_assert!(
missing.is_zero(),
"Could not slash all of the amount. currency_id {:?}, sender: {:?}, balance: \
{:?}.",
currency_id,
&sender,
balance,
);

// Pay out the winner.
let remaining_bal =
Expand Down Expand Up @@ -2591,7 +2619,14 @@ mod pallet {

// write last.
for asset in assets.iter() {
T::AssetManager::slash(*asset, &who, amount);
let missing = T::AssetManager::slash(*asset, &who, amount);
debug_assert!(
missing.is_zero(),
"Could not slash all of the amount. asset {:?}, who: {:?}, amount: {:?}.",
asset,
&who,
amount,
);
}

T::AssetManager::transfer(market.base_asset, &market_account, &who, amount)?;
Expand Down
34 changes: 30 additions & 4 deletions zrml/simple-disputes/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ mod pallet {
};
use frame_system::pallet_prelude::*;
use sp_runtime::{
traits::{CheckedDiv, Saturating},
traits::{CheckedDiv, Saturating, Zero},
DispatchError, SaturatedConversion,
};

Expand Down Expand Up @@ -375,19 +375,36 @@ mod pallet {

for dispute in disputes.iter() {
if &dispute.outcome == resolved_outcome {
T::Currency::unreserve_named(
let missing = T::Currency::unreserve_named(
&Self::reserve_id(),
&dispute.by,
dispute.bond.saturated_into::<u128>().saturated_into(),
);
debug_assert!(
missing.is_zero(),
"Could not unreserve all of the amount. reserve_id: {:?}, who: {:?}, \
amount: {:?}, missing: {:?}",
Self::reserve_id(),
&dispute.by,
dispute.bond.saturated_into::<u128>(),
missing,
);

correct_reporters.push(dispute.by.clone());
} else {
let (imbalance, _) = T::Currency::slash_reserved_named(
let (imbalance, missing) = T::Currency::slash_reserved_named(
&Self::reserve_id(),
&dispute.by,
dispute.bond.saturated_into::<u128>().saturated_into(),
);
debug_assert!(
missing.is_zero(),
"Could not slash all of the amount. reserve_id {:?}, who: {:?}, amount: \
{:?}.",
&Self::reserve_id(),
&dispute.by,
dispute.bond.saturated_into::<u128>(),
);
overall_imbalance.subsume(imbalance);
}
}
Expand Down Expand Up @@ -490,11 +507,20 @@ mod pallet {
if market.status == MarketStatus::Disputed {
disputes_len = Disputes::<T>::decode_len(market_id).unwrap_or(0) as u32;
for dispute in Disputes::<T>::take(market_id).iter() {
T::Currency::unreserve_named(
let missing = T::Currency::unreserve_named(
&Self::reserve_id(),
&dispute.by,
dispute.bond.saturated_into::<u128>().saturated_into(),
);
debug_assert!(
missing.is_zero(),
"Could not unreserve all of the amount. reserve_id: {:?}, who: {:?}, \
amount: {:?}, missing: {:?}",
Self::reserve_id(),
&dispute.by,
dispute.bond.saturated_into::<u128>(),
missing,
);
}
}

Expand Down
10 changes: 8 additions & 2 deletions zrml/styx/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ pub use pallet::*;
pub mod pallet {
use frame_support::{pallet_prelude::*, traits::Currency};
use frame_system::pallet_prelude::*;
use sp_runtime::SaturatedConversion;
use sp_runtime::{traits::Zero, SaturatedConversion};
use zeitgeist_primitives::types::Balance;

use crate::weights::WeightInfoZeitgeist;
Expand Down Expand Up @@ -101,7 +101,13 @@ pub mod pallet {
Err(Error::<T>::FundDoesNotHaveEnoughFreeBalance)?;
}

T::Currency::slash(&who, amount);
let (_imb, missing) = T::Currency::slash(&who, amount);
debug_assert!(
missing.is_zero(),
"Could not slash all of the amount. who: {:?}, amount: {:?}.",
&who,
amount,
);
Crossings::<T>::insert(&who, ());

Self::deposit_event(Event::AccountCrossed(who, amount.saturated_into()));
Expand Down
42 changes: 38 additions & 4 deletions zrml/swaps/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1677,7 +1677,14 @@ mod pallet {
// Check that the account has at least as many free shares as we wish to burn!
T::AssetManager::ensure_can_withdraw(shares_id, from, amount)
.map_err(|_| Error::<T>::InsufficientBalance)?;
T::AssetManager::slash(shares_id, from, amount);
let missing = T::AssetManager::slash(shares_id, from, amount);
debug_assert!(
missing.is_zero(),
"Could not slash all of the amount. shares_id {:?}, who: {:?}, amount: {:?}.",
shares_id,
&from,
amount,
);
Ok(())
}

Expand Down Expand Up @@ -2022,7 +2029,15 @@ mod pallet {
let asset_len = pool.assets.len() as u32;
for asset in pool.assets.into_iter() {
let amount = T::AssetManager::free_balance(asset, &pool_account);
T::AssetManager::slash(asset, &pool_account, amount);
let missing = T::AssetManager::slash(asset, &pool_account, amount);
debug_assert!(
missing.is_zero(),
"Could not slash all of the amount. asset {:?}, pool_account: {:?}, amount: \
{:?}.",
asset,
&pool_account,
amount,
);
}
// NOTE: Currently we don't clean up accounts with pool_share_id.
// TODO(#792): Remove pool_share_id asset for accounts! It may require storage migration.
Expand All @@ -2049,7 +2064,16 @@ mod pallet {

let mut providers_and_pool_shares = vec![];
for provider in <SubsidyProviders<T>>::drain_prefix(pool_id) {
T::AssetManager::unreserve(base_asset, &provider.0, provider.1);
let missing = T::AssetManager::unreserve(base_asset, &provider.0, provider.1);
debug_assert!(
missing.is_zero(),
"Could not unreserve all of the amount. asset: {:?}, who: {:?}, amount: \
{:?}, missing: {:?}",
base_asset,
&provider.0,
provider.1,
missing,
);
total_providers = total_providers.saturating_add(1);
providers_and_pool_shares.push(provider);
}
Expand Down Expand Up @@ -2106,7 +2130,17 @@ mod pallet {
let subsidy = provider.1;

if !account_created {
T::AssetManager::unreserve(base_asset, &provider_address, subsidy);
let missing =
T::AssetManager::unreserve(base_asset, &provider_address, subsidy);
debug_assert!(
missing.is_zero(),
"Could not unreserve all of the amount. asset: {:?}, who: {:?}, \
amount: {:?}, missing: {:?}",
base_asset,
&provider_address,
subsidy,
missing,
);
T::AssetManager::transfer(
base_asset,
&provider_address,
Expand Down

0 comments on commit 9333393

Please sign in to comment.