Skip to content

Commit 3c9f1d1

Browse files
committed
fix set_balance
1 parent 2225c1b commit 3c9f1d1

File tree

3 files changed

+46
-6
lines changed

3 files changed

+46
-6
lines changed

tokens/src/lib.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -1745,17 +1745,22 @@ impl<T: Config> fungibles::Transfer<T::AccountId> for Pallet<T> {
17451745
impl<T: Config> fungibles::Unbalanced<T::AccountId> for Pallet<T> {
17461746
fn set_balance(asset_id: Self::AssetId, who: &T::AccountId, amount: Self::Balance) -> DispatchResult {
17471747
// Balance is the same type and will not overflow
1748-
Self::mutate_account(who, asset_id, |account, _| {
1749-
account.free = amount;
1748+
Self::mutate_account(who, asset_id, |account, _| -> DispatchResult {
1749+
// fungibles::Unbalanced::decrease_balance didn't check account.reserved
1750+
// free = new_balance - reserved
1751+
account.free = amount
1752+
.checked_sub(&account.reserved)
1753+
.ok_or(ArithmeticError::Underflow)?;
17501754

17511755
Self::deposit_event(Event::BalanceSet {
17521756
currency_id: asset_id,
17531757
who: who.clone(),
1754-
free: amount,
1758+
free: account.free,
17551759
reserved: account.reserved,
17561760
});
1757-
});
1758-
Ok(())
1761+
1762+
Ok(())
1763+
})
17591764
}
17601765

17611766
fn set_total_issuance(asset_id: Self::AssetId, amount: Self::Balance) {

tokens/src/tests_events.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ fn pallet_fungibles_unbalanced_deposit_events() {
202202
System::assert_last_event(Event::Tokens(crate::Event::BalanceSet {
203203
currency_id: DOT,
204204
who: ALICE,
205-
free: 500,
205+
free: 450,
206206
reserved: 50,
207207
}));
208208

tokens/src/tests_fungibles.rs

+35
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,23 @@ fn fungibles_unbalanced_trait_should_work() {
8282
Ok(5)
8383
);
8484
assert_eq!(<Tokens as fungibles::Inspect<_>>::balance(DOT, &ALICE), 0);
85+
// set reserved
86+
assert_ok!(<Tokens as fungibles::Unbalanced<_>>::set_balance(DOT, &ALICE, 100));
87+
assert_ok!(<Tokens as MultiReservableCurrency<AccountId>>::reserve(DOT, &ALICE, 50));
88+
assert_noop!(
89+
<Tokens as fungibles::Unbalanced<_>>::decrease_balance(DOT, &ALICE, 60),
90+
ArithmeticError::Underflow
91+
);
92+
assert_eq!(
93+
<Tokens as fungibles::Unbalanced<_>>::decrease_balance(DOT, &ALICE, 50),
94+
Ok(50)
95+
);
96+
assert_eq!(<Tokens as fungibles::Inspect<_>>::balance(DOT, &ALICE), 50);
97+
assert_eq!(
98+
<Tokens as MultiReservableCurrency<AccountId>>::unreserve(DOT, &ALICE, 50),
99+
0
100+
);
101+
assert_eq!(<Tokens as fungibles::Inspect<_>>::balance(DOT, &ALICE), 50);
85102

86103
// decrease_balance_at_most
87104
assert_ok!(<Tokens as fungibles::Unbalanced<_>>::set_balance(DOT, &ALICE, 10));
@@ -102,8 +119,26 @@ fn fungibles_unbalanced_trait_should_work() {
102119
5
103120
);
104121
assert_eq!(<Tokens as fungibles::Inspect<_>>::balance(DOT, &ALICE), 0);
122+
// set reserved
123+
assert_ok!(<Tokens as fungibles::Unbalanced<_>>::set_balance(DOT, &ALICE, 100));
124+
assert_ok!(<Tokens as MultiReservableCurrency<AccountId>>::reserve(DOT, &ALICE, 50));
125+
assert_eq!(
126+
<Tokens as fungibles::Unbalanced<_>>::decrease_balance_at_most(DOT, &ALICE, 60),
127+
0
128+
);
129+
assert_eq!(
130+
<Tokens as fungibles::Unbalanced<_>>::decrease_balance_at_most(DOT, &ALICE, 50),
131+
50
132+
);
133+
assert_eq!(<Tokens as fungibles::Inspect<_>>::balance(DOT, &ALICE), 50);
134+
assert_eq!(
135+
<Tokens as MultiReservableCurrency<AccountId>>::unreserve(DOT, &ALICE, 50),
136+
0
137+
);
138+
assert_eq!(<Tokens as fungibles::Inspect<_>>::balance(DOT, &ALICE), 50);
105139

106140
// increase_balance
141+
assert_ok!(<Tokens as fungibles::Unbalanced<_>>::set_balance(DOT, &ALICE, 0));
107142
assert_noop!(
108143
<Tokens as fungibles::Unbalanced<_>>::increase_balance(DOT, &ALICE, 1),
109144
TokenError::BelowMinimum

0 commit comments

Comments
 (0)