Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Commit

Permalink
Sr treasury fix (#739)
Browse files Browse the repository at this point in the history
* treasury: use 'mutate' and 'retain' to avoid creating a new vec

* treasury: check the underflow case
  • Loading branch information
Guanqun Lu authored and gavofyork committed Sep 14, 2018
1 parent 3596c7b commit 0741b98
Showing 1 changed file with 25 additions and 24 deletions.
49 changes: 25 additions & 24 deletions srml/treasury/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ decl_storage! {
/// proposal gets these back. A rejected proposal doesn't.
ProposalBond get(proposal_bond): required Permill;

/// Minimum amount of funds that should be placed ina deposit for making a proposal.
/// Minimum amount of funds that should be placed in a deposit for making a proposal.
ProposalBondMinimum get(proposal_bond_minimum): required T::Balance;

/// Period between successive spends.
Expand Down Expand Up @@ -227,34 +227,35 @@ impl<T: Trait> Module<T> {
Self::deposit_event(RawEvent::Spending(budget_remaining));

let mut missed_any = false;
let remaining_approvals: Vec<_> = <Approvals<T>>::get().into_iter().filter(|&index| {
// Should always be true, but shouldn't panic if false or we're screwed.
if let Some(p) = Self::proposals(index) {
if p.value <= budget_remaining {
budget_remaining -= p.value;
<Proposals<T>>::remove(index);

// return their deposit.
let _ = <balances::Module<T>>::unreserve(&p.proposer, p.bond);

// provide the allocation.
<balances::Module<T>>::increase_free_balance_creating(&p.beneficiary, p.value);

Self::deposit_event(RawEvent::Awarded(index, p.value, p.beneficiary));
false
<Approvals<T>>::mutate(|v| {
v.retain(|&index| {
// Should always be true, but shouldn't panic if false or we're screwed.
if let Some(p) = Self::proposals(index) {
if p.value <= budget_remaining {
budget_remaining -= p.value;
<Proposals<T>>::remove(index);

// return their deposit.
let _ = <balances::Module<T>>::unreserve(&p.proposer, p.bond);

// provide the allocation.
<balances::Module<T>>::increase_free_balance_creating(&p.beneficiary, p.value);

Self::deposit_event(RawEvent::Awarded(index, p.value, p.beneficiary));
false
} else {
missed_any = true;
true
}
} else {
missed_any = true;
true
false
}
} else {
false
}
}).collect();
<Approvals<T>>::put(remaining_approvals);
});
});

if !missed_any {
// burn some proportion of the remaining budget if we run a surplus.
let burn = Self::burn().times(budget_remaining);
let burn = Self::burn().times(budget_remaining).min(budget_remaining);
budget_remaining -= burn;
Self::deposit_event(RawEvent::Burnt(burn))
}
Expand Down

0 comments on commit 0741b98

Please sign in to comment.