mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-20 14:01:02 +00:00
Add events for balance reserve and unreserve functions (#6330)
* almost works * add clone to BalanceStatus * reserve event * fix staking tests * fix balances tests * Update frame/balances/src/tests.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * restore tests and move event emission * move repatriate reserved event outside of mutate_account * clean up events in tests Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
This commit is contained in:
@@ -230,6 +230,13 @@ decl_event!(
|
||||
BalanceSet(AccountId, Balance, Balance),
|
||||
/// Some amount was deposited (e.g. for transaction fees).
|
||||
Deposit(AccountId, Balance),
|
||||
/// Some balance was reserved (moved from free to reserved).
|
||||
Reserved(AccountId, Balance),
|
||||
/// Some balance was unreserved (moved from reserved to free).
|
||||
Unreserved(AccountId, Balance),
|
||||
/// Some balance was moved from the reserve of the first account to the second account.
|
||||
/// Final argument indicates the destination balance type.
|
||||
ReserveRepatriated(AccountId, AccountId, Balance, Status),
|
||||
}
|
||||
);
|
||||
|
||||
@@ -1150,8 +1157,11 @@ impl<T: Trait<I>, I: Instance> ReservableCurrency<T::AccountId> for Module<T, I>
|
||||
Self::try_mutate_account(who, |account, _| -> DispatchResult {
|
||||
account.free = account.free.checked_sub(&value).ok_or(Error::<T, I>::InsufficientBalance)?;
|
||||
account.reserved = account.reserved.checked_add(&value).ok_or(Error::<T, I>::Overflow)?;
|
||||
Self::ensure_can_withdraw(who, value, WithdrawReason::Reserve.into(), account.free)
|
||||
})
|
||||
Self::ensure_can_withdraw(&who, value.clone(), WithdrawReason::Reserve.into(), account.free)
|
||||
})?;
|
||||
|
||||
Self::deposit_event(RawEvent::Reserved(who.clone(), value));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Unreserve some funds, returning any amount that was unable to be unreserved.
|
||||
@@ -1160,14 +1170,17 @@ impl<T: Trait<I>, I: Instance> ReservableCurrency<T::AccountId> for Module<T, I>
|
||||
fn unreserve(who: &T::AccountId, value: Self::Balance) -> Self::Balance {
|
||||
if value.is_zero() { return Zero::zero() }
|
||||
|
||||
Self::mutate_account(who, |account| {
|
||||
let actual = Self::mutate_account(who, |account| {
|
||||
let actual = cmp::min(account.reserved, value);
|
||||
account.reserved -= actual;
|
||||
// defensive only: this can never fail since total issuance which is at least free+reserved
|
||||
// fits into the same data type.
|
||||
account.free = account.free.saturating_add(actual);
|
||||
value - actual
|
||||
})
|
||||
actual
|
||||
});
|
||||
|
||||
Self::deposit_event(RawEvent::Unreserved(who.clone(), actual.clone()));
|
||||
value - actual
|
||||
}
|
||||
|
||||
/// Slash from reserved balance, returning the negative imbalance created,
|
||||
@@ -1208,7 +1221,7 @@ impl<T: Trait<I>, I: Instance> ReservableCurrency<T::AccountId> for Module<T, I>
|
||||
};
|
||||
}
|
||||
|
||||
Self::try_mutate_account(beneficiary, |to_account, is_new| -> Result<Self::Balance, DispatchError> {
|
||||
let actual = Self::try_mutate_account(beneficiary, |to_account, is_new|-> Result<Self::Balance, DispatchError> {
|
||||
ensure!(!is_new, Error::<T, I>::DeadAccount);
|
||||
Self::try_mutate_account(slashed, |from_account, _| -> Result<Self::Balance, DispatchError> {
|
||||
let actual = cmp::min(from_account.reserved, value);
|
||||
@@ -1217,9 +1230,12 @@ impl<T: Trait<I>, I: Instance> ReservableCurrency<T::AccountId> for Module<T, I>
|
||||
Status::Reserved => to_account.reserved = to_account.reserved.checked_add(&actual).ok_or(Error::<T, I>::Overflow)?,
|
||||
}
|
||||
from_account.reserved -= actual;
|
||||
Ok(value - actual)
|
||||
Ok(actual)
|
||||
})
|
||||
})
|
||||
})?;
|
||||
|
||||
Self::deposit_event(RawEvent::ReserveRepatriated(slashed.clone(), beneficiary.clone(), actual, status));
|
||||
Ok(value - actual)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user