mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 19:17:58 +00:00
CountedNMap implementation (#10621)
* add initial CountedDoubleMap implementation * extend CountedDoubleMap functionality * add some traits implementation for CountedStorageDoubleMap * add basic tests for CountedStorageDoubleMap * add mutate functions implementation * add additional tests * add test_option_query test * add try_append_decode_len_works, append_decode_len_works tests * add migrate_keys_works, translate_values tests * add test_iter_drain_translate test * add test_metadata test * add remove_prefix implementation, add test_iter_drain_prefix test * update * refactor PrefixIterator usage * Fix CI build * fix storage_ensure_span_are_ok_wrong_gen.rs storage_ensure_span_are_ok_wrong_gen_unnamed.rs * add counted_nmap implementation * add tests, fixes * remove counted double map impl * fix metadata checks * update clear func * fix clear, clear with prefix * fix set function * update * final fix * Update frame/support/src/storage/types/counted_nmap.rs Co-authored-by: Anton <anton.kalyaev@gmail.com> * Update frame/support/src/storage/types/counted_nmap.rs Co-authored-by: Anton <anton.kalyaev@gmail.com> * Update frame/support/src/storage/types/counted_nmap.rs Co-authored-by: Anton <anton.kalyaev@gmail.com> * fix comments * fix suggestion * cargo update * Relocate impl of Sealed for Ref to module root * fix StorageEntryMetadata type * Update frame/support/src/storage/types/nmap.rs Co-authored-by: Guillaume Yu Thiolliere <gui.thiolliere@gmail.com> * removed StorageNMap and StoragePrefixedMap traits impl * fix tests * Update frame/support/src/storage/types/counted_nmap.rs Co-authored-by: Guillaume Yu Thiolliere <gui.thiolliere@gmail.com> * extend pallet::storage macro with CountedStorageNMap usage * fix * add tests * fix * fix * Add counter_storage_final_key(), map_storage_final_prefix() functions * update tests * fix * fix * fix * update tests * fix fmt * fix fmt --------- Co-authored-by: Anton <anton.kalyaev@gmail.com> Co-authored-by: Keith Yeung <kungfukeith11@gmail.com> Co-authored-by: Guillaume Yu Thiolliere <gui.thiolliere@gmail.com> Co-authored-by: parity-processbot <>
This commit is contained in:
@@ -368,6 +368,27 @@ pub mod pallet {
|
||||
ResultQuery<Error<T>::NonExistentStorageValue>,
|
||||
>;
|
||||
|
||||
#[pallet::storage]
|
||||
#[pallet::getter(fn counted_nmap)]
|
||||
pub type CountedNMap<T> = CountedStorageNMap<_, storage::Key<Blake2_128Concat, u8>, u32>;
|
||||
|
||||
#[pallet::storage]
|
||||
#[pallet::getter(fn counted_nmap2)]
|
||||
pub type CountedNMap2<T> = CountedStorageNMap<
|
||||
Key = (NMapKey<Twox64Concat, u16>, NMapKey<Blake2_128Concat, u32>),
|
||||
Value = u64,
|
||||
MaxValues = ConstU32<11>,
|
||||
>;
|
||||
|
||||
#[pallet::storage]
|
||||
#[pallet::getter(fn counted_nmap3)]
|
||||
pub type CountedNMap3<T> = CountedStorageNMap<
|
||||
_,
|
||||
(NMapKey<Blake2_128Concat, u8>, NMapKey<Twox64Concat, u16>),
|
||||
u128,
|
||||
ResultQuery<Error<T>::NonExistentStorageValue>,
|
||||
>;
|
||||
|
||||
#[pallet::storage]
|
||||
#[pallet::getter(fn conditional_value)]
|
||||
#[cfg(feature = "frame-feature-testing")]
|
||||
@@ -391,6 +412,15 @@ pub mod pallet {
|
||||
pub type ConditionalNMap<T> =
|
||||
StorageNMap<_, (storage::Key<Blake2_128Concat, u8>, storage::Key<Twox64Concat, u16>), u32>;
|
||||
|
||||
#[cfg(feature = "frame-feature-testing")]
|
||||
#[pallet::storage]
|
||||
#[pallet::getter(fn conditional_counted_nmap)]
|
||||
pub type ConditionalCountedNMap<T> = CountedStorageNMap<
|
||||
_,
|
||||
(storage::Key<Blake2_128Concat, u8>, storage::Key<Twox64Concat, u16>),
|
||||
u32,
|
||||
>;
|
||||
|
||||
#[pallet::storage]
|
||||
#[pallet::storage_prefix = "RenamedCountedMap"]
|
||||
#[pallet::getter(fn counted_storage_map)]
|
||||
@@ -1125,6 +1155,7 @@ fn storage_expand() {
|
||||
k.extend(2u32.using_encoded(blake2_128_concat));
|
||||
assert_eq!(unhashed::get::<u64>(&k), Some(3u64));
|
||||
assert_eq!(&k[..32], &<pallet::NMap2<Runtime>>::final_prefix());
|
||||
assert_eq!(pallet::Pallet::<Runtime>::nmap2((1, 2)), Some(3u64));
|
||||
|
||||
pallet::NMap3::<Runtime>::insert((&1, &2), &3);
|
||||
let mut k = [twox_128(b"Example"), twox_128(b"NMap3")].concat();
|
||||
@@ -1132,11 +1163,56 @@ fn storage_expand() {
|
||||
k.extend(2u16.using_encoded(twox_64_concat));
|
||||
assert_eq!(unhashed::get::<u128>(&k), Some(3u128));
|
||||
assert_eq!(&k[..32], &<pallet::NMap3<Runtime>>::final_prefix());
|
||||
assert_eq!(pallet::Pallet::<Runtime>::nmap3((1, 2)), Ok(3u128));
|
||||
assert_eq!(
|
||||
pallet::NMap3::<Runtime>::get((2, 3)),
|
||||
Err(pallet::Error::<Runtime>::NonExistentStorageValue),
|
||||
);
|
||||
|
||||
pallet::CountedNMap::<Runtime>::insert((&1,), &3);
|
||||
let mut k = [twox_128(b"Example"), twox_128(b"CountedNMap")].concat();
|
||||
k.extend(1u8.using_encoded(blake2_128_concat));
|
||||
assert_eq!(unhashed::get::<u32>(&k), Some(3u32));
|
||||
assert_eq!(pallet::CountedNMap::<Runtime>::count(), 1);
|
||||
assert_eq!(
|
||||
unhashed::get::<u32>(
|
||||
&[twox_128(b"Example"), twox_128(b"CounterForCountedNMap")].concat()
|
||||
),
|
||||
Some(1u32)
|
||||
);
|
||||
|
||||
pallet::CountedNMap2::<Runtime>::insert((&1, &2), &3);
|
||||
let mut k = [twox_128(b"Example"), twox_128(b"CountedNMap2")].concat();
|
||||
k.extend(1u16.using_encoded(twox_64_concat));
|
||||
k.extend(2u32.using_encoded(blake2_128_concat));
|
||||
assert_eq!(unhashed::get::<u64>(&k), Some(3u64));
|
||||
assert_eq!(pallet::CountedNMap2::<Runtime>::count(), 1);
|
||||
assert_eq!(
|
||||
unhashed::get::<u32>(
|
||||
&[twox_128(b"Example"), twox_128(b"CounterForCountedNMap2")].concat()
|
||||
),
|
||||
Some(1u32)
|
||||
);
|
||||
assert_eq!(pallet::Pallet::<Runtime>::counted_nmap2((1, 2)), Some(3u64));
|
||||
|
||||
pallet::CountedNMap3::<Runtime>::insert((&1, &2), &3);
|
||||
let mut k = [twox_128(b"Example"), twox_128(b"CountedNMap3")].concat();
|
||||
k.extend(1u8.using_encoded(blake2_128_concat));
|
||||
k.extend(2u16.using_encoded(twox_64_concat));
|
||||
assert_eq!(pallet::CountedNMap3::<Runtime>::count(), 1);
|
||||
assert_eq!(unhashed::get::<u128>(&k), Some(3u128));
|
||||
assert_eq!(pallet::Pallet::<Runtime>::counted_nmap3((1, 2)), Ok(3u128));
|
||||
assert_eq!(
|
||||
pallet::CountedNMap3::<Runtime>::get((2, 3)),
|
||||
Err(pallet::Error::<Runtime>::NonExistentStorageValue),
|
||||
);
|
||||
assert_eq!(
|
||||
unhashed::get::<u32>(
|
||||
&[twox_128(b"Example"), twox_128(b"CounterForCountedNMap3")].concat()
|
||||
),
|
||||
Some(1u32)
|
||||
);
|
||||
|
||||
#[cfg(feature = "frame-feature-testing")]
|
||||
{
|
||||
pallet::ConditionalValue::<Runtime>::put(1);
|
||||
@@ -1457,6 +1533,66 @@ fn metadata() {
|
||||
default: vec![1, 1],
|
||||
docs: vec![],
|
||||
},
|
||||
StorageEntryMetadata {
|
||||
name: "CountedNMap",
|
||||
modifier: StorageEntryModifier::Optional,
|
||||
ty: StorageEntryType::Map {
|
||||
key: meta_type::<u8>(),
|
||||
hashers: vec![StorageHasher::Blake2_128Concat],
|
||||
value: meta_type::<u32>(),
|
||||
},
|
||||
default: vec![0],
|
||||
docs: vec![],
|
||||
},
|
||||
StorageEntryMetadata {
|
||||
name: "CounterForCountedNMap",
|
||||
modifier: StorageEntryModifier::Default,
|
||||
ty: StorageEntryType::Plain(meta_type::<u32>()),
|
||||
default: vec![0, 0, 0, 0],
|
||||
docs: maybe_docs(vec!["Counter for the related counted storage map"]),
|
||||
},
|
||||
StorageEntryMetadata {
|
||||
name: "CountedNMap2",
|
||||
modifier: StorageEntryModifier::Optional,
|
||||
ty: StorageEntryType::Map {
|
||||
key: meta_type::<(u16, u32)>(),
|
||||
hashers: vec![
|
||||
StorageHasher::Twox64Concat,
|
||||
StorageHasher::Blake2_128Concat,
|
||||
],
|
||||
value: meta_type::<u64>(),
|
||||
},
|
||||
default: vec![0],
|
||||
docs: vec![],
|
||||
},
|
||||
StorageEntryMetadata {
|
||||
name: "CounterForCountedNMap2",
|
||||
modifier: StorageEntryModifier::Default,
|
||||
ty: StorageEntryType::Plain(meta_type::<u32>()),
|
||||
default: vec![0, 0, 0, 0],
|
||||
docs: maybe_docs(vec!["Counter for the related counted storage map"]),
|
||||
},
|
||||
StorageEntryMetadata {
|
||||
name: "CountedNMap3",
|
||||
modifier: StorageEntryModifier::Optional,
|
||||
ty: StorageEntryType::Map {
|
||||
key: meta_type::<(u8, u16)>(),
|
||||
hashers: vec![
|
||||
StorageHasher::Blake2_128Concat,
|
||||
StorageHasher::Twox64Concat,
|
||||
],
|
||||
value: meta_type::<u128>(),
|
||||
},
|
||||
default: vec![1, 1],
|
||||
docs: vec![],
|
||||
},
|
||||
StorageEntryMetadata {
|
||||
name: "CounterForCountedNMap3",
|
||||
modifier: StorageEntryModifier::Default,
|
||||
ty: StorageEntryType::Plain(meta_type::<u32>()),
|
||||
default: vec![0, 0, 0, 0],
|
||||
docs: maybe_docs(vec!["Counter for the related counted storage map"]),
|
||||
},
|
||||
#[cfg(feature = "frame-feature-testing")]
|
||||
StorageEntryMetadata {
|
||||
name: "ConditionalValue",
|
||||
@@ -1507,6 +1643,29 @@ fn metadata() {
|
||||
default: vec![0],
|
||||
docs: vec![],
|
||||
},
|
||||
#[cfg(feature = "frame-feature-testing")]
|
||||
StorageEntryMetadata {
|
||||
name: "ConditionalCountedNMap",
|
||||
modifier: StorageEntryModifier::Optional,
|
||||
ty: StorageEntryType::Map {
|
||||
key: meta_type::<(u8, u16)>(),
|
||||
hashers: vec![
|
||||
StorageHasher::Blake2_128Concat,
|
||||
StorageHasher::Twox64Concat,
|
||||
],
|
||||
value: meta_type::<u32>(),
|
||||
},
|
||||
default: vec![0],
|
||||
docs: vec![],
|
||||
},
|
||||
#[cfg(feature = "frame-feature-testing")]
|
||||
StorageEntryMetadata {
|
||||
name: "CounterForConditionalCountedNMap",
|
||||
modifier: StorageEntryModifier::Default,
|
||||
ty: StorageEntryType::Plain(meta_type::<u32>()),
|
||||
default: vec![0, 0, 0, 0],
|
||||
docs: maybe_docs(vec!["Counter for the related counted storage map"]),
|
||||
},
|
||||
StorageEntryMetadata {
|
||||
name: "RenamedCountedMap",
|
||||
modifier: StorageEntryModifier::Optional,
|
||||
@@ -1873,6 +2032,48 @@ fn test_storage_info() {
|
||||
max_values: None,
|
||||
max_size: Some(16 + 1 + 8 + 2 + 16),
|
||||
},
|
||||
StorageInfo {
|
||||
pallet_name: b"Example".to_vec(),
|
||||
storage_name: b"CountedNMap".to_vec(),
|
||||
prefix: prefix(b"Example", b"CountedNMap").to_vec(),
|
||||
max_values: None,
|
||||
max_size: Some(16 + 1 + 4),
|
||||
},
|
||||
StorageInfo {
|
||||
pallet_name: b"Example".to_vec(),
|
||||
storage_name: b"CounterForCountedNMap".to_vec(),
|
||||
prefix: prefix(b"Example", b"CounterForCountedNMap").to_vec(),
|
||||
max_values: Some(1),
|
||||
max_size: Some(4),
|
||||
},
|
||||
StorageInfo {
|
||||
pallet_name: b"Example".to_vec(),
|
||||
storage_name: b"CountedNMap2".to_vec(),
|
||||
prefix: prefix(b"Example", b"CountedNMap2").to_vec(),
|
||||
max_values: Some(11),
|
||||
max_size: Some(8 + 2 + 16 + 4 + 8),
|
||||
},
|
||||
StorageInfo {
|
||||
pallet_name: b"Example".to_vec(),
|
||||
storage_name: b"CounterForCountedNMap2".to_vec(),
|
||||
prefix: prefix(b"Example", b"CounterForCountedNMap2").to_vec(),
|
||||
max_values: Some(1),
|
||||
max_size: Some(4),
|
||||
},
|
||||
StorageInfo {
|
||||
pallet_name: b"Example".to_vec(),
|
||||
storage_name: b"CountedNMap3".to_vec(),
|
||||
prefix: prefix(b"Example", b"CountedNMap3").to_vec(),
|
||||
max_values: None,
|
||||
max_size: Some(16 + 1 + 8 + 2 + 16),
|
||||
},
|
||||
StorageInfo {
|
||||
pallet_name: b"Example".to_vec(),
|
||||
storage_name: b"CounterForCountedNMap3".to_vec(),
|
||||
prefix: prefix(b"Example", b"CounterForCountedNMap3").to_vec(),
|
||||
max_values: Some(1),
|
||||
max_size: Some(4),
|
||||
},
|
||||
#[cfg(feature = "frame-feature-testing")]
|
||||
{
|
||||
StorageInfo {
|
||||
@@ -1913,6 +2114,26 @@ fn test_storage_info() {
|
||||
max_size: Some(16 + 1 + 8 + 2 + 4),
|
||||
}
|
||||
},
|
||||
#[cfg(feature = "frame-feature-testing")]
|
||||
{
|
||||
StorageInfo {
|
||||
pallet_name: b"Example".to_vec(),
|
||||
storage_name: b"ConditionalCountedNMap".to_vec(),
|
||||
prefix: prefix(b"Example", b"ConditionalCountedNMap").to_vec(),
|
||||
max_values: None,
|
||||
max_size: Some(16 + 1 + 8 + 2 + 4),
|
||||
}
|
||||
},
|
||||
#[cfg(feature = "frame-feature-testing")]
|
||||
{
|
||||
StorageInfo {
|
||||
pallet_name: b"Example".to_vec(),
|
||||
storage_name: b"CounterForConditionalCountedNMap".to_vec(),
|
||||
prefix: prefix(b"Example", b"CounterForConditionalCountedNMap").to_vec(),
|
||||
max_values: Some(1),
|
||||
max_size: Some(4),
|
||||
}
|
||||
},
|
||||
StorageInfo {
|
||||
pallet_name: b"Example".to_vec(),
|
||||
storage_name: b"RenamedCountedMap".to_vec(),
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
error: Invalid pallet::storage, expected ident: `StorageValue` or `StorageMap` or `CountedStorageMap` or `StorageDoubleMap` or `StorageNMap` in order to expand metadata, found `u8`.
|
||||
error: Invalid pallet::storage, expected ident: `StorageValue` or `StorageMap` or `CountedStorageMap` or `StorageDoubleMap` or `StorageNMap` or `CountedStorageNMap` in order to expand metadata, found `u8`.
|
||||
--> $DIR/storage_not_storage_type.rs:19:16
|
||||
|
|
||||
19 | type Foo<T> = u8;
|
||||
|
||||
Reference in New Issue
Block a user