diff --git a/substrate/node/runtime/src/lib.rs b/substrate/node/runtime/src/lib.rs
index e7cc09b84f..0c1576e1da 100644
--- a/substrate/node/runtime/src/lib.rs
+++ b/substrate/node/runtime/src/lib.rs
@@ -84,7 +84,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
// and set impl_version to equal spec_version. If only runtime
// implementation changes and behavior does not, then leave spec_version as
// is and increment impl_version.
- spec_version: 164,
+ spec_version: 165,
impl_version: 165,
apis: RUNTIME_API_VERSIONS,
};
diff --git a/substrate/srml/support/procedural/src/storage/transformation.rs b/substrate/srml/support/procedural/src/storage/transformation.rs
index 4fc8f67c42..83f62d97fc 100644
--- a/substrate/srml/support/procedural/src/storage/transformation.rs
+++ b/substrate/srml/support/procedural/src/storage/transformation.rs
@@ -600,15 +600,15 @@ fn create_and_impl_instance(
instance_prefix: &str,
ident: &Ident,
doc: &TokenStream2,
- const_names: &[(Ident, String)],
+ const_names: &[(Ident, String, String)],
scrate: &TokenStream2,
instantiable: &Ident,
cratename: &Ident,
) -> TokenStream2 {
let mut const_impls = TokenStream2::new();
- for (const_name, partial_const_value) in const_names {
- let const_value = format!("{}{}", instance_prefix, partial_const_value);
+ for (const_name, const_value_prefix, const_value_suffix) in const_names {
+ let const_value = format!("{}{}{}", const_value_prefix, instance_prefix, const_value_suffix);
const_impls.extend(quote! {
const #const_name: &'static str = #const_value;
});
@@ -666,15 +666,13 @@ fn decl_storage_items(
let const_name = syn::Ident::new(
&format!("{}{}", impls::PREFIX_FOR, name.to_string()), proc_macro2::Span::call_site()
);
- let partial_const_value = prefix.clone();
- const_names.push((const_name, partial_const_value));
+ const_names.push((const_name, String::new(), prefix.clone()));
if let DeclStorageTypeInfosKind::Map { is_linked: true, .. } = type_infos.kind {
let const_name = syn::Ident::new(
&format!("{}{}", impls::HEAD_KEY_FOR, name.to_string()), proc_macro2::Span::call_site()
);
- let partial_const_value = format!("head of {}", prefix);
- const_names.push((const_name, partial_const_value));
+ const_names.push((const_name, "head of ".into(), prefix));
}
}
@@ -685,7 +683,7 @@ fn decl_storage_items(
// Declare Instance trait
{
let mut const_impls = TokenStream2::new();
- for (const_name, _) in &const_names {
+ for (const_name, ..) in &const_names {
const_impls.extend(quote! {
const #const_name: &'static str;
});
diff --git a/substrate/srml/support/test/tests/final_keys.rs b/substrate/srml/support/test/tests/final_keys.rs
index d53e0aa139..fdd41b04fe 100644
--- a/substrate/srml/support/test/tests/final_keys.rs
+++ b/substrate/srml/support/test/tests/final_keys.rs
@@ -14,87 +14,211 @@
// You should have received a copy of the GNU General Public License
// along with Substrate. If not, see .
-use runtime_io::with_externalities;
-use primitives::Blake2Hasher;
+use runtime_io::with_storage;
use support::storage::unhashed;
-use codec::{Encode, Decode};
+use codec::Encode;
+use support::{StorageDoubleMap, StorageLinkedMap, StorageMap, StorageValue};
-pub trait Trait {
- type Origin;
- type BlockNumber: Encode + Decode + Default + Clone;
-}
+mod no_instance {
+ use codec::{Encode, Decode};
-support::decl_module! {
- pub struct Module for enum Call where origin: T::Origin {}
-}
+ pub trait Trait {
+ type Origin;
+ type BlockNumber: Encode + Decode + Default + Clone;
+ }
-support::decl_storage!{
- trait Store for Module as FinalKeys {
- pub Value config(value): u32;
+ support::decl_module! {
+ pub struct Module for enum Call where origin: T::Origin {}
+ }
- pub Map: map u32 => u32;
- pub Map2: map hasher(twox_128) u32 => u32;
+ support::decl_storage!{
+ trait Store for Module as FinalKeysNone {
+ pub Value config(value): u32;
- pub LinkedMap: linked_map u32 => u32;
- pub LinkedMap2: linked_map hasher(twox_128) u32 => u32;
+ pub Map: map u32 => u32;
+ pub Map2: map hasher(twox_128) u32 => u32;
- pub DoubleMap: double_map u32, blake2_256(u32) => u32;
- pub DoubleMap2: double_map hasher(twox_128) u32, blake2_128(u32) => u32;
+ pub LinkedMap: linked_map u32 => u32;
+ pub LinkedMap2: linked_map hasher(twox_128) u32 => u32;
- pub Foo get(foo) config(): Option;
- pub Foo2 get(foo2) config(): double_map u32, blake2_256(T::BlockNumber) => Option;
+ pub DoubleMap: double_map u32, blake2_256(u32) => u32;
+ pub DoubleMap2: double_map hasher(twox_128) u32, blake2_128(u32) => u32;
+
+ pub TestGenericValue get(test_generic_value) config(): Option;
+ pub TestGenericDoubleMap get(foo2) config(test_generic_double_map):
+ double_map u32, blake2_256(T::BlockNumber) => Option;
+ }
}
}
-struct Test;
-impl Trait for Test {
- type BlockNumber = u32;
- type Origin = u32;
-}
+mod instance {
+ pub trait Trait: super::no_instance::Trait {}
-fn new_test_ext() -> runtime_io::TestExternalities {
- GenesisConfig::::default().build_storage().unwrap().into()
+ support::decl_module! {
+ pub struct Module, I: Instantiable = DefaultInstance>
+ for enum Call where origin: T::Origin {}
+ }
+
+ support::decl_storage!{
+ trait Store for Module, I: Instantiable = DefaultInstance>
+ as FinalKeysSome
+ {
+ pub Value config(value): u32;
+
+ pub Map: map u32 => u32;
+ pub Map2: map hasher(twox_128) u32 => u32;
+
+ pub LinkedMap: linked_map u32 => u32;
+ pub LinkedMap2: linked_map hasher(twox_128) u32 => u32;
+
+ pub DoubleMap: double_map u32, blake2_256(u32) => u32;
+ pub DoubleMap2: double_map hasher(twox_128) u32, blake2_128(u32) => u32;
+
+ pub TestGenericValue get(test_generic_value) config(): Option;
+ pub TestGenericDoubleMap get(foo2) config(test_generic_double_map):
+ double_map u32, blake2_256(T::BlockNumber) => Option;
+ }
+ add_extra_genesis {
+ // See `decl_storage` limitation.
+ config(phantom): core::marker::PhantomData;
+ }
+ }
}
#[test]
-fn final_keys() {
- with_externalities(&mut new_test_ext(), || {
- Value::put(1);
- assert_eq!(unhashed::get::(&runtime_io::twox_128(b"FinalKeys Value")), Some(1u32));
+fn final_keys_no_instance() {
+ with_storage(&mut Default::default(), || {
+ no_instance::Value::put(1);
+ assert_eq!(unhashed::get::(&runtime_io::twox_128(b"FinalKeysNone Value")), Some(1u32));
- Map::insert(1, 2);
- let mut k = b"FinalKeys Map".to_vec();
+ no_instance::Map::insert(1, 2);
+ let mut k = b"FinalKeysNone Map".to_vec();
k.extend(1u32.encode());
assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32));
- Map2::insert(1, 2);
- let mut k = b"FinalKeys Map2".to_vec();
+ no_instance::Map2::insert(1, 2);
+ let mut k = b"FinalKeysNone Map2".to_vec();
k.extend(1u32.encode());
assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32));
- let head = b"head of FinalKeys LinkedMap".to_vec();
+ let head = b"head of FinalKeysNone LinkedMap".to_vec();
assert_eq!(unhashed::get::(&runtime_io::blake2_256(&head)), None);
- LinkedMap::insert(1, 2);
- let mut k = b"FinalKeys LinkedMap".to_vec();
+ no_instance::LinkedMap::insert(1, 2);
+ let mut k = b"FinalKeysNone LinkedMap".to_vec();
k.extend(1u32.encode());
assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32));
assert_eq!(unhashed::get::(&runtime_io::blake2_256(&head)), Some(1u32));
- LinkedMap2::insert(1, 2);
- let mut k = b"FinalKeys LinkedMap2".to_vec();
+ no_instance::LinkedMap2::insert(1, 2);
+ let mut k = b"FinalKeysNone LinkedMap2".to_vec();
k.extend(1u32.encode());
assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32));
- DoubleMap::insert(&1, &2, &3);
- let mut k = b"FinalKeys DoubleMap".to_vec();
+ no_instance::DoubleMap::insert(&1, &2, &3);
+ let mut k = b"FinalKeysNone DoubleMap".to_vec();
k.extend(1u32.encode());
let mut k = runtime_io::blake2_256(&k).to_vec();
k.extend(&runtime_io::blake2_256(&2u32.encode()));
assert_eq!(unhashed::get::(&k), Some(3u32));
- DoubleMap2::insert(&1, &2, &3);
- let mut k = b"FinalKeys DoubleMap2".to_vec();
+ no_instance::DoubleMap2::insert(&1, &2, &3);
+ let mut k = b"FinalKeysNone DoubleMap2".to_vec();
+ k.extend(1u32.encode());
+ let mut k = runtime_io::twox_128(&k).to_vec();
+ k.extend(&runtime_io::blake2_128(&2u32.encode()));
+ assert_eq!(unhashed::get::(&k), Some(3u32));
+ });
+}
+
+#[test]
+fn final_keys_default_instance() {
+ with_storage(&mut Default::default(), || {
+ >::put(1);
+ assert_eq!(unhashed::get::(&runtime_io::twox_128(b"FinalKeysSome Value")), Some(1u32));
+
+ >::insert(1, 2);
+ let mut k = b"FinalKeysSome Map".to_vec();
+ k.extend(1u32.encode());
+ assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32));
+
+ >::insert(1, 2);
+ let mut k = b"FinalKeysSome Map2".to_vec();
+ k.extend(1u32.encode());
+ assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32));
+
+ let head = b"head of FinalKeysSome LinkedMap".to_vec();
+ assert_eq!(unhashed::get::(&runtime_io::blake2_256(&head)), None);
+
+ >::insert(1, 2);
+ let mut k = b"FinalKeysSome LinkedMap".to_vec();
+ k.extend(1u32.encode());
+ assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32));
+ assert_eq!(unhashed::get::(&runtime_io::blake2_256(&head)), Some(1u32));
+
+< instance::LinkedMap2>::insert(1, 2);
+ let mut k = b"FinalKeysSome LinkedMap2".to_vec();
+ k.extend(1u32.encode());
+ assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32));
+
+ >::insert(&1, &2, &3);
+ let mut k = b"FinalKeysSome DoubleMap".to_vec();
+ k.extend(1u32.encode());
+ let mut k = runtime_io::blake2_256(&k).to_vec();
+ k.extend(&runtime_io::blake2_256(&2u32.encode()));
+ assert_eq!(unhashed::get::(&k), Some(3u32));
+
+ >::insert(&1, &2, &3);
+ let mut k = b"FinalKeysSome DoubleMap2".to_vec();
+ k.extend(1u32.encode());
+ let mut k = runtime_io::twox_128(&k).to_vec();
+ k.extend(&runtime_io::blake2_128(&2u32.encode()));
+ assert_eq!(unhashed::get::(&k), Some(3u32));
+ });
+}
+
+#[test]
+fn final_keys_instance_2() {
+ with_storage(&mut Default::default(), || {
+ >::put(1);
+ assert_eq!(
+ unhashed::get::(&runtime_io::twox_128(b"Instance2FinalKeysSome Value")),
+ Some(1u32)
+ );
+
+ >::insert(1, 2);
+ let mut k = b"Instance2FinalKeysSome Map".to_vec();
+ k.extend(1u32.encode());
+ assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32));
+
+ >::insert(1, 2);
+ let mut k = b"Instance2FinalKeysSome Map2".to_vec();
+ k.extend(1u32.encode());
+ assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32));
+
+ let head = b"head of Instance2FinalKeysSome LinkedMap".to_vec();
+ assert_eq!(unhashed::get::(&runtime_io::blake2_256(&head)), None);
+
+ >::insert(1, 2);
+ let mut k = b"Instance2FinalKeysSome LinkedMap".to_vec();
+ k.extend(1u32.encode());
+ assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32));
+ assert_eq!(unhashed::get::(&runtime_io::blake2_256(&head)), Some(1u32));
+
+ >::insert(1, 2);
+ let mut k = b"Instance2FinalKeysSome LinkedMap2".to_vec();
+ k.extend(1u32.encode());
+ assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32));
+
+ >::insert(&1, &2, &3);
+ let mut k = b"Instance2FinalKeysSome DoubleMap".to_vec();
+ k.extend(1u32.encode());
+ let mut k = runtime_io::blake2_256(&k).to_vec();
+ k.extend(&runtime_io::blake2_256(&2u32.encode()));
+ assert_eq!(unhashed::get::(&k), Some(3u32));
+
+ >::insert(&1, &2, &3);
+ let mut k = b"Instance2FinalKeysSome DoubleMap2".to_vec();
k.extend(1u32.encode());
let mut k = runtime_io::twox_128(&k).to_vec();
k.extend(&runtime_io::blake2_128(&2u32.encode()));