diff --git a/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 23239e917eabf..8bd317e605a27 100644 Binary files a/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm and b/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm differ diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index 39a18593f1e00..7c68046707274 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -165,7 +165,6 @@ impl balances::Trait for Runtime { } impl fees::Trait for Runtime { - type Amount = u128; type TransferAsset = Balances; type Event = Event; } diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 89f3a58030fa1..3f242dcc5b19c 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -61,7 +61,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, spec_version: 29, - impl_version: 30, + impl_version: 31, apis: RUNTIME_API_VERSIONS, }; @@ -109,7 +109,6 @@ impl balances::Trait for Runtime { impl fees::Trait for Runtime { type Event = Event; - type Amount = Balance; type TransferAsset = Balances; } diff --git a/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index b6ff057716ca4..d320f9a372bff 100644 Binary files a/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm and b/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm differ diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index 554f92e868d62..60fb5f6c00736 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -29,7 +29,7 @@ use rstd::{cmp, result}; use parity_codec::Codec; use parity_codec_derive::{Encode, Decode}; use srml_support::{StorageValue, StorageMap, Parameter, decl_event, decl_storage, decl_module, ensure}; -use srml_support::traits::{UpdateBalanceOutcome, Currency, EnsureAccountLiquid, OnFreeBalanceZero}; +use srml_support::traits::{UpdateBalanceOutcome, Currency, EnsureAccountLiquid, OnFreeBalanceZero, ArithmeticType}; use srml_support::dispatch::Result; use primitives::traits::{Zero, SimpleArithmetic, As, StaticLookup, Member, CheckedAdd, CheckedSub, MaybeSerializeDebug, TransferAsset}; @@ -40,7 +40,7 @@ mod tests; pub trait Trait: system::Trait { /// The balance of an account. - type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + As + As; + type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + As + As + MaybeSerializeDebug; /// A function which is invoked when the free-balance has fallen below the existential deposit and /// has been reduced to zero. @@ -58,6 +58,10 @@ pub trait Trait: system::Trait { type Event: From> + Into<::Event>; } +impl ArithmeticType for Module { + type Type = ::Balance; +} + decl_event!( pub enum Event where ::AccountId, diff --git a/srml/contract/src/tests.rs b/srml/contract/src/tests.rs index 6febc2dec475b..b49cbdcbaf1af 100644 --- a/srml/contract/src/tests.rs +++ b/srml/contract/src/tests.rs @@ -91,7 +91,6 @@ impl consensus::Trait for Test { } impl fees::Trait for Test { type Event = MetaEvent; - type Amount = u64; type TransferAsset = Balances; } impl Trait for Test { diff --git a/srml/council/src/seats.rs b/srml/council/src/seats.rs index 6fd4f1cfec001..27a22bbf47133 100644 --- a/srml/council/src/seats.rs +++ b/srml/council/src/seats.rs @@ -77,11 +77,11 @@ use system::{self, ensure_signed}; // after each vote as all but K entries are cleared. newly registering candidates must use cleared // entries before they increase the capacity. -use srml_support::decl_module; +use srml_support::{decl_module, traits::ArithmeticType}; pub type VoteIndex = u32; -type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +type BalanceOf = <::Currency as ArithmeticType>::Type; pub trait Trait: democracy::Trait { type Event: From> + Into<::Event>; diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index 5045a0ca3d8b3..539aa4227b001 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -24,7 +24,7 @@ use primitives::traits::{Zero, As}; use parity_codec_derive::{Encode, Decode}; use srml_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType}; use srml_support::{decl_module, decl_storage, decl_event, ensure}; -use srml_support::traits::{Currency, OnFreeBalanceZero, EnsureAccountLiquid}; +use srml_support::traits::{Currency, OnFreeBalanceZero, EnsureAccountLiquid, ArithmeticType}; use srml_support::dispatch::Result; use system::ensure_signed; @@ -65,10 +65,10 @@ impl Vote { } } -type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +type BalanceOf = <::Currency as ArithmeticType>::Type; pub trait Trait: system::Trait + Sized { - type Currency: Currency<::AccountId>; + type Currency: ArithmeticType + Currency<::AccountId, Balance=BalanceOf>; type Proposal: Parameter + Dispatchable + IsSubType>; diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index dfc369174fefe..1638bc6e62528 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -324,7 +324,6 @@ mod tests { } impl fees::Trait for Runtime { type Event = MetaEvent; - type Amount = u64; type TransferAsset = balances::Module; } diff --git a/srml/fees/src/lib.rs b/srml/fees/src/lib.rs index a86ea68cdb46e..d6809bac30de4 100644 --- a/srml/fees/src/lib.rs +++ b/srml/fees/src/lib.rs @@ -19,9 +19,9 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -use srml_support::{dispatch::Result, Parameter, StorageMap, decl_event, decl_storage, decl_module}; +use srml_support::{dispatch::Result, traits::ArithmeticType, StorageMap, decl_event, decl_storage, decl_module}; use runtime_primitives::traits::{ - As, Member, SimpleArithmetic, ChargeBytesFee, ChargeFee, + As, ChargeBytesFee, ChargeFee, TransferAsset, CheckedAdd, CheckedSub, CheckedMul, Zero }; use system; @@ -29,15 +29,14 @@ use system; mod mock; mod tests; +type AssetOf = <::TransferAsset as ArithmeticType>::Type; + pub trait Trait: system::Trait { /// The overarching event type. type Event: From> + Into<::Event>; - /// The unit for fee amount - type Amount: Member + Parameter + SimpleArithmetic + Default + Copy + As; - /// A function does the asset transfer between accounts - type TransferAsset: TransferAsset; + type TransferAsset: ArithmeticType + TransferAsset>; } decl_module! { @@ -58,7 +57,7 @@ decl_module! { } decl_event!( - pub enum Event where ::Amount { + pub enum Event where Amount = AssetOf { /// Fee charged (extrinsic_index, fee_amount) Charged(u32, Amount), } @@ -67,22 +66,22 @@ decl_event!( decl_storage! { trait Store for Module as Fees { /// The fee to be paid for making a transaction; the base. - pub TransactionBaseFee get(transaction_base_fee) config(): T::Amount; + pub TransactionBaseFee get(transaction_base_fee) config(): AssetOf; /// The fee to be paid for making a transaction; the per-byte portion. - pub TransactionByteFee get(transaction_byte_fee) config(): T::Amount; + pub TransactionByteFee get(transaction_byte_fee) config(): AssetOf; /// The `extrinsic_index => accumulated_fees` map, containing records to /// track the overall charged fees for each transaction. /// /// All records should be removed at finalise stage. - CurrentTransactionFee get(current_transaction_fee): map u32 => T::Amount; + CurrentTransactionFee get(current_transaction_fee): map u32 => AssetOf; } } impl ChargeBytesFee for Module { fn charge_base_bytes_fee(transactor: &T::AccountId, encoded_len: usize) -> Result { let bytes_fee = Self::transaction_byte_fee().checked_mul( - &>::sa(encoded_len as u64) + & as As>::sa(encoded_len as u64) ).ok_or_else(|| "bytes fee overflow")?; let overall = Self::transaction_base_fee().checked_add(&bytes_fee).ok_or_else(|| "bytes fee overflow")?; Self::charge_fee(transactor, overall) @@ -90,9 +89,9 @@ impl ChargeBytesFee for Module { } impl ChargeFee for Module { - type Amount = T::Amount; + type Amount = AssetOf; - fn charge_fee(transactor: &T::AccountId, amount: T::Amount) -> Result { + fn charge_fee(transactor: &T::AccountId, amount: AssetOf) -> Result { let extrinsic_index = >::extrinsic_index().ok_or_else(|| "no extrinsic index found")?; let current_fee = Self::current_transaction_fee(extrinsic_index); let new_fee = current_fee.checked_add(&amount).ok_or_else(|| "fee got overflow after charge")?; @@ -103,7 +102,7 @@ impl ChargeFee for Module { Ok(()) } - fn refund_fee(transactor: &T::AccountId, amount: T::Amount) -> Result { + fn refund_fee(transactor: &T::AccountId, amount: AssetOf) -> Result { let extrinsic_index = >::extrinsic_index().ok_or_else(|| "no extrinsic index found")?; let current_fee = Self::current_transaction_fee(extrinsic_index); let new_fee = current_fee.checked_sub(&amount).ok_or_else(|| "fee got underflow after refund")?; diff --git a/srml/fees/src/mock.rs b/srml/fees/src/mock.rs index 46058e192182b..dd93335eef064 100644 --- a/srml/fees/src/mock.rs +++ b/srml/fees/src/mock.rs @@ -25,7 +25,7 @@ use runtime_primitives::{ }; use primitives::{H256, Blake2Hasher}; use runtime_io; -use srml_support::{impl_outer_origin, impl_outer_event}; +use srml_support::{impl_outer_origin, impl_outer_event, traits::ArithmeticType}; use crate::{GenesisConfig, Module, Trait, system}; impl_outer_origin!{ @@ -52,6 +52,10 @@ impl TransferAsset for TransferAssetMock { fn add_to(_: &AccountId, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } } +impl ArithmeticType for TransferAssetMock { + type Type = u64; +} + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, PartialEq, Eq, Debug)] pub struct Test; @@ -69,8 +73,7 @@ impl system::Trait for Test { type Log = DigestItem; } impl Trait for Test { - type Amount = u64; - type Event =TestEvent; + type Event = TestEvent; type TransferAsset = TransferAssetMock; } diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index b22190eae364a..34fa4f036c838 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -25,7 +25,7 @@ use parity_codec::HasCompact; use parity_codec_derive::{Encode, Decode}; use srml_support::{Parameter, StorageValue, StorageMap, dispatch::Result}; use srml_support::{decl_module, decl_event, decl_storage, ensure}; -use srml_support::traits::{Currency, OnDilution, EnsureAccountLiquid, OnFreeBalanceZero}; +use srml_support::traits::{Currency, OnDilution, EnsureAccountLiquid, OnFreeBalanceZero, ArithmeticType}; use session::OnSessionChange; use primitives::Perbill; use primitives::traits::{Zero, One, Bounded, As, StaticLookup}; @@ -67,11 +67,11 @@ impl Default for ValidatorPrefs { } } -type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +type BalanceOf = <::Currency as ArithmeticType>::Type; pub trait Trait: system::Trait + session::Trait { /// The staking balance. - type Currency: Currency; + type Currency: ArithmeticType + Currency>; /// Some tokens minted. type OnRewardMinted: OnDilution>; diff --git a/srml/support/procedural/src/storage/transformation.rs b/srml/support/procedural/src/storage/transformation.rs index 736d39cae7bb2..f5eefb7844b5c 100644 --- a/srml/support/procedural/src/storage/transformation.rs +++ b/srml/support/procedural/src/storage/transformation.rs @@ -192,13 +192,10 @@ fn decl_store_extra_genesis( is_trait_needed = true; has_trait_field = true; } - for t in ext::get_non_bound_serde_derive_types(type_infos.value_type, &traitinstance) { - serde_complete_bound.insert(t); - } + + serde_complete_bound.insert(type_infos.value_type); if let DeclStorageTypeInfosKind::Map { key_type, .. } = type_infos.kind { - for t in ext::get_non_bound_serde_derive_types(key_type, &traitinstance) { - serde_complete_bound.insert(t); - } + serde_complete_bound.insert(key_type); } let storage_type = type_infos.typ.clone(); config_field.extend(match type_infos.kind { @@ -285,9 +282,7 @@ fn decl_store_extra_genesis( has_trait_field = true; } - for t in ext::get_non_bound_serde_derive_types(extra_type, &traitinstance).into_iter() { - serde_complete_bound.insert(t); - } + serde_complete_bound.insert(extra_type); let extrafield = &extra_field.content; genesis_extrafields.extend(quote!{ @@ -315,6 +310,7 @@ fn decl_store_extra_genesis( let serde_bug_bound = if !serde_complete_bound.is_empty() { let mut b_ser = String::new(); let mut b_dser = String::new(); + // panic!("{:#?}", serde_complete_bound); serde_complete_bound.into_iter().for_each(|bound| { let stype = quote!(#bound); b_ser.push_str(&format!("{} : {}::serde::Serialize, ", stype, scrate)); diff --git a/srml/support/procedural/tools/src/syn_ext.rs b/srml/support/procedural/tools/src/syn_ext.rs index 0ea403a6520a8..74233b2d0ba64 100644 --- a/srml/support/procedural/tools/src/syn_ext.rs +++ b/srml/support/procedural/tools/src/syn_ext.rs @@ -327,57 +327,3 @@ pub fn has_parametric_type_def(typ: &syn::Type, ident: &Ident, default: bool) -> pub fn has_parametric_type(typ: &syn::Type, ident: &Ident) -> bool { has_parametric_type_def(typ, ident, true) } - -/// Get case where serde does not include bound with serde_derive macros: -/// see https://github.com/serde-rs/serde/issues/1454 -pub fn get_non_bound_serde_derive_types(typ: &syn::Type, t: &syn::Ident) -> Vec { - let mut result = Vec::new(); - get_non_bound_serde_derive_types_inner(typ, t, &mut result); - result -} - -fn get_non_bound_serde_derive_types_inner(typ: &syn::Type, t: &syn::Ident, result: &mut Vec) { - match *typ { - syn::Type::Path(ref path) => { - if heuristic_is_associated_path(&path.path,t) { - result.push(typ.clone()); - } - for p in path.path.segments.iter() { - if let syn::PathArguments::AngleBracketed(ref args) = p.arguments { - for a in args.args.iter() { - if let syn::GenericArgument::Type(ref ty) = a { - get_non_bound_serde_derive_types_inner(ty, t, result) - } - } - } - } - }, - syn::Type::Slice(ref inner) => get_non_bound_serde_derive_types_inner(&inner.elem, t, result), - syn::Type::Array(ref inner) => get_non_bound_serde_derive_types_inner(&inner.elem, t, result), - syn::Type::Ptr(ref inner) => get_non_bound_serde_derive_types_inner(&inner.elem, t, result), - syn::Type::Reference(ref inner) => get_non_bound_serde_derive_types_inner(&inner.elem, t, result), - syn::Type::BareFn(..) => (), - syn::Type::Never(..) => (), - syn::Type::Tuple(ref inner) => for e in inner.elems.iter() { - get_non_bound_serde_derive_types_inner(e, t, result) - }, - syn::Type::TraitObject(..) => (), - syn::Type::ImplTrait(..) => (), - syn::Type::Paren(ref inner) => get_non_bound_serde_derive_types_inner(&inner.elem, t, result), - syn::Type::Group(ref inner) => get_non_bound_serde_derive_types_inner(&inner.elem, t, result), - syn::Type::Infer(..) => (), - syn::Type::Macro(..) => (), - syn::Type::Verbatim(..) => (), - } - -} - -fn heuristic_is_associated_path(path: &syn::Path,t: &syn::Ident) -> bool { - - if let Some(syn::punctuated::Pair::Punctuated(s,_)) = path.segments.first() { - &s.ident == t - } else { - false - } - -} diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index 416ed4e959c41..873f61e9611b7 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -79,10 +79,14 @@ pub enum UpdateBalanceOutcome { AccountKilled, } +pub trait ArithmeticType { + type Type: SimpleArithmetic + As + As + Codec + Copy + MaybeSerializeDebug + Default; +} + /// Abstraction over a fungible assets system. pub trait Currency { /// The balance of an account. - type Balance: SimpleArithmetic + As + As + Codec + Copy + MaybeSerializeDebug + Default; + type Balance; // PUBLIC IMMUTABLES diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs index ad861ac7ece83..4a8913bc4d9bb 100644 --- a/srml/treasury/src/lib.rs +++ b/srml/treasury/src/lib.rs @@ -22,12 +22,12 @@ use serde_derive::{Serialize, Deserialize}; use rstd::prelude::*; use srml_support::{StorageValue, StorageMap, decl_module, decl_storage, decl_event, ensure}; -use srml_support::traits::{Currency, OnDilution}; +use srml_support::traits::{Currency, OnDilution, ArithmeticType}; use runtime_primitives::{Permill, traits::{Zero, EnsureOrigin, StaticLookup}}; use parity_codec_derive::{Encode, Decode}; use system::ensure_signed; -type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +type BalanceOf = <::Currency as ArithmeticType>::Type; /// Our module's configuration trait. All our types and consts go in here. If the /// module is dependent on specific other modules, then their configuration traits @@ -36,7 +36,7 @@ type BalanceOf = <::Currency as Currency<::Ac /// `system::Trait` should always be included in our implied traits. pub trait Trait: system::Trait { /// The staking balance. - type Currency: Currency; + type Currency: ArithmeticType + Currency>; /// Origin from which approvals must come. type ApproveOrigin: EnsureOrigin; @@ -172,7 +172,7 @@ decl_storage! { decl_event!( pub enum Event where - Balance = <::Currency as Currency<::AccountId>>::Balance, + Balance = BalanceOf, ::AccountId { /// New proposal.