From 580432d8224e17eaa22933cd9fece975e475e5cc Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Tue, 14 May 2019 12:07:32 +0200 Subject: [PATCH] Fix over/under flow risk in OnDilution (#2548) * fix over/under flow risk in OnDilution * bump impl --- substrate/node/runtime/src/lib.rs | 2 +- substrate/srml/treasury/src/lib.rs | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/substrate/node/runtime/src/lib.rs b/substrate/node/runtime/src/lib.rs index 0a3761eb46..a979814014 100644 --- a/substrate/node/runtime/src/lib.rs +++ b/substrate/node/runtime/src/lib.rs @@ -59,7 +59,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, spec_version: 78, - impl_version: 78, + impl_version: 79, apis: RUNTIME_API_VERSIONS, }; diff --git a/substrate/srml/treasury/src/lib.rs b/substrate/srml/treasury/src/lib.rs index c0a43bc8f6..0afb8ba5e0 100644 --- a/substrate/srml/treasury/src/lib.rs +++ b/substrate/srml/treasury/src/lib.rs @@ -64,7 +64,9 @@ use serde::{Serialize, Deserialize}; use rstd::prelude::*; use srml_support::{StorageValue, StorageMap, decl_module, decl_storage, decl_event, ensure}; use srml_support::traits::{Currency, ReservableCurrency, OnDilution, OnUnbalanced, Imbalance}; -use runtime_primitives::{Permill, traits::{Zero, EnsureOrigin, StaticLookup}}; +use runtime_primitives::{Permill, + traits::{Zero, EnsureOrigin, StaticLookup, Saturating, CheckedSub, CheckedMul} +}; use parity_codec::{Encode, Decode}; use system::ensure_signed; @@ -291,8 +293,12 @@ impl OnDilution> for Module { // pre dilution and post-dilution. if !minted.is_zero() && !portion.is_zero() { let total_issuance = T::Currency::total_issuance(); - let funding = (total_issuance - portion) / portion * minted; - >::mutate(|x| *x += funding); + if let Some(funding) = total_issuance.checked_sub(&portion) { + let funding = funding / portion; + if let Some(funding) = funding.checked_mul(&minted) { + >::mutate(|x| *x = x.saturating_add(funding)); + } + } } } }