diff --git a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 23239e917eabf85bb24340d0747d52bad15d2723..8bd317e605a271cded36c515e80948ed531a7eda 100644 Binary files a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm and b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm differ diff --git a/substrate/node-template/runtime/src/lib.rs b/substrate/node-template/runtime/src/lib.rs index 39a18593f1e00bd5993d43e66267ab7318686071..7c6804670727469ecb1b814ba476bbdc8cf92625 100644 --- a/substrate/node-template/runtime/src/lib.rs +++ b/substrate/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/substrate/node/runtime/src/lib.rs b/substrate/node/runtime/src/lib.rs index 89f3a58030fa12bf66c12ed0bc76fb158fb0bef7..3f242dcc5b19c7b6e1a09dcaf301ff982ab990ad 100644 --- a/substrate/node/runtime/src/lib.rs +++ b/substrate/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/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index b6ff057716ca4196181b2e7c1a221188c6837854..d320f9a372bff82472003f1075be115b1e34a9e5 100644 Binary files a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm and b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm differ diff --git a/substrate/srml/balances/src/lib.rs b/substrate/srml/balances/src/lib.rs index 554f92e868d62c8bf5a17aa452dfbae712a92078..60fb5f6c0073626b4feb6486070dad1e0becb4ce 100644 --- a/substrate/srml/balances/src/lib.rs +++ b/substrate/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<usize> + As<u64>; + type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + As<usize> + As<u64> + 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<Event<Self>> + Into<<Self as system::Trait>::Event>; } +impl<T: Trait> ArithmeticType for Module<T> { + type Type = <T as Trait>::Balance; +} + decl_event!( pub enum Event<T> where <T as system::Trait>::AccountId, diff --git a/substrate/srml/contract/src/tests.rs b/substrate/srml/contract/src/tests.rs index 6febc2dec475bbca18ad21dc483ba980904307ab..b49cbdcbaf1af855c24c218176d6f2fa94d57ec9 100644 --- a/substrate/srml/contract/src/tests.rs +++ b/substrate/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/substrate/srml/council/src/seats.rs b/substrate/srml/council/src/seats.rs index 6fd4f1cfec001dccc2e1b6675f6d99ae147f9646..27a22bbf471339a3a59ebfe198fae992e7c19f7f 100644 --- a/substrate/srml/council/src/seats.rs +++ b/substrate/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<T> = <<T as democracy::Trait>::Currency as Currency<<T as system::Trait>::AccountId>>::Balance; +type BalanceOf<T> = <<T as democracy::Trait>::Currency as ArithmeticType>::Type; pub trait Trait: democracy::Trait { type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>; diff --git a/substrate/srml/democracy/src/lib.rs b/substrate/srml/democracy/src/lib.rs index 5045a0ca3d8b3df768daaec838896867077061c2..539aa4227b0014ba27e94cb325051792dcb7540a 100644 --- a/substrate/srml/democracy/src/lib.rs +++ b/substrate/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<T> = <<T as Trait>::Currency as Currency<<T as system::Trait>::AccountId>>::Balance; +type BalanceOf<T> = <<T as Trait>::Currency as ArithmeticType>::Type; pub trait Trait: system::Trait + Sized { - type Currency: Currency<<Self as system::Trait>::AccountId>; + type Currency: ArithmeticType + Currency<<Self as system::Trait>::AccountId, Balance=BalanceOf<Self>>; type Proposal: Parameter + Dispatchable<Origin=Self::Origin> + IsSubType<Module<Self>>; diff --git a/substrate/srml/executive/src/lib.rs b/substrate/srml/executive/src/lib.rs index dfc369174fefef86c2e538eec75e0c0f589abb62..1638bc6e62528c6db27efce3c3840360a070f2f0 100644 --- a/substrate/srml/executive/src/lib.rs +++ b/substrate/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<Runtime>; } diff --git a/substrate/srml/fees/src/lib.rs b/substrate/srml/fees/src/lib.rs index a86ea68cdb46e642e2b82fae83a4461eee112741..d6809bac30de4b36ec9618ed465a44afb6360bec 100644 --- a/substrate/srml/fees/src/lib.rs +++ b/substrate/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<T> = <<T as Trait>::TransferAsset as ArithmeticType>::Type; + pub trait Trait: system::Trait { /// The overarching event type. type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>; - /// The unit for fee amount - type Amount: Member + Parameter + SimpleArithmetic + Default + Copy + As<u64>; - /// A function does the asset transfer between accounts - type TransferAsset: TransferAsset<Self::AccountId, Amount = Self::Amount>; + type TransferAsset: ArithmeticType + TransferAsset<Self::AccountId, Amount=AssetOf<Self>>; } decl_module! { @@ -58,7 +57,7 @@ decl_module! { } decl_event!( - pub enum Event<T> where <T as Trait>::Amount { + pub enum Event<T> where Amount = AssetOf<T> { /// Fee charged (extrinsic_index, fee_amount) Charged(u32, Amount), } @@ -67,22 +66,22 @@ decl_event!( decl_storage! { trait Store for Module<T: Trait> 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<T>; /// 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<T>; /// 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<T>; } } impl<T: Trait> ChargeBytesFee<T::AccountId> for Module<T> { fn charge_base_bytes_fee(transactor: &T::AccountId, encoded_len: usize) -> Result { let bytes_fee = Self::transaction_byte_fee().checked_mul( - &<T::Amount as As<u64>>::sa(encoded_len as u64) + &<AssetOf<T> as As<u64>>::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<T: Trait> ChargeBytesFee<T::AccountId> for Module<T> { } impl<T: Trait> ChargeFee<T::AccountId> for Module<T> { - type Amount = T::Amount; + type Amount = AssetOf<T>; - fn charge_fee(transactor: &T::AccountId, amount: T::Amount) -> Result { + fn charge_fee(transactor: &T::AccountId, amount: AssetOf<T>) -> Result { let extrinsic_index = <system::Module<T>>::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<T: Trait> ChargeFee<T::AccountId> for Module<T> { Ok(()) } - fn refund_fee(transactor: &T::AccountId, amount: T::Amount) -> Result { + fn refund_fee(transactor: &T::AccountId, amount: AssetOf<T>) -> Result { let extrinsic_index = <system::Module<T>>::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/substrate/srml/fees/src/mock.rs b/substrate/srml/fees/src/mock.rs index 46058e192182be5b737f2a2edb84918dbab6c068..dd93335eef064878e65874a3532dce06fa10006d 100644 --- a/substrate/srml/fees/src/mock.rs +++ b/substrate/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<AccountId> TransferAsset<AccountId> 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/substrate/srml/staking/src/lib.rs b/substrate/srml/staking/src/lib.rs index b22190eae364addd7102379cc24373002aa0b3f6..34fa4f036c83808ee0ae1bfc81fb41b7629d6d54 100644 --- a/substrate/srml/staking/src/lib.rs +++ b/substrate/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<B: Default + HasCompact + Copy> Default for ValidatorPrefs<B> { } } -type BalanceOf<T> = <<T as Trait>::Currency as Currency<<T as system::Trait>::AccountId>>::Balance; +type BalanceOf<T> = <<T as Trait>::Currency as ArithmeticType>::Type; pub trait Trait: system::Trait + session::Trait { /// The staking balance. - type Currency: Currency<Self::AccountId>; + type Currency: ArithmeticType + Currency<Self::AccountId, Balance=BalanceOf<Self>>; /// Some tokens minted. type OnRewardMinted: OnDilution<BalanceOf<Self>>; diff --git a/substrate/srml/support/procedural/src/storage/transformation.rs b/substrate/srml/support/procedural/src/storage/transformation.rs index 736d39cae7bb21dfb0e99cad25f7db26c7ddaa14..f5eefb7844b5c97f6aedf680b05b411154a44d38 100644 --- a/substrate/srml/support/procedural/src/storage/transformation.rs +++ b/substrate/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/substrate/srml/support/procedural/tools/src/syn_ext.rs b/substrate/srml/support/procedural/tools/src/syn_ext.rs index 0ea403a6520a819955b0e2ebd3188b488e756445..74233b2d0ba64253988d97f64b7d7f13dd48f5e7 100644 --- a/substrate/srml/support/procedural/tools/src/syn_ext.rs +++ b/substrate/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<syn::Type> { - 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<syn::Type>) { - 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/substrate/srml/support/src/traits.rs b/substrate/srml/support/src/traits.rs index 416ed4e959c416e86eebd6b95ca36674460e56fc..873f61e9611b715b4ce507e2abd18efe108a3430 100644 --- a/substrate/srml/support/src/traits.rs +++ b/substrate/srml/support/src/traits.rs @@ -79,10 +79,14 @@ pub enum UpdateBalanceOutcome { AccountKilled, } +pub trait ArithmeticType { + type Type: SimpleArithmetic + As<usize> + As<u64> + Codec + Copy + MaybeSerializeDebug + Default; +} + /// Abstraction over a fungible assets system. pub trait Currency<AccountId> { /// The balance of an account. - type Balance: SimpleArithmetic + As<usize> + As<u64> + Codec + Copy + MaybeSerializeDebug + Default; + type Balance; // PUBLIC IMMUTABLES diff --git a/substrate/srml/treasury/src/lib.rs b/substrate/srml/treasury/src/lib.rs index ad861ac7ece83f6bdc009f7a6522dd43425d710e..4a8913bc4d9bb7b77897721e8c6aa5deb1b6a95f 100644 --- a/substrate/srml/treasury/src/lib.rs +++ b/substrate/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<T> = <<T as Trait>::Currency as Currency<<T as system::Trait>::AccountId>>::Balance; +type BalanceOf<T> = <<T as Trait>::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<T> = <<T as Trait>::Currency as Currency<<T as system::Trait>::Ac /// `system::Trait` should always be included in our implied traits. pub trait Trait: system::Trait { /// The staking balance. - type Currency: Currency<Self::AccountId>; + type Currency: ArithmeticType + Currency<Self::AccountId, Balance=BalanceOf<Self>>; /// Origin from which approvals must come. type ApproveOrigin: EnsureOrigin<Self::Origin>; @@ -172,7 +172,7 @@ decl_storage! { decl_event!( pub enum Event<T> where - Balance = <<T as Trait>::Currency as Currency<<T as system::Trait>::AccountId>>::Balance, + Balance = BalanceOf<T>, <T as system::Trait>::AccountId { /// New proposal.