diff --git a/client/dump/Cargo.toml b/client/dump/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..7f079820aff8d235ba974e12630f522f45745c33 --- /dev/null +++ b/client/dump/Cargo.toml @@ -0,0 +1,153 @@ +[package] +authors = ['cgeek <cem.moreau@gmail.com>'] +description = 'Duniter client dumper of Storage' +edition = '2021' +homepage = 'https://duniter.org' +license = 'AGPL-3.0' +name = 'dc-dump' +readme = 'README.md' +repository = 'https://git.duniter.org/nodes/rust/duniter-v2s' +version = '1.0.0' + +[features] +default = ['std'] +std = [ + 'codec/std', + 'common-runtime/std', + 'frame-executive/std', + 'frame-support/std', + 'frame-system-rpc-runtime-api/std', + 'frame-system/std', + "frame-try-runtime/std", + 'log/std', + 'pallet-atomic-swap/std', + 'pallet-authority-discovery/std', + 'pallet-authority-members/std', + 'pallet-babe/std', + 'pallet-balances/std', + 'pallet-certification/std', + 'pallet-collective/std', + 'pallet-duniter-test-parameters/std', + 'pallet-duniter-account/std', + 'pallet-duniter-wot/std', + 'pallet-grandpa/std', + 'pallet-identity/std', + 'pallet-membership/std', + 'pallet-oneshot-account/std', + 'pallet-provide-randomness/std', + 'pallet-im-online/std', + 'pallet-multisig/std', + "pallet-offences/std", + 'pallet-preimage/std', + 'pallet-proxy/std', + "pallet-scheduler/std", + 'pallet-session/std', + 'pallet-sudo/std', + 'pallet-universal-dividend/std', + 'pallet-upgrade-origin/std', + 'pallet-timestamp/std', + 'pallet-transaction-payment-rpc-runtime-api/std', + 'pallet-transaction-payment/std', + 'pallet-treasury/std', + 'pallet-utility/std', + "serde/std", + "serde_derive", + 'sp-api/std', + 'sp-arithmetic/std', + 'sp-authority-discovery/std', + 'sp-block-builder/std', + 'sp-consensus-babe/std', + 'sp-core/std', + 'sp-inherents/std', + 'sp-offchain/std', + 'sp-membership/std', + 'sp-runtime/std', + 'sp-session/std', + 'sp-std/std', + 'sp-transaction-pool/std', + 'sp-version/std', +] + +[dependencies] +# local +common-runtime = { path = "../../runtime/common", default-features = false } +pallet-authority-members = { path = '../../pallets/authority-members', default-features = false } +pallet-certification = { path = '../../pallets/certification', default-features = false } +pallet-duniter-test-parameters = { path = '../../pallets/duniter-test-parameters', default-features = false } +pallet-duniter-account = { path = '../../pallets/duniter-account', default-features = false } +pallet-duniter-wot = { path = '../../pallets/duniter-wot', default-features = false } +pallet-identity = { path = '../../pallets/identity', default-features = false } +pallet-membership = { path = '../../pallets/membership', default-features = false } +pallet-offences = { path = '../../pallets/offences', default-features = false } +pallet-oneshot-account = { path = '../../pallets/oneshot-account', default-features = false } +pallet-provide-randomness = { path = '../../pallets/provide-randomness', default-features = false } +pallet-universal-dividend = { path = '../../pallets/universal-dividend', default-features = false } +pallet-session-benchmarking = { path = '../../pallets/session-benchmarking', default-features = false } +pallet-upgrade-origin = { path = '../../pallets/upgrade-origin', default-features = false } +sp-membership = { path = '../../primitives/membership', default-features = false } + +# crates.io +codec = { package = "parity-scale-codec", version = "3.1.5", features = ["derive"], default-features = false } +log = { version = "0.4.17", default-features = false } +hex-literal = { version = '0.3.1', optional = true } +scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } +serde = { version = "1.0.101", default-features = false } +serde_derive = { version = "1.0.101", optional = true } + +# substrate +frame-try-runtime = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false, optional = true } +frame-executive = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +frame-support = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +frame-system = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +frame-system-rpc-runtime-api = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false} +pallet-atomic-swap = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-authority-discovery = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-authorship = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-babe = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-balances = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-collective = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-grandpa = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-im-online = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-multisig = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-preimage = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-proxy = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-scheduler = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-session = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-sudo = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-timestamp = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-transaction-payment = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-transaction-payment-rpc-runtime-api = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-treasury = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +pallet-utility = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +sp-api = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +sp-arithmetic = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +sp-authority-discovery = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +sp-block-builder = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +sp-consensus-babe = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +sp-core = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +sp-inherents = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +sp-offchain = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +sp-runtime = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +sp-session = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +sp-std = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +sp-transaction-pool = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } +sp-version = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32', default-features = false } + +# Other +bytes = { version = "1.1.0", default-features = false } +pretty_assertions = "1.2.1" +maplit = "1.0.2" +sp-consensus-vrf = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32' } +sp-finality-grandpa = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32' } +sp-io = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32' } +sp-keyring = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32' } +sp-storage = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32' } +serde_json = "1.0.99" +strum = "0.25.0" +strum_macros = "0.25.0" +gdev-runtime = { path = "../../runtime/gdev" } + +### DOC ### + +[package.metadata.docs.rs] +targets = ['x86_64-unknown-linux-gnu'] diff --git a/client/dump/src/assert.rs b/client/dump/src/assert.rs new file mode 100644 index 0000000000000000000000000000000000000000..3c59295e5f7c492608fd2903d6487f0b1e56ecb8 --- /dev/null +++ b/client/dump/src/assert.rs @@ -0,0 +1,52 @@ +use crate::checker::Checker; +use bytes::Bytes; +use codec::Decode; +use common_runtime::entities::IdtyData; +use common_runtime::{AccountId, BlockNumber}; +use frame_support::metadata::StorageEntryType; +use frame_support::storage::{KeyPrefixIterator, PrefixIterator}; +use frame_support::{Blake2_128Concat, ReversibleStorageHasher, Twox64Concat}; +use log::info; +use pallet_identity::IdtyValue; +use pretty_assertions::assert_eq; +use scale_info::form::PortableForm; +use std::fs; +use std::string::FromUtf8Error; + +pub fn compare_with_storage(tested: Vec<Checker>, expected_file: String) { + let in_file = format!("tests/{}", expected_file.clone()); + let out_file = format!("tests/{}.actual", expected_file.clone()); + let expected_str = fs::read_to_string(in_file).expect( + format!( + "file {} must exist in tests/{}", + expected_file.clone().as_str(), + std::env::current_dir().unwrap().display() + ) + .as_str(), + ); + let mut actual = String::new(); + for t in tested.into_iter() { + let dotted_name = t.to_dotted_form(); + let (single, map) = t.into_values(); + if let Some(kvs) = map { + actual.push_str(format!("{} = [\n", dotted_name.clone()).as_str()); + for kv in kvs { + actual.push_str(format!("\t{} = {:?}\n", kv.0, kv.1).as_str()); + } + actual.push_str("]\n"); + } else if let Some(v) = single { + actual.push_str(format!("{} = {:?}\n", dotted_name.clone(), v).as_str()); + } else { + actual.push_str(format!("{} = <unreadable>\n", dotted_name.clone()).as_str()); + } + } + if expected_str.clone() != actual.clone() { + fs::write(out_file, actual.clone()).expect("should be able to store actual storage dump"); + } + assert_eq!(expected_str, actual); +} + +fn read_storage(t: &Checker) -> Option<Bytes> { + let key = t.get_prefix(); + sp_io::storage::get(key.as_slice()) +} diff --git a/client/dump/src/checker.rs b/client/dump/src/checker.rs new file mode 100644 index 0000000000000000000000000000000000000000..561aeeb96ed463048bd54298da2f2827bf7ab26e --- /dev/null +++ b/client/dump/src/checker.rs @@ -0,0 +1,74 @@ +use crate::key::Key; +use bytes::Bytes; +use codec::Decode; +use frame_support::metadata::StorageEntryMetadata; +use frame_support::storage::PrefixIterator; +use scale_info::form::PortableForm; +use std::collections::BTreeMap; +use std::fmt::Debug; + +/// A concrete Checker for any type `T` to be read from storage. +pub struct Checker { + pallet_name: String, + storage_name: String, + single_value: Option<Box<dyn Debug>>, + map_key_values: Option<BTreeMap<Box<String>, Box<dyn Debug>>>, +} + +impl Checker { + pub fn new( + pallet_name: &str, + storage_name: &str, + single_value: Option<Box<dyn Debug>>, + map_key_values: Option<BTreeMap<Box<String>, Box<dyn Debug>>>, + ) -> Checker { + Checker { + pallet_name: pallet_name.into(), + storage_name: storage_name.into(), + single_value, + map_key_values, + } + } +} + +impl Checker { + pub fn default(pallet_name: &str, storage_name: &str) -> Box<Checker> { + Box::new(Checker { + pallet_name: pallet_name.into(), + storage_name: storage_name.into(), + single_value: None, + map_key_values: None, + }) + } +} + +/// What is expected to make a storage check +impl Checker { + pub fn pallet_name(&self) -> String { + self.pallet_name.clone() + } + + pub fn storage_name(&self) -> String { + self.storage_name.clone() + } + + pub fn to_dotted_form(&self) -> String { + format!("{}.{}", self.pallet_name, self.storage_name) + } + + pub fn into_values( + self, + ) -> ( + Option<Box<dyn Debug>>, + Option<BTreeMap<Box<String>, Box<dyn Debug>>>, + ) { + (self.single_value, self.map_key_values) + } + + pub fn get_prefix(&self) -> [u8; 32] { + frame_support::storage::storage_prefix( + self.pallet_name().as_bytes(), + self.storage_name().as_bytes(), + ) + } +} diff --git a/client/dump/src/iterative.rs b/client/dump/src/iterative.rs new file mode 100644 index 0000000000000000000000000000000000000000..7642c4ccb19e4d3d8c5d12b462301c76dfa115a9 --- /dev/null +++ b/client/dump/src/iterative.rs @@ -0,0 +1,145 @@ +use crate::assert::compare_with_storage; +use crate::checker::Checker; +use crate::key::Key; +use crate::runtime::extract_storage_entries_normalized; +use codec::{Decode, Error}; +use common_runtime::entities::IdtyData; +use frame_support::instances::{Instance1, Instance2}; +use frame_support::metadata::{RuntimeMetadata, StorageEntryType}; +use frame_support::storage::storage_prefix; +use gdev_runtime::opaque::SessionKeys; +use gdev_runtime::Runtime; +use maplit::btreemap; +use pallet_identity::{IdtyStatus, IdtyValue}; +use pallet_universal_dividend::FirstEligibleUd; +use pretty_assertions::assert_eq; +use scale_info::form::PortableForm; +use sp_api::{AsTrieBackend, StateBackend}; +use sp_consensus_babe::{AuthorityId, BabeAuthorityWeight}; +use sp_core::bounded::WeakBoundedVec; +use sp_core::{map, sr25519}; +use sp_io::TestExternalities; +use sp_runtime::RuntimeString; +use std::collections::HashMap; +use std::fmt::{format, Debug}; +use std::fs::metadata; +use std::iter::Map; +use std::marker::PhantomData; +use std::ops::Add; +use std::str::FromStr; + +/// A struct to ease the testing of extrinsics' impact on the Storage, using the following techniques: +/// +/// - always check *all keys and values of the current state in the Storage* (`test_storage()`) +/// - first define a starting state (`new()` or `new_default()`) +/// +/// Useful for extrinsic testing where we start from a known Storage state, and just want to check +/// the differences after we applied some extrinsics. +pub struct StorageChecker<T> { + get_metadata: fn() -> RuntimeMetadata, + phantom: PhantomData<T>, +} + +impl<T> StorageChecker<T> +where + T: frame_system::Config, + <T as frame_system::Config>::AccountId: std::hash::Hash, + T: pallet_babe::Config, + T: pallet_im_online::Config, + T: pallet_certification::Config<Instance1>, + T: pallet_certification::Config<Instance2>, + T: pallet_universal_dividend::Config, + T: pallet_authorship::Config, + T: pallet_duniter_test_parameters::Config, + T: pallet_authority_members::Config, + T: pallet_session::Config, + T: pallet_balances::Config, + T: pallet_provide_randomness::Config, + T: pallet_treasury::Config, + T: pallet_identity::Config, + T: pallet_offences::Config, + T: pallet_scheduler::Config, + T: pallet_oneshot_account::Config, + T: pallet_atomic_swap::Config, + T: pallet_proxy::Config, + T: pallet_multisig::Config, + T: pallet_duniter_account::Config, + <T as pallet_identity::Config>::IdtyIndex: std::hash::Hash, + <T as pallet_identity::Config>::IdtyData: std::fmt::Debug, + <T as pallet_authority_members::Config>::MemberId: std::hash::Hash, + <T as pallet_session::Config>::ValidatorId: std::hash::Hash, +{ + pub fn new_default(get_metadata: fn() -> RuntimeMetadata) -> StorageChecker<T> { + StorageChecker { + get_metadata, + phantom: PhantomData, + } + } + + /// Test our currently expected state against the real state in the Storage. + /// **Must be tested under an externalities-provided environment.** + /// `expected_keys_count` is the number of storage items that we expect to find in the Runtime. + pub fn test_storage(&self, expected_keys_count: u32, expected_file: &str) { + self.expect_storage( + self.get_metadata, + expected_keys_count, + expected_file.to_string(), + ); + } + + /// Test static keys of Substrate + pub fn test_well_known_keys(&self, externalities: &mut TestExternalities) { + let binding = externalities.as_backend(); + let backend = binding.as_trie_backend(); + let keys_in_trie = backend.keys(&[]); + let mut well_known: Vec<String> = vec![]; + for x in &keys_in_trie { + if let Ok(v) = String::from_utf8(x.clone()) { + well_known.push(format!("{}", v)); + } + } + assert_eq!(well_known[0], ":code"); + // TODO: assert_eq!(well_known[1], ":extrinsic_index"); + // TODO: assert_eq!(well_known[2], ":grandpa_authorities"); + // assert_eq!(well_known.len(), 1); + } + + /// Explores the Runtime to retrive all storage entries (pallet.storage_name) and compare the values + /// against our expected values in golden testing format. + fn expect_storage( + &self, + get_metadata: fn() -> RuntimeMetadata, + expected_keys_count: u32, + expected_file: String, + ) { + // Golden testing part + let meta = get_metadata(); + let mut entries_count = 0u32; + // Explore the Runtime to fetch the storage entries + let mut tested: Vec<Checker> = extract_storage_entries_normalized(&meta) + .unwrap() + .into_iter() + .map(|se| { + entries_count = entries_count.add(1); + let e = format!("{}.{}", se.pallet_name, se.storage_name); + if let Ok(key) = Key::try_from(e.clone()) { + // Specific + key.to_checker::<T>() + } else { + panic!( + "{}.{} must implement TryFrom", + se.pallet_name.as_str(), + se.storage_name.as_str() + ); + } + }) + .collect(); + tested.sort_by_key(|c| c.to_dotted_form()); + let tested_len = *(&tested.len()) as u32; + // The golden comparison + compare_with_storage(tested, expected_file); + // Check the quantities + assert_eq!(expected_keys_count, entries_count); + assert_eq!(expected_keys_count, tested_len); + } +} diff --git a/client/dump/src/key.rs b/client/dump/src/key.rs new file mode 100644 index 0000000000000000000000000000000000000000..02f047fefb8cc99ff2e7cf8c70bf9e7db9740766 --- /dev/null +++ b/client/dump/src/key.rs @@ -0,0 +1,1176 @@ +use crate::checker::Checker; +use crate::private::*; +use bytes::Bytes; +use codec::{Decode, Error, FullCodec}; +use common_runtime::entities::IdtyData; +use common_runtime::{AccountId, BlockNumber, IdtyIndex}; +use frame_support::instances::{Instance1, Instance2}; +use frame_support::metadata::RuntimeMetadata; +use frame_support::storage::{storage_prefix, KeyPrefixIterator, PrefixIterator}; +use frame_support::traits::schedule::v3::TaskName; +use frame_support::traits::{Currency, Len, WrapperOpaque}; +use frame_support::{ + Blake2_128Concat, Hashable, Identity, ReversibleStorageHasher, StorageHasher, Twox64Concat, +}; +use frame_system::{AccountInfo, ConsumedWeight, EventRecord, Phase}; +use gdev_runtime::opaque::SessionKeys; +use gdev_runtime::Runtime; +use maplit::btreemap; +use pallet_authority_members::MemberData; +use pallet_balances::{AccountData, ReserveData}; +use pallet_certification::IdtyCertMeta; +use pallet_collective::Votes; +use pallet_grandpa::BoundedAuthorityList; +use pallet_identity::{IdtyName, IdtyValue}; +use pallet_im_online::{AuthIndex, ValidatorId}; +use pallet_offences::Config; +use pallet_preimage::RequestStatus; +use pallet_provide_randomness::RequestId; +use pallet_scheduler::{ScheduledOf, TaskAddress}; +use pretty_assertions::assert_eq; +use sp_api::{AsTrieBackend, StateBackend}; +use sp_arithmetic::traits::UniqueSaturatedInto; +use sp_consensus_babe::digests::{NextConfigDescriptor, PreDigest}; +use sp_consensus_babe::{AuthorityId, BabeAuthorityWeight, BabeEpochConfiguration}; +use sp_consensus_vrf::schnorrkel; +use sp_core::bounded::{BoundedVec, WeakBoundedVec}; +use sp_core::crypto::{AccountId32, KeyTypeId}; +use sp_core::{ConstU32, Get, TypedGet}; +use sp_finality_grandpa::SetId; +use sp_io::TestExternalities; +use sp_runtime::{generic, RuntimeString}; +use sp_std::map; +use std::collections::{BTreeMap, HashMap}; +use std::fmt::{format, Debug, Formatter}; +use std::iter::Map; +use std::ops::Add; +use std::ptr::read; +use std::str::FromStr; +use std::string::FromUtf8Error; + +/// A convenient enum to represent the expected Storage keys for GDev. +/// For each key we can fetch the storage without static typing notation. +#[derive(strum_macros::EnumString)] +pub enum Key { + SystemNumber, + SystemParentHash, + SystemLastRuntimeUpgrade, + SystemUpgradedToU32RefCount, + SystemUpgradedToTripleRefCount, + SystemAccount, + SystemBlockHash, + SystemExtrinsicData, + SystemEventTopics, + SystemAllExtrinsicsLen, + SystemExtrinsicCount, + SystemBlockWeight, + SystemDigest, + SystemEvents, + SystemEventCount, + SystemExecutionPhase, + SudoKey, + UniversalDividendCurrentUd, + UniversalDividendCurrentUdIndex, + UniversalDividendMonetaryMass, + UniversalDividendNextReeval, + UniversalDividendPastReevals, + IdentityCounterForIdentities, + IdentityNextIdtyIndex, + IdentityIdentitiesNames, + IdentityIdentities, + MembershipCounterForMembership, + SmithMembershipCounterForMembership, + ProvideRandomnessNexEpochHookIn, + ProvideRandomnessRequestsReadyAtEpoch, + ProvideRandomnessRequestsIds, + ProvideRandomnessCounterForRequestsIds, + ProvideRandomnessRequestIdProvider, + ProvideRandomnessRequestsReadyAtNextBlock, + TransactionPaymentNextFeeMultiplier, + TransactionPaymentStorageVersion, + AuthorshipAuthor, + AuthorshipUncles, + AuthorshipDidSetUncles, + BabeInitialized, + BabeAuthorities, + BabeNextAuthorities, + BabeAuthorVrfRandomness, + BabeCurrentSlot, + BabeEpochConfig, + BabeEpochIndex, + BabeEpochStart, + BabeGenesisSlot, + BabeLateness, + BabeNextEpochConfig, + BabeNextRandomness, + BabePendingEpochConfigChange, + BabeRandomness, + BabeSegmentIndex, + ParametersParametersStorage, + AuthorityMembersAuthoritiesCounter, + AuthorityMembersOnlineAuthorities, + AuthorityMembersOutgoingAuthorities, + AuthorityMembersIncomingAuthorities, + AuthorityMembersBlackList, + SessionCurrentIndex, + SessionDisabledValidators, + SessionKeyOwner, + SessionNextKeys, + SessionQueuedChanged, + SessionQueuedKeys, + SessionValidators, + ImOnlineKeys, + ImOnlineHeartbeatAfter, + AccountPendingRandomIdAssignments, + AccountPendingNewAccounts, + SchedulerAgenda, + SchedulerIncompleteSince, + SchedulerLookup, + BabeUnderConstruction, + BalancesAccount, + BalancesLocks, + BalancesReserves, + BalancesStorageVersion, + BalancesTotalIssuance, + OneshotAccountOneshotAccounts, + AuthorityMembersAccountIdOf, + AuthorityMembersMembers, + AuthorityMembersMembersExpireOn, + AuthorityMembersMustRotateKeysBefore, + OffencesReports, + OffencesConcurrentReportsIndex, + GrandpaCurrentSetId, + GrandpaSetIdSession, + GrandpaNextForced, + GrandpaPendingChange, + GrandpaStalled, + GrandpaState, + ImOnlineReceivedHeartbeats, + ImOnlineAuthoredBlocks, + PreimageStatusFor, + PreimagePreimageFor, + TechnicalCommitteeProposalOf, + TechnicalCommitteeVoting, + TechnicalCommitteeProposals, + TechnicalCommitteeMembers, + TechnicalCommitteePrime, + TechnicalCommitteeProposalCount, + IdentityIdentityIndexOf, + IdentityIdentitiesRemovableOn, + MembershipMembership, + MembershipMembershipsExpireOn, + MembershipPendingMembership, + MembershipPendingMembershipsExpireOn, + CertStorageIdtyCertMeta, + CertCertsByReceiver, + CertStorageCertsRemovableOn, + SmithMembershipMembership, + SmithMembershipMembershipsExpireOn, + SmithMembershipPendingMembership, + SmithMembershipPendingMembershipsExpireOn, + SmithCertStorageIdtyCertMeta, + SmithCertCertsByReceiver, + SmithCertStorageCertsRemovableOn, + AtomicSwapPendingSwaps, + MultisigMultisigs, + ProxyProxies, + ProxyAnnouncements, + TreasuryProposals, + TreasuryProposalCount, + TreasuryApprovals, + TimestampDidUpdate, + TimestampNow, +} + +trait RuntimeCompliant: frame_system::Config {} + +impl Key { + pub fn to_checker<T>(self) -> Checker + where + T: frame_system::Config, + <T as frame_system::Config>::AccountId: std::hash::Hash, + T: pallet_babe::Config, + T: pallet_im_online::Config, + T: pallet_certification::Config<Instance1>, + T: pallet_certification::Config<Instance2>, + T: pallet_universal_dividend::Config, + T: pallet_authorship::Config, + T: pallet_duniter_test_parameters::Config, + T: pallet_authority_members::Config, + T: pallet_session::Config, + T: pallet_balances::Config, + T: pallet_provide_randomness::Config, + T: pallet_treasury::Config, + T: pallet_identity::Config, + T: pallet_offences::Config, + T: pallet_scheduler::Config, + T: pallet_oneshot_account::Config, + T: pallet_atomic_swap::Config, + T: pallet_proxy::Config, + T: pallet_multisig::Config, + T: pallet_duniter_account::Config, + <T as pallet_identity::Config>::IdtyIndex: std::hash::Hash, + <T as pallet_identity::Config>::IdtyData: std::fmt::Debug, + <T as pallet_authority_members::Config>::MemberId: std::hash::Hash, + <T as pallet_session::Config>::ValidatorId: std::hash::Hash, + { + let k = self.name(); + let single_value = self.to_value::<T>(); + let map_key_values = self.to_map_value::<T>(); + Checker::new( + k.pallet.as_str(), + k.storage.as_str(), + single_value, + map_key_values, + ) + } + + /// Provides the KeyName of a known Storage Key + pub(crate) fn name(&self) -> KeyName { + match self { + Key::SystemNumber => KeyName::new("System", "Number"), + Key::SystemParentHash => KeyName::new("System", "ParentHash"), + Key::SystemLastRuntimeUpgrade => KeyName::new("System", "LastRuntimeUpgrade"), + Key::SystemUpgradedToU32RefCount => KeyName::new("System", "UpgradedToU32RefCount"), + Key::SystemUpgradedToTripleRefCount => { + KeyName::new("System", "UpgradedToTripleRefCount") + } + Key::SystemAccount => KeyName::new("System", "Account"), + Key::SystemBlockHash => KeyName::new("System", "BlockHash"), + Key::SystemExtrinsicData => KeyName::new("System", "ExtrinsicData"), + Key::SystemEventTopics => KeyName::new("System", "EventTopics"), + Key::SystemAllExtrinsicsLen => KeyName::new("System", "AllExtrinsicsLen"), + Key::SystemExtrinsicCount => KeyName::new("System", "ExtrinsicCount"), + Key::SystemBlockWeight => KeyName::new("System", "BlockWeight"), + Key::SystemDigest => KeyName::new("System", "Digest"), + Key::SystemEvents => KeyName::new("System", "Events"), + Key::SystemEventCount => KeyName::new("System", "EventCount"), + Key::SystemExecutionPhase => KeyName::new("System", "ExecutionPhase"), + Key::SudoKey => KeyName::new("Sudo", "Key"), + Key::UniversalDividendCurrentUd => KeyName::new("UniversalDividend", "CurrentUd"), + Key::UniversalDividendCurrentUdIndex => { + KeyName::new("UniversalDividend", "CurrentUdIndex") + } + Key::UniversalDividendMonetaryMass => KeyName::new("UniversalDividend", "MonetaryMass"), + Key::UniversalDividendNextReeval => KeyName::new("UniversalDividend", "NextReeval"), + Key::UniversalDividendPastReevals => KeyName::new("UniversalDividend", "PastReevals"), + Key::IdentityCounterForIdentities => KeyName::new("Identity", "CounterForIdentities"), + Key::IdentityNextIdtyIndex => KeyName::new("Identity", "NextIdtyIndex"), + Key::IdentityIdentities => KeyName::new("Identity", "Identities"), + Key::IdentityIdentitiesNames => KeyName::new("Identity", "IdentitiesNames"), + Key::MembershipCounterForMembership => { + KeyName::new("Membership", "CounterForMembership") + } + Key::SmithMembershipCounterForMembership => { + KeyName::new("SmithMembership", "CounterForMembership") + } + Key::ProvideRandomnessNexEpochHookIn => { + KeyName::new("ProvideRandomness", "NexEpochHookIn") + } + Key::ProvideRandomnessCounterForRequestsIds => { + KeyName::new("ProvideRandomness", "CounterForRequestsIds") + } + Key::ProvideRandomnessRequestIdProvider => { + KeyName::new("ProvideRandomness", "RequestIdProvider") + } + Key::ProvideRandomnessRequestsReadyAtNextBlock => { + KeyName::new("ProvideRandomness", "RequestsReadyAtNextBlock") + } + Key::TransactionPaymentNextFeeMultiplier => { + KeyName::new("TransactionPayment", "NextFeeMultiplier") + } + Key::TransactionPaymentStorageVersion => { + KeyName::new("TransactionPayment", "StorageVersion") + } + Key::AuthorshipAuthor => KeyName::new("Authorship", "Author"), + Key::AuthorshipUncles => KeyName::new("Authorship", "Uncles"), + Key::AuthorshipDidSetUncles => KeyName::new("Authorship", "DidSetUncles"), + Key::BabeInitialized => KeyName::new("Babe", "Initialized"), + Key::BabeAuthorities => KeyName::new("Babe", "Authorities"), + Key::BabeNextAuthorities => KeyName::new("Babe", "NextAuthorities"), + Key::BabeAuthorVrfRandomness => KeyName::new("Babe", "AuthorVrfRandomness"), + Key::BabeCurrentSlot => KeyName::new("Babe", "CurrentSlot"), + Key::BabeEpochConfig => KeyName::new("Babe", "EpochConfig"), + Key::BabeEpochIndex => KeyName::new("Babe", "EpochIndex"), + Key::BabeEpochStart => KeyName::new("Babe", "EpochStart"), + Key::BabeGenesisSlot => KeyName::new("Babe", "GenesisSlot"), + Key::BabeLateness => KeyName::new("Babe", "Lateness"), + Key::BabeNextEpochConfig => KeyName::new("Babe", "NextEpochConfig"), + Key::BabeNextRandomness => KeyName::new("Babe", "NextRandomness"), + Key::BabePendingEpochConfigChange => KeyName::new("Babe", "PendingEpochConfigChange"), + Key::BabeRandomness => KeyName::new("Babe", "Randomness"), + Key::BabeSegmentIndex => KeyName::new("Babe", "SegmentIndex"), + Key::ParametersParametersStorage => KeyName::new("Parameters", "ParametersStorage"), + Key::AuthorityMembersAuthoritiesCounter => { + KeyName::new("AuthorityMembers", "AuthoritiesCounter") + } + Key::AuthorityMembersOnlineAuthorities => { + KeyName::new("AuthorityMembers", "OnlineAuthorities") + } + Key::AuthorityMembersOutgoingAuthorities => { + KeyName::new("AuthorityMembers", "OutgoingAuthorities") + } + Key::AuthorityMembersIncomingAuthorities => { + KeyName::new("AuthorityMembers", "IncomingAuthorities") + } + Key::AuthorityMembersBlackList => KeyName::new("AuthorityMembers", "BlackList"), + Key::SessionCurrentIndex => KeyName::new("Session", "CurrentIndex"), + Key::SessionDisabledValidators => KeyName::new("Session", "DisabledValidators"), + Key::SessionKeyOwner => KeyName::new("Session", "KeyOwner"), + Key::SessionNextKeys => KeyName::new("Session", "NextKeys"), + Key::SessionQueuedChanged => KeyName::new("Session", "QueuedChanged"), + Key::SessionQueuedKeys => KeyName::new("Session", "QueuedKeys"), + Key::SessionValidators => KeyName::new("Session", "Validators"), + Key::ImOnlineKeys => KeyName::new("ImOnline", "Keys"), + Key::ImOnlineHeartbeatAfter => KeyName::new("ImOnline", "HeartbeatAfter"), + Key::AccountPendingRandomIdAssignments => { + KeyName::new("Account", "PendingRandomIdAssignments") + } + Key::AccountPendingNewAccounts => KeyName::new("Account", "PendingNewAccounts"), + Key::SchedulerAgenda => KeyName::new("Scheduler", "Agenda"), + Key::SchedulerIncompleteSince => KeyName::new("Scheduler", "IncompleteSince"), + Key::SchedulerLookup => KeyName::new("Scheduler", "Lookup"), + Key::BabeUnderConstruction => KeyName::new("Babe", "UnderConstruction"), + Key::BalancesAccount => KeyName::new("Balances", "Account"), + Key::BalancesLocks => KeyName::new("Balances", "Locks"), + Key::BalancesReserves => KeyName::new("Balances", "Reserves"), + Key::BalancesStorageVersion => KeyName::new("Balances", "StorageVersion"), + Key::BalancesTotalIssuance => KeyName::new("Balances", "TotalIssuance"), + Key::OneshotAccountOneshotAccounts => KeyName::new("OneshotAccount", "OneshotAccounts"), + Key::AuthorityMembersAccountIdOf => KeyName::new("AuthorityMembers", "AccountIdOf"), + Key::AuthorityMembersMembers => KeyName::new("AuthorityMembers", "Members"), + Key::AuthorityMembersMembersExpireOn => { + KeyName::new("AuthorityMembersMembers", "ExpireOn") + } + Key::AuthorityMembersMustRotateKeysBefore => { + KeyName::new("AuthorityMembers", "MustRotateKeysBefore") + } + Key::OffencesReports => KeyName::new("Offences", "Reports"), + Key::OffencesConcurrentReportsIndex => { + KeyName::new("Offences", "ConcurrentReportsIndex") + } + Key::GrandpaCurrentSetId => KeyName::new("Grandpa", "CurrentSetId"), + Key::GrandpaSetIdSession => KeyName::new("Grandpa", "SetIdSession"), + Key::GrandpaNextForced => KeyName::new("Grandpa", "NextForced"), + Key::GrandpaPendingChange => KeyName::new("Grandpa", "PendingChange"), + Key::GrandpaStalled => KeyName::new("Grandpa", "Stalled"), + Key::GrandpaState => KeyName::new("Grandpa", "State"), + Key::ImOnlineReceivedHeartbeats => KeyName::new("ImOnline", "ReceivedHeartbeats"), + Key::ImOnlineAuthoredBlocks => KeyName::new("ImOnline", "AuthoredBlocks"), + Key::PreimageStatusFor => KeyName::new("Preimage", "StatusFor"), + Key::PreimagePreimageFor => KeyName::new("Preimage", "PreimageFor"), + Key::TechnicalCommitteeProposalOf => KeyName::new("TechnicalCommittee", "ProposalOf"), + Key::TechnicalCommitteeVoting => KeyName::new("TechnicalCommittee", "Voting"), + Key::TechnicalCommitteeProposals => KeyName::new("TechnicalCommittee", "Proposals"), + Key::TechnicalCommitteeMembers => KeyName::new("TechnicalCommittee", "Members"), + Key::TechnicalCommitteePrime => KeyName::new("TechnicalCommittee", "Prime"), + Key::TechnicalCommitteeProposalCount => { + KeyName::new("TechnicalCommittee", "ProposalCount") + } + Key::IdentityIdentityIndexOf => KeyName::new("Identity", "IdentityIndexOf"), + Key::IdentityIdentitiesRemovableOn => KeyName::new("Identity", "IdentitiesRemovableOn"), + Key::MembershipMembership => KeyName::new("Membership", "Membership"), + Key::MembershipMembershipsExpireOn => KeyName::new("Membership", "MembershipsExpireOn"), + Key::MembershipPendingMembership => KeyName::new("Membership", "PendingMembership"), + Key::MembershipPendingMembershipsExpireOn => { + KeyName::new("Membership", "PendingMembershipsExpireOn") + } + Key::CertStorageIdtyCertMeta => KeyName::new("Cert", "StorageIdtyCertMeta"), + Key::CertCertsByReceiver => KeyName::new("Cert", "CertsByReceiver"), + Key::CertStorageCertsRemovableOn => KeyName::new("Cert", "StorageCertsRemovableOn"), + Key::SmithMembershipMembership => KeyName::new("SmithMembership", "Membership"), + Key::SmithMembershipMembershipsExpireOn => { + KeyName::new("SmithMembership", "MembershipsExpireOn") + } + Key::SmithMembershipPendingMembership => { + KeyName::new("SmithMembership", "PendingMembership") + } + Key::SmithMembershipPendingMembershipsExpireOn => { + KeyName::new("SmithMembership", "PendingMembershipsExpireOn") + } + Key::SmithCertStorageIdtyCertMeta => KeyName::new("SmithCert", "StorageIdtyCertMeta"), + Key::SmithCertCertsByReceiver => KeyName::new("SmithCertCert", "sByReceiver"), + Key::SmithCertStorageCertsRemovableOn => { + KeyName::new("SmithCert", "StorageCertsRemovableOn") + } + Key::AtomicSwapPendingSwaps => KeyName::new("AtomicSwap", "PendingSwaps"), + Key::MultisigMultisigs => KeyName::new("Multisig", "Multisigs"), + Key::ProvideRandomnessRequestsReadyAtEpoch => { + KeyName::new("ProvideRandomness", "RequestsReadyAtEpoch") + } + Key::ProvideRandomnessRequestsIds => KeyName::new("ProvideRandomness", "RequestsIds"), + Key::ProxyProxies => KeyName::new("Proxy", "Proxies"), + Key::ProxyAnnouncements => KeyName::new("Proxy", "Announcements"), + Key::TreasuryProposals => KeyName::new("Treasury", "Proposals"), + Key::TreasuryProposalCount => KeyName::new("Treasury", "ProposalCount"), + Key::TreasuryApprovals => KeyName::new("Treasury", "Approvals"), + Key::TimestampDidUpdate => KeyName::new("Timestamp", "DidUpdate"), + Key::TimestampNow => KeyName::new("Timestamp", "Now"), + } + } + + pub fn to_value<T>(&self) -> Option<Box<dyn Debug>> + where + T: frame_system::Config, + T: pallet_babe::Config, + T: pallet_im_online::Config, + T: pallet_universal_dividend::Config, + T: pallet_authorship::Config, + T: pallet_duniter_test_parameters::Config, + T: pallet_authority_members::Config, + T: pallet_session::Config, + T: pallet_balances::Config, + T: pallet_provide_randomness::Config, + T: pallet_treasury::Config, + T: pallet_scheduler::Config, + { + match self { + // Maps + Key::SystemNumber => { + // Box::new(frame_system::Number::<T>::get()) + self.read_storage::<<T as frame_system::Config>::BlockNumber>() + } + Key::SystemParentHash => { + // Box::new(frame_system::ParentHash::<T>::get()) + self.read_storage::<<T as frame_system::Config>::Hash>() + } + Key::SystemLastRuntimeUpgrade => { + Some(Box::new(frame_system::LastRuntimeUpgrade::<T>::get())) + } + Key::SystemUpgradedToU32RefCount => { + // Box::new(frame_system::UpgradedToU32RefCount::<T>::get()) + self.read_storage::<bool>() + } + Key::SystemUpgradedToTripleRefCount => { + // Box::new(frame_system::UpgradedToTripleRefCount::<T>::get()) + self.read_storage::<bool>() + } + Key::SystemExtrinsicData => None, + Key::SystemEventTopics => None, + Key::SystemAccount => None, + Key::SystemBlockHash => None, + Key::SystemAllExtrinsicsLen => { + // Box::new(frame_system::AllExtrinsicsLen::<T>::get()) + self.read_storage::<u32>() + } + Key::SystemExtrinsicCount => { + // Box::new(frame_system::ExtrinsicCount::<T>::get()) + self.read_storage::<u32>() + } + Key::SystemBlockWeight => { + // Box::new(frame_system::BlockWeight::<T>::get()) + self.read_storage::<ConsumedWeight>() + } + Key::SystemDigest => { + // Box::new(frame_system::Digest::<T>::get()) + self.read_storage::<generic::Digest>() + } + Key::SystemEvents => { + // Box::new(frame_system::Events::<T>::get()) + self.read_storage::<Vec< + Box< + EventRecord< + <T as frame_system::Config>::RuntimeEvent, + <T as frame_system::Config>::Hash, + >, + >, + >>() + } + Key::SystemEventCount => { + // Box::new(frame_system::EventCount::<T>::get()) + self.read_storage::<u32>() + } + Key::SystemExecutionPhase => { + // Box::new(frame_system::ExecutionPhase::<T>::get()) + self.read_storage::<Phase>() + } + Key::SudoKey => { + // Box::new(pallet_sudo::Key::<T>::get()) + self.read_storage::<<T as frame_system::Config>::AccountId>() + } + Key::UniversalDividendCurrentUd => { + Some(Box::new(pallet_universal_dividend::CurrentUd::<T>::get())) + } + Key::UniversalDividendCurrentUdIndex => Some(Box::new( + pallet_universal_dividend::CurrentUdIndex::<T>::get(), + )), + Key::UniversalDividendMonetaryMass => { + Some(Box::new(pallet_universal_dividend::MonetaryMass::<T>::get())) + } + Key::UniversalDividendNextReeval => { + Some(Box::new(pallet_universal_dividend::NextReeval::<T>::get())) + } + Key::UniversalDividendPastReevals => { + Some(Box::new(pallet_universal_dividend::PastReevals::<T>::get())) + } + Key::IdentityCounterForIdentities => self.read_storage::<u32>(), + Key::IdentityNextIdtyIndex => { + // Box::new(pallet_identity::NextIdtyIndex::<T>::get()) + self.read_storage::<u32>() + } + Key::IdentityIdentitiesNames => None, + Key::IdentityIdentities => None, + Key::MembershipCounterForMembership => self.read_storage::<u32>(), + Key::SmithMembershipCounterForMembership => self.read_storage::<u32>(), + Key::ProvideRandomnessNexEpochHookIn => { + // Box::new(pallet_provide_randomness::NexEpochHookIn::<T>::get()) + self.read_storage::<u8>() + } + Key::ProvideRandomnessCounterForRequestsIds => self.read_storage::<u32>(), + Key::ProvideRandomnessRequestIdProvider => { + // Box::new(pallet_provide_randomness::RequestIdProvider::<T>::get()) + self.read_storage::<RequestId>() + } + Key::ProvideRandomnessRequestsReadyAtNextBlock => Some(Box::new( + pallet_provide_randomness::RequestsReadyAtNextBlock::<T>::get(), + )), + Key::TransactionPaymentNextFeeMultiplier => { + Some(Box::new(pallet_transaction_payment::NextFeeMultiplier::< + Runtime, + >::get())) + } + Key::TransactionPaymentStorageVersion => self.read_storage::<Releases>(), + Key::AuthorshipAuthor => { + // Box::new(pallet_authorship::Author::<T>::get()) + self.read_storage::<Option<PreDigest>>() + } + Key::AuthorshipUncles => { + // Box::new(pallet_authorship::Uncles::<T>::get()) + self.read_storage::<BoundedVec< + UncleEntryItem< + <T as frame_system::Config>::BlockNumber, + <T as frame_system::Config>::Hash, + <T as frame_system::Config>::AccountId, + >, + MaxUncleEntryItems<T>, + >>() + } + Key::AuthorshipDidSetUncles => { + // Box::new(pallet_authorship::DidSetUncles::<T>::get()) + self.read_storage::<bool>() + } + Key::BabeInitialized => { + // Box::new(pallet_babe::Initialized::<T>::get()) + self.read_storage::<Option<PreDigest>>() + } + Key::BabeAuthorities => Some(Box::new(pallet_babe::Authorities::<T>::get())), + Key::BabeNextAuthorities => { + // Box::new(pallet_babe::NextAuthorities::<T>::get()) + self.read_storage::<WeakBoundedVec< + (AuthorityId, BabeAuthorityWeight), + <T as pallet_babe::Config>::MaxAuthorities, + >>() + } + Key::BabeAuthorVrfRandomness => { + // Box::new(pallet_babe::AuthorVrfRandomness::<T>::get()) + self.read_storage::<Option<schnorrkel::Randomness>>() + } + Key::BabeCurrentSlot => Some(Box::new(pallet_babe::CurrentSlot::<T>::get())), + Key::BabeEpochConfig => { + // Box::new(pallet_babe::EpochConfig::<T>::get()) + self.read_storage::<BabeEpochConfiguration>() + } + Key::BabeEpochIndex => Some(Box::new(pallet_babe::EpochIndex::<T>::get())), + Key::BabeEpochStart => { + // Box::new(pallet_babe::EpochStart::<T>::get()) + self.read_storage::<( + <T as frame_system::Config>::BlockNumber, + <T as frame_system::Config>::BlockNumber, + )>() + } + Key::BabeGenesisSlot => Some(Box::new(pallet_babe::GenesisSlot::<T>::get())), + Key::BabeLateness => { + // Box::new(pallet_babe::Lateness::<T>::get()) + self.read_storage::<<T as frame_system::Config>::BlockNumber>() + } + Key::BabeNextEpochConfig => { + // Box::new(pallet_babe::NextEpochConfig::<T>::get()) + self.read_storage::<BabeEpochConfiguration>() + } + Key::BabeNextRandomness => { + // Box::new(pallet_babe::NextRandomness::<T>::get()) + self.read_storage::<schnorrkel::Randomness>() + } + Key::BabePendingEpochConfigChange => { + // Box::new(pallet_babe::PendingEpochConfigChange::<T>::get()) + self.read_storage::<NextConfigDescriptor>() + } + Key::BabeRandomness => Some(Box::new(pallet_babe::Randomness::<T>::get())), + Key::BabeSegmentIndex => { + // Box::new(pallet_babe::SegmentIndex::<T>::get()) + self.read_storage::<u32>() + } + Key::ParametersParametersStorage => Some(Box::new( + pallet_duniter_test_parameters::ParametersStorage::<T>::get(), + )), + Key::AuthorityMembersAuthoritiesCounter => { + Some(Box::new(pallet_authority_members::AuthoritiesCounter::< + Runtime, + >::get())) + } + Key::AuthorityMembersOnlineAuthorities => { + Some(Box::new(pallet_authority_members::OnlineAuthorities::< + Runtime, + >::get())) + } + Key::AuthorityMembersOutgoingAuthorities => { + Some(Box::new(pallet_authority_members::OutgoingAuthorities::< + Runtime, + >::get())) + } + Key::AuthorityMembersIncomingAuthorities => { + Some(Box::new(pallet_authority_members::IncomingAuthorities::< + Runtime, + >::get())) + } + Key::AuthorityMembersBlackList => { + Some(Box::new(pallet_authority_members::BlackList::<T>::get())) + } + Key::SessionCurrentIndex => Some(Box::new(pallet_session::CurrentIndex::<T>::get())), + Key::SessionDisabledValidators => Some(Box::new(pallet_session::DisabledValidators::< + Runtime, + >::get())), + Key::SessionQueuedChanged => Some(Box::new(pallet_session::QueuedChanged::<T>::get())), + Key::SessionKeyOwner => None, + Key::SessionNextKeys => None, + Key::SessionQueuedKeys => Some(Box::new(pallet_session::QueuedKeys::<T>::get())), + Key::SessionValidators => Some(Box::new(pallet_session::Validators::<T>::get())), + Key::ImOnlineKeys => { + // Box::new(pallet_im_online::Keys::<T>::get()) + self.read_storage::<WeakBoundedVec< + <T as pallet_im_online::Config>::AuthorityId, + <T as pallet_im_online::Config>::MaxKeys, + >>() + } + Key::ImOnlineHeartbeatAfter => { + // Box::new(pallet_im_online::HeartbeatAfter::<T>::get()) + self.read_storage::<<T as frame_system::Config>::BlockNumber>() + } + Key::AccountPendingRandomIdAssignments => None, + Key::AccountPendingNewAccounts => None, + Key::SchedulerAgenda => None, + Key::SchedulerIncompleteSince => { + Some(Box::new(pallet_scheduler::IncompleteSince::<T>::get())) + } + Key::SchedulerLookup => None, + Key::BabeUnderConstruction => None, + Key::BalancesAccount => None, + Key::BalancesLocks => None, + Key::BalancesReserves => None, + Key::BalancesStorageVersion => { + // Box::new(pallet_balances::StorageVersion::<T>::get()) + self.read_storage::<Releases>() + } + Key::BalancesTotalIssuance => { + Some(Box::new(pallet_balances::TotalIssuance::<T>::get())) + } + Key::OneshotAccountOneshotAccounts => None, + Key::AuthorityMembersAccountIdOf => None, + Key::AuthorityMembersMembers => None, + Key::AuthorityMembersMembersExpireOn => None, + Key::AuthorityMembersMustRotateKeysBefore => None, + Key::OffencesReports => None, + Key::OffencesConcurrentReportsIndex => None, + Key::GrandpaCurrentSetId => { + // Box::new(pallet_grandpa::CurrentSetId::<T>::get()) + self.read_storage::<SetId>() + } + Key::GrandpaSetIdSession => None, + Key::GrandpaNextForced => { + // Box::new(pallet_grandpa::NextForced::<T>::get()) + self.read_storage::<<T as frame_system::Config>::BlockNumber>() + } + Key::GrandpaPendingChange => { + // Box::new(pallet_grandpa::PendingChange::<T>::get()) + self.read_storage::<StoredPendingChange< + <T as frame_system::Config>::BlockNumber, + MyConstU32<32>, + >>() + } + Key::GrandpaStalled => { + // Box::new(pallet_grandpa::Stalled::<T>::get()) + self.read_storage::<( + <T as frame_system::Config>::BlockNumber, + <T as frame_system::Config>::BlockNumber, + )>() + } + Key::GrandpaState => { + // Box::new(pallet_grandpa::State::<T>::get()) + self.read_storage::<StoredState<<T as frame_system::Config>::BlockNumber>>() + } + Key::ImOnlineReceivedHeartbeats => None, + Key::ImOnlineAuthoredBlocks => None, + Key::PreimageStatusFor => None, + Key::PreimagePreimageFor => None, + Key::TechnicalCommitteeProposalOf => None, + Key::TechnicalCommitteeVoting => None, + Key::TechnicalCommitteeProposals => Some(Box::new(pallet_collective::Proposals::< + Runtime, + Instance2, + >::get())), + Key::TechnicalCommitteeMembers => Some(Box::new(pallet_collective::Members::< + Runtime, + Instance2, + >::get())), + Key::TechnicalCommitteePrime => Some(Box::new(pallet_collective::Prime::< + Runtime, + Instance2, + >::get())), + Key::TechnicalCommitteeProposalCount => { + Some(Box::new(pallet_collective::ProposalCount::< + Runtime, + Instance2, + >::get())) + } + Key::IdentityIdentityIndexOf => None, + Key::IdentityIdentitiesRemovableOn => None, + Key::MembershipMembership => None, + Key::MembershipMembershipsExpireOn => None, + Key::MembershipPendingMembership => None, + Key::MembershipPendingMembershipsExpireOn => None, + Key::CertStorageIdtyCertMeta => None, + Key::CertCertsByReceiver => None, + Key::CertStorageCertsRemovableOn => None, + Key::SmithMembershipMembership => None, + Key::SmithMembershipMembershipsExpireOn => None, + Key::SmithMembershipPendingMembership => None, + Key::SmithMembershipPendingMembershipsExpireOn => None, + Key::SmithCertStorageIdtyCertMeta => None, + Key::SmithCertCertsByReceiver => None, + Key::SmithCertStorageCertsRemovableOn => None, + Key::AtomicSwapPendingSwaps => None, + Key::MultisigMultisigs => None, + Key::ProvideRandomnessRequestsReadyAtEpoch => None, + Key::ProvideRandomnessRequestsIds => None, + Key::ProxyProxies => None, + Key::ProxyAnnouncements => None, + Key::TreasuryProposals => None, + Key::TreasuryProposalCount => Some(Box::new( + pallet_treasury::Proposals::<T>::iter_keys().count(), + )), + Key::TreasuryApprovals => Some(Box::new(pallet_treasury::Approvals::<T>::get())), + Key::TimestampDidUpdate => { + // Box::new(pallet_timestamp::DidUpdate::<T>::iter_keys().count()) + self.read_storage::<bool>() + } + Key::TimestampNow => Some(Box::new(pallet_timestamp::Now::<T>::get())), + } + } + + pub fn to_map_value<T>(&self) -> Option<BTreeMap<Box<String>, Box<dyn Debug>>> + where + T: frame_system::Config, + <T as frame_system::Config>::AccountId: std::hash::Hash, + T: pallet_certification::Config<Instance1>, + T: pallet_certification::Config<Instance2>, + T: pallet_identity::Config, + T: pallet_session::Config, + T: pallet_scheduler::Config, + T: pallet_balances::Config, + T: pallet_oneshot_account::Config, + T: pallet_authority_members::Config, + T: pallet_offences::Config, + T: pallet_atomic_swap::Config, + T: pallet_treasury::Config, + T: pallet_proxy::Config, + T: pallet_multisig::Config, + T: pallet_im_online::Config, + T: pallet_provide_randomness::Config, + T: pallet_duniter_account::Config, + <T as pallet_identity::Config>::IdtyIndex: std::hash::Hash, + <T as pallet_identity::Config>::IdtyData: std::fmt::Debug, + <T as pallet_authority_members::Config>::MemberId: std::hash::Hash, + <T as pallet_session::Config>::ValidatorId: std::hash::Hash, + { + let data: Option<BTreeMap<Box<String>, Box<dyn Debug>>> = match self { + Key::SystemNumber => None, + Key::SystemParentHash => None, + Key::SystemLastRuntimeUpgrade => None, + Key::SystemUpgradedToU32RefCount => None, + Key::SystemUpgradedToTripleRefCount => None, + Key::SystemAccount => to_kv(frame_system::Account::<T>::iter().collect()), + Key::SystemBlockHash => to_kv(frame_system::BlockHash::<T>::iter().collect()), + Key::SystemExtrinsicData => { + self.read_map::<u32, Vec<u8>, Twox64Concat>() + } + Key::SystemEventTopics => self.read_map::< + <T as frame_system::Config>::Hash, + Vec<(<T as frame_system::Config>::BlockNumber, u32)>, + Blake2_128Concat, + >(), + Key::SystemAllExtrinsicsLen => None, + Key::SystemExtrinsicCount => None, + Key::SystemBlockWeight => None, + Key::SystemDigest => None, + Key::SystemEvents => None, + Key::SystemEventCount => None, + Key::SystemExecutionPhase => None, + Key::SudoKey => None, + Key::UniversalDividendCurrentUd => None, + Key::UniversalDividendCurrentUdIndex => None, + Key::UniversalDividendMonetaryMass => None, + Key::UniversalDividendNextReeval => None, + Key::UniversalDividendPastReevals => None, + Key::IdentityCounterForIdentities => None, + Key::IdentityNextIdtyIndex => None, + Key::IdentityIdentities => { + to_kv(pallet_identity::Identities::<T>::iter().collect()) + } + Key::IdentityIdentitiesNames => to_kv( + pallet_identity::IdentitiesNames::<T>::iter() + .map(|(k, v)| (String::from_utf8(k.0).unwrap(), v)) + .collect(), + ), + Key::MembershipCounterForMembership => None, + Key::SmithMembershipCounterForMembership => None, + Key::TransactionPaymentNextFeeMultiplier => None, + Key::TransactionPaymentStorageVersion => None, + Key::AuthorshipAuthor => None, + Key::AuthorshipUncles => None, + Key::AuthorshipDidSetUncles => None, + Key::BabeInitialized => None, + Key::BabeAuthorities => None, + Key::BabeNextAuthorities => None, + Key::BabeAuthorVrfRandomness => None, + Key::BabeCurrentSlot => None, + Key::BabeEpochConfig => None, + Key::BabeEpochIndex => None, + Key::BabeEpochStart => None, + Key::BabeGenesisSlot => None, + Key::BabeLateness => None, + Key::BabeNextEpochConfig => None, + Key::BabeNextRandomness => None, + Key::BabePendingEpochConfigChange => None, + Key::BabeRandomness => None, + Key::BabeSegmentIndex => None, + Key::ParametersParametersStorage => None, + Key::AuthorityMembersAuthoritiesCounter => None, + Key::AuthorityMembersOnlineAuthorities => None, + Key::AuthorityMembersOutgoingAuthorities => None, + Key::AuthorityMembersIncomingAuthorities => None, + Key::AuthorityMembersBlackList => None, + Key::SessionValidators => None, + Key::SessionQueuedKeys => None, + Key::SessionCurrentIndex => None, + Key::SessionDisabledValidators => None, + Key::SessionQueuedChanged => None, + Key::SessionKeyOwner => to_kv(pallet_session::KeyOwner::<T>::iter().collect()), + Key::SessionNextKeys => to_kv(pallet_session::NextKeys::<T>::iter().collect()), + Key::ImOnlineKeys => None, + Key::ImOnlineHeartbeatAfter => None, + Key::AccountPendingRandomIdAssignments => to_kv( + pallet_duniter_account::PendingRandomIdAssignments::<T>::iter().collect(), + ), + Key::AccountPendingNewAccounts => { + to_kv(pallet_duniter_account::PendingNewAccounts::<T>::iter().collect()) + } + Key::SchedulerAgenda => to_kv(pallet_scheduler::Agenda::<T>::iter().collect()), + Key::SchedulerIncompleteSince => None, + Key::ProvideRandomnessNexEpochHookIn => None, + Key::ProvideRandomnessCounterForRequestsIds => None, + Key::ProvideRandomnessRequestIdProvider => None, + Key::ProvideRandomnessRequestsReadyAtNextBlock => None, + Key::ProvideRandomnessRequestsReadyAtEpoch => { + to_kv(pallet_provide_randomness::RequestsReadyAtEpoch::<T>::iter().collect()) + } + Key::ProvideRandomnessRequestsIds => { + to_kv(pallet_provide_randomness::RequestsIds::<T>::iter().collect()) + } + Key::SchedulerLookup => self.read_map::< + TaskName, + TaskAddress<<T as frame_system::Config>::BlockNumber>, + Twox64Concat, + >(), + Key::BabeUnderConstruction => self.read_map::< + u32, + BoundedVec<schnorrkel::Randomness, ConstU32<UNDER_CONSTRUCTION_SEGMENT_LENGTH>>, + Twox64Concat, + >(), + Key::BalancesAccount => to_kv(pallet_balances::Account::<T>::iter().collect()), + Key::BalancesLocks => to_kv(pallet_balances::Locks::<T>::iter().collect()), + Key::BalancesReserves => to_kv(pallet_balances::Reserves::<T>::iter().collect()), + Key::BalancesStorageVersion => None, + Key::BalancesTotalIssuance => None, + Key::OneshotAccountOneshotAccounts => { + to_kv(pallet_oneshot_account::OneshotAccounts::<T>::iter().collect()) + } + Key::AuthorityMembersAccountIdOf => { + to_kv(pallet_authority_members::AccountIdOf::<T>::iter().collect()) + } + Key::AuthorityMembersMembers => { + to_kv(pallet_authority_members::Members::<T>::iter().collect()) + } + Key::AuthorityMembersMembersExpireOn => { + to_kv(pallet_authority_members::MembersExpireOn::<T>::iter().collect()) + } + Key::AuthorityMembersMustRotateKeysBefore => { + to_kv(pallet_authority_members::MustRotateKeysBefore::<T>::iter().collect()) + } + Key::OffencesReports => to_kv(pallet_offences::Reports::<T>::iter().collect()), + Key::OffencesConcurrentReportsIndex => to_kv( + pallet_offences::ConcurrentReportsIndex::<T>::iter() + .map(to_simple_map) + .collect(), + ), + Key::GrandpaCurrentSetId => None, + Key::GrandpaSetIdSession => self.read_map::<SetId, SessionIndex, Twox64Concat>(), + Key::GrandpaNextForced => None, + Key::GrandpaPendingChange => None, + Key::GrandpaStalled => None, + Key::GrandpaState => None, + Key::ImOnlineReceivedHeartbeats => self.read_double_map::< + SessionIndex, + AuthIndex, + CustomBoundedOpaqueNetworkState<Get32, Get32, Get32>, + Twox64Concat, + Twox64Concat, + >(), + Key::ImOnlineAuthoredBlocks => self.read_double_map::< + SessionIndex, + ValidatorId<T>, + u32, + Twox64Concat, + Twox64Concat, + >(), + Key::PreimageStatusFor => self.read_map::< + <T as frame_system::Config>::Hash, + RequestStatus<<T as frame_system::Config>::AccountId, BalanceOf<Runtime>>, + Identity, + >(), + Key::PreimagePreimageFor => self.read_map::< + (<T as frame_system::Config>::Hash, u32), + BoundedVec<u8, ConstU32<MAX_SIZE>>, + Identity, + >(), + Key::TechnicalCommitteeProposalOf => { + to_kv(pallet_collective::ProposalOf::<Runtime, Instance2>::iter().collect()) + } + Key::TechnicalCommitteeVoting => { + to_kv(pallet_collective::Voting::<Runtime, Instance2>::iter().collect()) + } + Key::TechnicalCommitteeProposals => None, + Key::TechnicalCommitteeMembers => None, + Key::TechnicalCommitteePrime => None, + Key::TechnicalCommitteeProposalCount => None, + Key::IdentityIdentityIndexOf => { + to_kv(pallet_identity::IdentityIndexOf::<T>::iter().collect()) + } + Key::IdentityIdentitiesRemovableOn => { + to_kv(pallet_identity::IdentitiesRemovableOn::<T>::iter().collect()) + } + Key::MembershipMembership => { + to_kv(pallet_membership::Membership::<Runtime, Instance1>::iter().collect()) + } + Key::MembershipMembershipsExpireOn => to_kv( + pallet_membership::MembershipsExpireOn::<Runtime, Instance1>::iter().collect(), + ), + Key::MembershipPendingMembership => { + to_kv(pallet_membership::PendingMembership::<Runtime, Instance1>::iter().collect()) + } + Key::MembershipPendingMembershipsExpireOn => to_kv( + pallet_membership::PendingMembershipsExpireOn::<Runtime, Instance1>::iter() + .collect(), + ), + Key::CertStorageIdtyCertMeta => { + self.read_map::< + <T as pallet_certification::Config<Instance1>>::IdtyIndex, + IdtyCertMeta<<T as frame_system::Config>::BlockNumber>, + Twox64Concat, + >() + } + Key::CertCertsByReceiver => { + to_kv(pallet_certification::CertsByReceiver::<Runtime, Instance1>::iter().collect()) + } + Key::CertStorageCertsRemovableOn => to_kv( + pallet_certification::StorageCertsRemovableOn::<Runtime, Instance1>::iter() + .collect(), + ), + Key::SmithMembershipMembership => { + to_kv(pallet_membership::Membership::<Runtime, Instance2>::iter().collect()) + } + Key::SmithMembershipMembershipsExpireOn => to_kv( + pallet_membership::MembershipsExpireOn::<Runtime, Instance2>::iter().collect(), + ), + Key::SmithMembershipPendingMembership => { + to_kv(pallet_membership::PendingMembership::<Runtime, Instance2>::iter().collect()) + } + Key::SmithMembershipPendingMembershipsExpireOn => to_kv( + pallet_membership::PendingMembershipsExpireOn::<Runtime, Instance2>::iter() + .collect(), + ), + Key::SmithCertStorageIdtyCertMeta => { + self.read_map::< + <T as pallet_certification::Config<Instance2>>::IdtyIndex, + IdtyCertMeta<<T as frame_system::Config>::BlockNumber>, + Twox64Concat, + >() + } + Key::SmithCertCertsByReceiver => { + to_kv(pallet_certification::CertsByReceiver::<Runtime, Instance2>::iter().collect()) + } + Key::SmithCertStorageCertsRemovableOn => to_kv( + pallet_certification::StorageCertsRemovableOn::<Runtime, Instance2>::iter() + .collect(), + ), + Key::AtomicSwapPendingSwaps => to_kv( + pallet_atomic_swap::PendingSwaps::<T>::iter() + .map(to_simple_map) + .collect(), + ), + Key::MultisigMultisigs => to_kv( + pallet_multisig::Multisigs::<T>::iter() + .map(to_simple_map) + .collect(), + ), + Key::ProxyProxies => to_kv(pallet_proxy::Proxies::<T>::iter().collect()), + Key::ProxyAnnouncements => { + to_kv(pallet_proxy::Announcements::<T>::iter().collect()) + } + Key::TreasuryProposals => { + to_kv(pallet_treasury::Proposals::<T>::iter().collect()) + } + Key::TreasuryProposalCount => None, + Key::TreasuryApprovals => None, + Key::TimestampDidUpdate => None, + Key::TimestampNow => None, + }; + if let Some(c) = data { + return Some(c); + } + None + } + + // TODO: remove Box + fn read_storage<T: Decode + Debug + 'static>(&self) -> Option<Box<dyn Debug>> { + let k = self.name(); + let key = frame_support::storage::storage_prefix(k.pallet.as_bytes(), k.storage.as_bytes()); + if let Some(v) = sp_io::storage::get(key.as_slice()) { + let v = T::decode(&mut &v[..]); + if let Ok(v) = v { + return Some(Box::new(Some(v))); + } else { + eprintln!("Error for {}.{}", k.pallet, k.storage); + v.unwrap(); + } + } + Some(Box::new(None::<T>)) + } + + fn read_map<K, V, H>(&self) -> Option<BTreeMap<Box<String>, Box<dyn Debug>>> + where + K: FullCodec + Debug + 'static, + V: FullCodec + Debug + 'static, + H: StorageHasher + ReversibleStorageHasher, + { + let key_name = self.name(); + let prefix: Vec<u8> = frame_support::storage::storage_prefix( + key_name.pallet.as_bytes(), + key_name.storage.as_bytes(), + ) + .into(); + let iterator: PrefixIterator<(Result<K, codec::Error>, Result<V, codec::Error>), ()> = + PrefixIterator::new( + prefix.clone(), + prefix, + |raw_key_without_prefix, mut raw_value| { + let mut key_material = H::reverse(raw_key_without_prefix); + let k: Result<K, codec::Error> = codec::Decode::decode(&mut key_material); + let v: Result<V, codec::Error> = codec::Decode::decode(&mut raw_value); + Ok((k, v)) + }, + ); + let mut kvs: BTreeMap<Box<String>, Box<dyn Debug>> = btreemap![]; + for (k, v) in iterator { + kvs.insert(Box::new(format!("{:?}", k.unwrap())), Box::new(v.unwrap())); + } + Some(kvs) + } + + fn read_double_map<K1, K2, V, H1, H2>(&self) -> Option<BTreeMap<Box<String>, Box<dyn Debug>>> + where + K1: FullCodec + Debug + 'static, + K2: FullCodec + Debug + 'static, + V: FullCodec + Debug + 'static, + H1: StorageHasher + ReversibleStorageHasher, + H2: StorageHasher + ReversibleStorageHasher, + { + let key_name = self.name(); + let prefix: Vec<u8> = frame_support::storage::storage_prefix( + key_name.pallet.as_bytes(), + key_name.storage.as_bytes(), + ) + .into(); + let iterator: PrefixIterator<(K1, K2, V)> = PrefixIterator::new( + prefix.clone(), + prefix, + |raw_key_without_prefix, mut raw_value| { + let mut k1_k2_material = H1::reverse(raw_key_without_prefix); + let k1 = K1::decode(&mut k1_k2_material).unwrap(); + let mut k2_material = H2::reverse(k1_k2_material); + let k2 = K2::decode(&mut k2_material).unwrap(); + let v = V::decode(&mut raw_value).unwrap(); + Ok((k1, k2, v)) + }, + ); + let mut kvs: BTreeMap<Box<String>, Box<dyn Debug>> = btreemap![]; + for (k1, k2, v) in iterator { + kvs.insert(Box::new(format!("{:?} => {:?}", k1, k2)), Box::new(v)); + } + Some(kvs) + } +} + +fn to_simple_map<K1, K2, V>((k1, k2, v): (K1, K2, V)) -> (String, V) +where + K1: Debug + 'static, + K2: Debug + 'static, + V: Debug + 'static, +{ + (format!("{:?} => {:?}", k1, k2), v) +} + +fn to_kv<K: Debug + 'static, V: Debug + 'static>( + hm: HashMap<K, V>, +) -> Option<BTreeMap<Box<String>, Box<dyn Debug>>> { + let mut res: BTreeMap<Box<String>, Box<dyn Debug>> = btreemap! {}; + hm.into_iter().for_each(|(k, v)| { + res.insert(Box::new(format!("{:?}", k)), Box::new(v)); + }); + Some(res) +} + +impl TryFrom<String> for Key { + type Error = String; + fn try_from(value: String) -> Result<Self, Self::Error> { + Key::from_str(value.clone().replace(".", "").as_str()).or(Err(format!( + "Storage key '{}' could not be parsed", + value.clone() + ) + .to_string())) + } +} + +fn get_prefix(t: &Checker) -> [u8; 32] { + frame_support::storage::storage_prefix(t.pallet_name().as_bytes(), t.storage_name().as_bytes()) +} + +/// Structured Key name. +/// Composed of two fields which are the same used by Substrate #[pallet::storage] macro as described +/// in [Substrate doc](https://docs.substrate.io/learn/state-transitions-and-storage/#storage-value-keys): +/// - a pallet name +/// - a storage name +#[derive(Eq, Hash, PartialEq, Clone, Debug)] +pub(crate) struct KeyName { + pallet: String, + storage: String, +} + +/// Construtor +impl KeyName { + fn new(pallet: &str, storage: &str) -> KeyName { + KeyName { + pallet: pallet.to_string(), + storage: storage.to_string(), + } + } +} diff --git a/client/dump/src/lib.rs b/client/dump/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..daf4ae8ef4ef54f3488feb5d31e2cf9653a17a0f --- /dev/null +++ b/client/dump/src/lib.rs @@ -0,0 +1,25 @@ +pub mod assert; +pub mod checker; +pub mod iterative; +pub mod key; +mod private; +pub mod runtime; + +#[cfg(test)] +mod tests { + use super::*; + use crate::iterative::StorageChecker; + use sp_io::TestExternalities; + + #[test] + fn simple_test() { + let mut externalities = TestExternalities::default(); + let storage_checker = StorageChecker::<gdev_runtime::Runtime>::new_default(|| { + gdev_runtime::Runtime::metadata().1 + }); + externalities.execute_with(|| { + storage_checker.test_storage(128, "simple_test.expected.txt"); + }); + storage_checker.test_well_known_keys(&mut externalities); + } +} diff --git a/client/dump/src/private.rs b/client/dump/src/private.rs new file mode 100644 index 0000000000000000000000000000000000000000..d16ae56ffe330effea19d3ed0457c974feec84df --- /dev/null +++ b/client/dump/src/private.rs @@ -0,0 +1,131 @@ +use frame_support::traits::Currency; +use sp_arithmetic::traits::UniqueSaturatedInto; +use sp_core::bounded::WeakBoundedVec; +use sp_core::{Get, TypedGet}; + +/// Stuff required by golden testing but is private in the pallets. +/// So it had to be copied here. + +pub type SessionIndex = u32; +pub const UNDER_CONSTRUCTION_SEGMENT_LENGTH: u32 = 256; +type ReportIdOf<T> = <T as frame_system::Config>::Hash; +/// A binary blob which represents a SCALE codec-encoded `O::TimeSlot`. +type OpaqueTimeSlot = Vec<u8>; +pub type BalanceOf<T> = <<T as pallet_preimage::Config>::Currency as Currency< + <T as frame_system::Config>::AccountId, +>>::Balance; +/// Maximum size of preimage we can store is 4mb. +pub const MAX_SIZE: u32 = 4 * 1024 * 1024; +// #[derive(Debug)] +// type Custom<P, M, A> = BoundedOpaqueNetworkState<P, M, A>; + +// impl Debug for BoundedOpaqueNetworkState<P, M, A> { +// fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { +// todo!() +// } +// } + +#[doc = "Const getter for a basic type."] +#[derive(frame_support::RuntimeDebug, PartialEq, Clone)] +pub struct MyConstU32<const T: u32>; +impl<const T: u32> Get<u32> for MyConstU32<T> { + fn get() -> u32 { + T + } +} +impl<const T: u32> Get<Option<u32>> for MyConstU32<T> { + fn get() -> Option<u32> { + Some(T) + } +} +impl<const T: u32> TypedGet for MyConstU32<T> { + type Type = u32; + fn get() -> u32 { + T + } +} +pub type Get32 = MyConstU32<100>; + +#[derive(Debug, codec::Encode, codec::Decode, PartialEq, Clone)] +pub struct CustomBoundedOpaqueNetworkState< + PeerIdEncodingLimit, + MultiAddrEncodingLimit, + AddressesLimit, +> where + PeerIdEncodingLimit: Get<u32>, + MultiAddrEncodingLimit: Get<u32>, + AddressesLimit: Get<u32>, +{ + /// PeerId of the local node in SCALE encoded. + pub peer_id: WeakBoundedVec<u8, PeerIdEncodingLimit>, + /// List of addresses the node knows it can be reached as. + pub external_addresses: + WeakBoundedVec<WeakBoundedVec<u8, MultiAddrEncodingLimit>, AddressesLimit>, +} + +#[derive(codec::Encode, codec::Decode, Clone, Copy, PartialEq, Eq, Debug)] +pub enum Releases { + /// Original version of the pallet. + V1Ancient, + /// One that bumps the usage to FixedU128 from FixedI128. + V2, +} + +#[derive(codec::Encode, codec::Decode, Debug)] +pub struct StoredPendingChange<N, Limit: sp_core::Get<u32>> { + /// The block number this was scheduled at. + pub scheduled_at: N, + /// The delay in blocks until it will be applied. + pub delay: N, + /// The next authority set, weakly bounded in size by `Limit`. + pub next_authorities: pallet_grandpa::BoundedAuthorityList<Limit>, + /// If defined it means the change was forced and the given block number + /// indicates the median last finalized block when the change was signaled. + pub forced: Option<N>, +} + +#[derive(codec::Decode, codec::Encode, Debug, PartialEq)] +pub enum StoredState<N> { + /// The current authority set is live, and GRANDPA is enabled. + Live, + /// There is a pending pause event which will be enacted at the given block + /// height. + PendingPause { + /// Block at which the intention to pause was scheduled. + scheduled_at: N, + /// Number of blocks after which the change will be enacted. + delay: N, + }, + /// The current GRANDPA authority set is paused. + Paused, + /// There is a pending resume event which will be enacted at the given block + /// height. + PendingResume { + /// Block at which the intention to resume was scheduled. + scheduled_at: N, + /// Number of blocks after which the change will be enacted. + delay: N, + }, +} + +#[derive(codec::Decode, codec::Encode, Debug, PartialEq)] +pub enum UncleEntryItem<BlockNumber, Hash, Author> { + InclusionHeight(BlockNumber), + Uncle(Hash, Option<Author>), +} + +const MAX_UNCLES: usize = 10; +pub struct MaxUncleEntryItems<T>(core::marker::PhantomData<T>); +impl<T: pallet_authorship::Config> Get<u32> for MaxUncleEntryItems<T> { + fn get() -> u32 { + // There can be at most `MAX_UNCLES` of `UncleEntryItem::Uncle` and + // one `UncleEntryItem::InclusionHeight` per one `UncleGenerations`, + // so this gives us `MAX_UNCLES + 1` entries per one generation. + // + // There can be one extra generation worth of uncles (e.g. even + // if `UncleGenerations` is zero the pallet will still hold + // one generation worth of uncles). + let max_generations: u32 = T::UncleGenerations::get().unique_saturated_into(); + (MAX_UNCLES as u32 + 1) * (max_generations + 1) + } +} diff --git a/client/dump/src/runtime.rs b/client/dump/src/runtime.rs new file mode 100644 index 0000000000000000000000000000000000000000..33628a0f6e492c979ea28ddb6ce7ac9d281a9542 --- /dev/null +++ b/client/dump/src/runtime.rs @@ -0,0 +1,37 @@ +use frame_support::metadata::{RuntimeMetadata, StorageEntryMetadata}; +use scale_info::form::PortableForm; + +pub fn extract_storage_entries_normalized( + meta: &RuntimeMetadata, +) -> Result<Vec<StorageEntry>, String> { + if let RuntimeMetadata::V14(meta) = meta { + assert_eq!(35, meta.pallets.len()); + Ok(meta + .pallets + .iter() + .filter(|p| p.storage.is_some()) + .flat_map(|p| { + p.storage + .clone() + .unwrap() + .entries + .iter() + .map(|e| (p.name.clone(), e.clone())) + .collect::<Vec<_>>() + }) + .map(|(pallet_name, metadata)| StorageEntry { + pallet_name, + storage_name: metadata.name.clone(), + metadata, + }) + .collect::<Vec<_>>()) + } else { + Err("Not a V14 RuntimeMetadata".into()) + } +} + +pub struct StorageEntry { + pub pallet_name: String, + pub storage_name: String, + pub metadata: StorageEntryMetadata<PortableForm>, +} diff --git a/client/dump/tests/simple_test.expected.txt b/client/dump/tests/simple_test.expected.txt new file mode 100644 index 0000000000000000000000000000000000000000..208f4c2fd18544b7c2ba77a040b9515becb28c0c --- /dev/null +++ b/client/dump/tests/simple_test.expected.txt @@ -0,0 +1,181 @@ +Account.PendingNewAccounts = [ +] +Account.PendingRandomIdAssignments = [ +] +AtomicSwap.PendingSwaps = [ +] +AuthorityMembers.AccountIdOf = [ +] +AuthorityMembers.AuthoritiesCounter = 0 +AuthorityMembers.BlackList = [] +AuthorityMembers.IncomingAuthorities = [] +AuthorityMembers.Members = [ +] +AuthorityMembers.MustRotateKeysBefore = [ +] +AuthorityMembers.OnlineAuthorities = [] +AuthorityMembers.OutgoingAuthorities = [] +AuthorityMembersMembers.ExpireOn = [ +] +Authorship.Author = None +Authorship.DidSetUncles = None +Authorship.Uncles = None +Babe.AuthorVrfRandomness = None +Babe.Authorities = WeakBoundedVec([], 32) +Babe.CurrentSlot = Slot(0) +Babe.EpochConfig = None +Babe.EpochIndex = 0 +Babe.EpochStart = None +Babe.GenesisSlot = Slot(0) +Babe.Initialized = None +Babe.Lateness = None +Babe.NextAuthorities = None +Babe.NextEpochConfig = None +Babe.NextRandomness = None +Babe.PendingEpochConfigChange = None +Babe.Randomness = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Babe.SegmentIndex = None +Babe.UnderConstruction = [ +] +Balances.Account = [ +] +Balances.Locks = [ +] +Balances.Reserves = [ +] +Balances.StorageVersion = None +Balances.TotalIssuance = 0 +Cert.CertsByReceiver = [ +] +Cert.StorageCertsRemovableOn = [ +] +Cert.StorageIdtyCertMeta = [ +] +Grandpa.CurrentSetId = None +Grandpa.NextForced = None +Grandpa.PendingChange = None +Grandpa.SetIdSession = [ +] +Grandpa.Stalled = None +Grandpa.State = None +Identity.CounterForIdentities = None +Identity.Identities = [ +] +Identity.IdentitiesNames = [ +] +Identity.IdentitiesRemovableOn = [ +] +Identity.IdentityIndexOf = [ +] +Identity.NextIdtyIndex = None +ImOnline.AuthoredBlocks = [ +] +ImOnline.HeartbeatAfter = None +ImOnline.Keys = None +ImOnline.ReceivedHeartbeats = [ +] +Membership.CounterForMembership = None +Membership.Membership = [ +] +Membership.MembershipsExpireOn = [ +] +Membership.PendingMembership = [ +] +Membership.PendingMembershipsExpireOn = [ +] +Multisig.Multisigs = [ +] +Offences.ConcurrentReportsIndex = [ +] +Offences.Reports = [ +] +OneshotAccount.OneshotAccounts = [ +] +Parameters.ParametersStorage = Parameters { babe_epoch_duration: 0, cert_period: 0, cert_max_by_issuer: 0, cert_min_received_cert_to_issue_cert: 0, cert_validity_period: 0, idty_confirm_period: 0, idty_creation_period: 0, membership_period: 0, pending_membership_period: 0, ud_creation_period: 0, ud_reeval_period: 0, smith_cert_period: 0, smith_cert_max_by_issuer: 0, smith_cert_min_received_cert_to_issue_cert: 0, smith_cert_validity_period: 0, smith_membership_period: 0, smith_pending_membership_period: 0, smith_wot_first_cert_issuable_on: 0, smith_wot_min_cert_for_membership: 0, wot_first_cert_issuable_on: 0, wot_min_cert_for_create_idty_right: 0, wot_min_cert_for_membership: 0 } +Preimage.PreimageFor = [ +] +Preimage.StatusFor = [ +] +ProvideRandomness.CounterForRequestsIds = None +ProvideRandomness.NexEpochHookIn = None +ProvideRandomness.RequestIdProvider = None +ProvideRandomness.RequestsIds = [ +] +ProvideRandomness.RequestsReadyAtEpoch = [ +] +ProvideRandomness.RequestsReadyAtNextBlock = [] +Proxy.Announcements = [ +] +Proxy.Proxies = [ +] +Scheduler.Agenda = [ +] +Scheduler.IncompleteSince = None +Scheduler.Lookup = [ +] +Session.CurrentIndex = 0 +Session.DisabledValidators = [] +Session.KeyOwner = [ +] +Session.NextKeys = [ +] +Session.QueuedChanged = false +Session.QueuedKeys = [] +Session.Validators = [] +SmithCert.StorageCertsRemovableOn = [ +] +SmithCert.StorageIdtyCertMeta = [ +] +SmithCertCert.sByReceiver = [ +] +SmithMembership.CounterForMembership = None +SmithMembership.Membership = [ +] +SmithMembership.MembershipsExpireOn = [ +] +SmithMembership.PendingMembership = [ +] +SmithMembership.PendingMembershipsExpireOn = [ +] +Sudo.Key = None +System.Account = [ +] +System.AllExtrinsicsLen = None +System.BlockHash = [ +] +System.BlockWeight = None +System.Digest = None +System.EventCount = None +System.EventTopics = [ +] +System.Events = None +System.ExecutionPhase = None +System.ExtrinsicCount = None +System.ExtrinsicData = [ +] +System.LastRuntimeUpgrade = None +System.Number = None +System.ParentHash = None +System.UpgradedToTripleRefCount = None +System.UpgradedToU32RefCount = None +TechnicalCommittee.Members = [] +TechnicalCommittee.Prime = None +TechnicalCommittee.ProposalCount = 0 +TechnicalCommittee.ProposalOf = [ +] +TechnicalCommittee.Proposals = BoundedVec([], 20) +TechnicalCommittee.Voting = [ +] +Timestamp.DidUpdate = None +Timestamp.Now = 0 +TransactionPayment.NextFeeMultiplier = FixedU128(1.000000000000000000) +TransactionPayment.StorageVersion = None +Treasury.Approvals = BoundedVec([], 100) +Treasury.ProposalCount = 0 +Treasury.Proposals = [ +] +UniversalDividend.CurrentUd = 0 +UniversalDividend.CurrentUdIndex = 1 +UniversalDividend.MonetaryMass = 0 +UniversalDividend.NextReeval = 0 +UniversalDividend.PastReevals = BoundedVec([], 4) diff --git a/runtime/gdev/Cargo.toml b/runtime/gdev/Cargo.toml index 8c8fd77889789dff328a3647e5fb4565127594a6..1aedfed067dc3aa9157873d4413b2e4aeffba772 100644 --- a/runtime/gdev/Cargo.toml +++ b/runtime/gdev/Cargo.toml @@ -128,6 +128,7 @@ try-runtime = [ ] [dev-dependencies] +dc-dump = { path = "../../client/dump" } sp-consensus-vrf = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32' } sp-finality-grandpa = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32' } sp-io = { git = 'https://github.com/duniter/substrate', branch = 'duniter-substrate-v0.9.32' } diff --git a/runtime/gdev/tests/integration_tests.rs b/runtime/gdev/tests/integration_tests.rs index 22d1fb05626ce146ea8fde5e57fe23c0b0d0af4f..d3806c7c94c146cf84178639760e51a5f11ee02f 100644 --- a/runtime/gdev/tests/integration_tests.rs +++ b/runtime/gdev/tests/integration_tests.rs @@ -17,6 +17,7 @@ mod common; use common::*; +use dc_dump::iterative::StorageChecker; use frame_support::traits::{Get, PalletInfo, StorageInfo, StorageInfoTrait}; use frame_support::{assert_noop, assert_ok}; use frame_support::{StorageHasher, Twox128}; @@ -29,6 +30,36 @@ fn verify_treasury_account() { // println!("{}", Treasury::account_id()); } +#[test] +fn values_storage_with_run_to_block() { + let mut externalities = ExtBuilder::new(1, 3, 4).build(); + let storage_checker = StorageChecker::<Runtime>::new_default(|| Runtime::metadata().1); + externalities.execute_with(|| { + run_to_block(2); + storage_checker.test_storage(128, "values_storage_with_run_to_block.b.2.expected.txt"); + run_to_block(3); + storage_checker.test_storage(128, "values_storage_with_run_to_block.b.3.expected.txt"); + + // alice create identity for Eve + assert_ok!(Identity::create_identity( + frame_system::RawOrigin::Signed(AccountKeyring::Alice.to_account_id()).into(), + AccountKeyring::Eve.to_account_id(), + )); + run_to_block(4); + storage_checker.test_storage(128, "values_storage_with_run_to_block.b.4.expected.txt"); + + // eve confirms her identity + assert_ok!(Identity::confirm_identity( + frame_system::RawOrigin::Signed(AccountKeyring::Eve.to_account_id()).into(), + "Eeeeeveeeee".into(), + )); + + run_to_block(5); + storage_checker.test_storage(128, "values_storage_with_run_to_block.b.5.expected.txt"); + }); + storage_checker.test_well_known_keys(&mut externalities); +} + #[test] fn verify_pallet_prefixes() { let prefix = |pallet_name, storage_name| { diff --git a/runtime/gdev/tests/values_storage_with_run_to_block.b.2.expected.txt b/runtime/gdev/tests/values_storage_with_run_to_block.b.2.expected.txt new file mode 100644 index 0000000000000000000000000000000000000000..5f27e0977c4832498decaba491f6259be0d566f7 --- /dev/null +++ b/runtime/gdev/tests/values_storage_with_run_to_block.b.2.expected.txt @@ -0,0 +1,244 @@ +Account.PendingNewAccounts = [ +] +Account.PendingRandomIdAssignments = [ +] +AtomicSwap.PendingSwaps = [ +] +AuthorityMembers.AccountIdOf = [ +] +AuthorityMembers.AuthoritiesCounter = 1 +AuthorityMembers.BlackList = [] +AuthorityMembers.IncomingAuthorities = [] +AuthorityMembers.Members = [ + 1 = MemberData { expire_on_session: 0, must_rotate_keys_before: 1500, owner_key: d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) } + 2 = MemberData { expire_on_session: 0, must_rotate_keys_before: 1500, owner_key: 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) } + 3 = MemberData { expire_on_session: 0, must_rotate_keys_before: 1500, owner_key: 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) } +] +AuthorityMembers.MustRotateKeysBefore = [ + 1500 = [1] +] +AuthorityMembers.OnlineAuthorities = [1] +AuthorityMembers.OutgoingAuthorities = [] +AuthorityMembersMembers.ExpireOn = [ +] +Authorship.Author = None +Authorship.DidSetUncles = Some(false) +Authorship.Uncles = Some(BoundedVec([], 11)) +Babe.AuthorVrfRandomness = None +Babe.Authorities = WeakBoundedVec([(Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), 1)], 32) +Babe.CurrentSlot = Slot(0) +Babe.EpochConfig = None +Babe.EpochIndex = 0 +Babe.EpochStart = None +Babe.GenesisSlot = Slot(0) +Babe.Initialized = Some(None) +Babe.Lateness = None +Babe.NextAuthorities = Some(WeakBoundedVec([(Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), 1)], 32)) +Babe.NextEpochConfig = None +Babe.NextRandomness = None +Babe.PendingEpochConfigChange = None +Babe.Randomness = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Babe.SegmentIndex = None +Babe.UnderConstruction = [ +] +Balances.Account = [ +] +Balances.Locks = [ +] +Balances.Reserves = [ +] +Balances.StorageVersion = None +Balances.TotalIssuance = 0 +Cert.CertsByReceiver = [ + 1 = [(2, 10000), (3, 10000), (4, 10000)] + 2 = [(1, 10000), (3, 10000), (4, 10000)] + 3 = [(1, 10000), (2, 10000), (4, 10000)] + 4 = [(1, 10000), (2, 10000), (3, 10000)] +] +Cert.StorageCertsRemovableOn = [ + 10000 = [(2, 1), (3, 1), (4, 1), (1, 2), (3, 2), (4, 2), (1, 3), (2, 3), (4, 3), (1, 4), (2, 4), (3, 4)] +] +Cert.StorageIdtyCertMeta = [ + 1 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 2 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 3 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 4 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } +] +Grandpa.CurrentSetId = None +Grandpa.NextForced = None +Grandpa.PendingChange = None +Grandpa.SetIdSession = [ + 0 = 0 +] +Grandpa.Stalled = None +Grandpa.State = None +Identity.CounterForIdentities = Some(4) +Identity.Identities = [ + 1 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...), removable_on: 0, status: IdtyStatus::Validated } + 2 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...), removable_on: 0, status: IdtyStatus::Validated } + 3 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...), removable_on: 0, status: IdtyStatus::Validated } + 4 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: 306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20 (5DAAnrj7...), removable_on: 0, status: IdtyStatus::Validated } +] +Identity.IdentitiesNames = [ + "Alice" = () + "Bob" = () + "Charlie" = () + "Dave" = () +] +Identity.IdentitiesRemovableOn = [ +] +Identity.IdentityIndexOf = [ + 306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20 (5DAAnrj7...) = 4 + 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) = 2 + 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) = 3 + d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) = 1 +] +Identity.NextIdtyIndex = Some(5) +ImOnline.AuthoredBlocks = [ +] +ImOnline.HeartbeatAfter = None +ImOnline.Keys = Some(WeakBoundedVec([Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...))], 32)) +ImOnline.ReceivedHeartbeats = [ +] +Membership.CounterForMembership = Some(4) +Membership.Membership = [ + 1 = MembershipData { expire_on: 100 } + 2 = MembershipData { expire_on: 100 } + 3 = MembershipData { expire_on: 100 } + 4 = MembershipData { expire_on: 100 } +] +Membership.MembershipsExpireOn = [ + 100 = [1, 2, 3, 4] +] +Membership.PendingMembership = [ +] +Membership.PendingMembershipsExpireOn = [ +] +Multisig.Multisigs = [ +] +Offences.ConcurrentReportsIndex = [ +] +Offences.Reports = [ +] +OneshotAccount.OneshotAccounts = [ +] +Parameters.ParametersStorage = Parameters { babe_epoch_duration: 25, cert_period: 15, cert_max_by_issuer: 10, cert_min_received_cert_to_issue_cert: 2, cert_validity_period: 10000, idty_confirm_period: 40, idty_creation_period: 50, membership_period: 100, pending_membership_period: 500, ud_creation_period: 10, ud_reeval_period: 200, smith_cert_period: 15, smith_cert_max_by_issuer: 8, smith_cert_min_received_cert_to_issue_cert: 2, smith_cert_validity_period: 1000, smith_membership_period: 1000, smith_pending_membership_period: 500, smith_wot_first_cert_issuable_on: 20, smith_wot_min_cert_for_membership: 2, wot_first_cert_issuable_on: 20, wot_min_cert_for_create_idty_right: 2, wot_min_cert_for_membership: 2 } +Preimage.PreimageFor = [ +] +Preimage.StatusFor = [ +] +ProvideRandomness.CounterForRequestsIds = None +ProvideRandomness.NexEpochHookIn = Some(5) +ProvideRandomness.RequestIdProvider = None +ProvideRandomness.RequestsIds = [ +] +ProvideRandomness.RequestsReadyAtEpoch = [ +] +ProvideRandomness.RequestsReadyAtNextBlock = [] +Proxy.Announcements = [ +] +Proxy.Proxies = [ +] +Scheduler.Agenda = [ +] +Scheduler.IncompleteSince = None +Scheduler.Lookup = [ +] +Session.CurrentIndex = 0 +Session.DisabledValidators = [] +Session.KeyOwner = [ + (KeyTypeId([103, 114, 97, 110]), [136, 220, 52, 23, 213, 5, 142, 196, 180, 80, 62, 12, 18, 234, 26, 10, 137, 190, 32, 15, 233, 137, 34, 66, 61, 67, 52, 1, 79, 166, 176, 238]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) + (KeyTypeId([103, 114, 97, 110]), [209, 124, 45, 120, 35, 235, 242, 96, 253, 19, 143, 45, 126, 39, 209, 20, 192, 20, 93, 150, 139, 95, 245, 0, 97, 37, 242, 65, 79, 173, 174, 105]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([103, 114, 97, 110]), [67, 150, 96, 179, 108, 108, 3, 175, 175, 202, 2, 123, 145, 11, 79, 236, 249, 152, 1, 131, 76, 98, 165, 230, 0, 111, 39, 217, 120, 222, 35, 79]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([105, 109, 111, 110]), [142, 175, 4, 21, 22, 135, 115, 99, 38, 201, 254, 161, 126, 37, 252, 82, 135, 97, 54, 147, 201, 18, 144, 156, 178, 38, 170, 71, 148, 242, 106, 72]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([105, 109, 111, 110]), [144, 181, 171, 32, 92, 105, 116, 201, 234, 132, 27, 230, 136, 134, 70, 51, 220, 156, 168, 163, 87, 132, 62, 234, 207, 35, 20, 100, 153, 101, 254, 34]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([105, 109, 111, 110]), [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) + (KeyTypeId([97, 117, 100, 105]), [142, 175, 4, 21, 22, 135, 115, 99, 38, 201, 254, 161, 126, 37, 252, 82, 135, 97, 54, 147, 201, 18, 144, 156, 178, 38, 170, 71, 148, 242, 106, 72]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([97, 117, 100, 105]), [144, 181, 171, 32, 92, 105, 116, 201, 234, 132, 27, 230, 136, 134, 70, 51, 220, 156, 168, 163, 87, 132, 62, 234, 207, 35, 20, 100, 153, 101, 254, 34]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([97, 117, 100, 105]), [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) + (KeyTypeId([98, 97, 98, 101]), [142, 175, 4, 21, 22, 135, 115, 99, 38, 201, 254, 161, 126, 37, 252, 82, 135, 97, 54, 147, 201, 18, 144, 156, 178, 38, 170, 71, 148, 242, 106, 72]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([98, 97, 98, 101]), [144, 181, 171, 32, 92, 105, 116, 201, 234, 132, 27, 230, 136, 134, 70, 51, 220, 156, 168, 163, 87, 132, 62, 234, 207, 35, 20, 100, 153, 101, 254, 34]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([98, 97, 98, 101]), [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) +] +Session.NextKeys = [ + 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) = SessionKeys { grandpa: Public(d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae69 (5GoNkf6W...)), babe: Public(8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...)), im_online: Public(8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...)), authority_discovery: Public(8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...)) } + 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) = SessionKeys { grandpa: Public(439660b36c6c03afafca027b910b4fecf99801834c62a5e6006f27d978de234f (5DbKjhNL...)), babe: Public(90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...)), im_online: Public(90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...)), authority_discovery: Public(90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...)) } + d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) = SessionKeys { grandpa: Public(88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee (5FA9nQDV...)), babe: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), im_online: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), authority_discovery: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)) } +] +Session.QueuedChanged = false +Session.QueuedKeys = [(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...), SessionKeys { grandpa: Public(88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee (5FA9nQDV...)), babe: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), im_online: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), authority_discovery: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)) })] +Session.Validators = [d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)] +SmithCert.StorageCertsRemovableOn = [ + 1000 = [(2, 1), (3, 1), (1, 2), (3, 2), (1, 3), (2, 3)] +] +SmithCert.StorageIdtyCertMeta = [ + 1 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } + 2 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } + 3 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } +] +SmithCertCert.sByReceiver = [ + 1 = [(2, 1000), (3, 1000)] + 2 = [(1, 1000), (3, 1000)] + 3 = [(1, 1000), (2, 1000)] +] +SmithMembership.CounterForMembership = Some(3) +SmithMembership.Membership = [ + 1 = MembershipData { expire_on: 1000 } + 2 = MembershipData { expire_on: 1000 } + 3 = MembershipData { expire_on: 1000 } +] +SmithMembership.MembershipsExpireOn = [ + 1000 = [1, 2, 3] +] +SmithMembership.PendingMembership = [ +] +SmithMembership.PendingMembershipsExpireOn = [ +] +Sudo.Key = None +System.Account = [ + 306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20 (5DAAnrj7...) = AccountInfo { nonce: 0, consumers: 0, providers: 0, sufficients: 1, data: AccountData { random_id: Some(0x0303030303030303030303030303030303030303030303030303030303030303), free: 0, reserved: 0, fee_frozen: 0 } } + 6d6f646c70792f74727372790000000000000000000000000000000000000000 (5EYCAe5i...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 0, data: AccountData { random_id: None, free: 200, reserved: 0, fee_frozen: 0 } } + 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 1, data: AccountData { random_id: Some(0x0101010101010101010101010101010101010101010101010101010101010101), free: 0, reserved: 0, fee_frozen: 0 } } + 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 1, data: AccountData { random_id: Some(0x0202020202020202020202020202020202020202020202020202020202020202), free: 0, reserved: 0, fee_frozen: 0 } } + d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 1, data: AccountData { random_id: Some(0x0000000000000000000000000000000000000000000000000000000000000000), free: 0, reserved: 0, fee_frozen: 0 } } +] +System.AllExtrinsicsLen = None +System.BlockHash = [ + 0 = 0x4545454545454545454545454545454545454545454545454545454545454545 +] +System.BlockWeight = None +System.Digest = None +System.EventCount = None +System.EventTopics = [ +] +System.Events = None +System.ExecutionPhase = None +System.ExtrinsicCount = None +System.ExtrinsicData = [ +] +System.LastRuntimeUpgrade = Some(LastRuntimeUpgradeInfo { spec_version: 400, spec_name: RuntimeString::Owned("gdev") }) +System.Number = Some(2) +System.ParentHash = Some(0x4545454545454545454545454545454545454545454545454545454545454545) +System.UpgradedToTripleRefCount = Some(true) +System.UpgradedToU32RefCount = Some(true) +TechnicalCommittee.Members = [] +TechnicalCommittee.Prime = None +TechnicalCommittee.ProposalCount = 0 +TechnicalCommittee.ProposalOf = [ +] +TechnicalCommittee.Proposals = BoundedVec([], 20) +TechnicalCommittee.Voting = [ +] +Timestamp.DidUpdate = None +Timestamp.Now = 0 +TransactionPayment.NextFeeMultiplier = FixedU128(0.000000000000000000) +TransactionPayment.StorageVersion = None +Treasury.Approvals = BoundedVec([], 100) +Treasury.ProposalCount = 0 +Treasury.Proposals = [ +] +UniversalDividend.CurrentUd = 1000 +UniversalDividend.CurrentUdIndex = 1 +UniversalDividend.MonetaryMass = 0 +UniversalDividend.NextReeval = 100 +UniversalDividend.PastReevals = BoundedVec([(1, 1000)], 4) diff --git a/runtime/gdev/tests/values_storage_with_run_to_block.b.3.expected.txt b/runtime/gdev/tests/values_storage_with_run_to_block.b.3.expected.txt new file mode 100644 index 0000000000000000000000000000000000000000..b1509750ab0c99b8dc9ca9ef696c15adfb51ec6a --- /dev/null +++ b/runtime/gdev/tests/values_storage_with_run_to_block.b.3.expected.txt @@ -0,0 +1,244 @@ +Account.PendingNewAccounts = [ +] +Account.PendingRandomIdAssignments = [ +] +AtomicSwap.PendingSwaps = [ +] +AuthorityMembers.AccountIdOf = [ +] +AuthorityMembers.AuthoritiesCounter = 1 +AuthorityMembers.BlackList = [] +AuthorityMembers.IncomingAuthorities = [] +AuthorityMembers.Members = [ + 1 = MemberData { expire_on_session: 0, must_rotate_keys_before: 1500, owner_key: d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) } + 2 = MemberData { expire_on_session: 0, must_rotate_keys_before: 1500, owner_key: 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) } + 3 = MemberData { expire_on_session: 0, must_rotate_keys_before: 1500, owner_key: 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) } +] +AuthorityMembers.MustRotateKeysBefore = [ + 1500 = [1] +] +AuthorityMembers.OnlineAuthorities = [1] +AuthorityMembers.OutgoingAuthorities = [] +AuthorityMembersMembers.ExpireOn = [ +] +Authorship.Author = None +Authorship.DidSetUncles = Some(false) +Authorship.Uncles = Some(BoundedVec([], 11)) +Babe.AuthorVrfRandomness = None +Babe.Authorities = WeakBoundedVec([(Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), 1)], 32) +Babe.CurrentSlot = Slot(0) +Babe.EpochConfig = None +Babe.EpochIndex = 0 +Babe.EpochStart = None +Babe.GenesisSlot = Slot(0) +Babe.Initialized = Some(None) +Babe.Lateness = None +Babe.NextAuthorities = Some(WeakBoundedVec([(Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), 1)], 32)) +Babe.NextEpochConfig = None +Babe.NextRandomness = None +Babe.PendingEpochConfigChange = None +Babe.Randomness = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Babe.SegmentIndex = None +Babe.UnderConstruction = [ +] +Balances.Account = [ +] +Balances.Locks = [ +] +Balances.Reserves = [ +] +Balances.StorageVersion = None +Balances.TotalIssuance = 0 +Cert.CertsByReceiver = [ + 1 = [(2, 10000), (3, 10000), (4, 10000)] + 2 = [(1, 10000), (3, 10000), (4, 10000)] + 3 = [(1, 10000), (2, 10000), (4, 10000)] + 4 = [(1, 10000), (2, 10000), (3, 10000)] +] +Cert.StorageCertsRemovableOn = [ + 10000 = [(2, 1), (3, 1), (4, 1), (1, 2), (3, 2), (4, 2), (1, 3), (2, 3), (4, 3), (1, 4), (2, 4), (3, 4)] +] +Cert.StorageIdtyCertMeta = [ + 1 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 2 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 3 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 4 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } +] +Grandpa.CurrentSetId = None +Grandpa.NextForced = None +Grandpa.PendingChange = None +Grandpa.SetIdSession = [ + 0 = 0 +] +Grandpa.Stalled = None +Grandpa.State = None +Identity.CounterForIdentities = Some(4) +Identity.Identities = [ + 1 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...), removable_on: 0, status: IdtyStatus::Validated } + 2 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...), removable_on: 0, status: IdtyStatus::Validated } + 3 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...), removable_on: 0, status: IdtyStatus::Validated } + 4 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: 306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20 (5DAAnrj7...), removable_on: 0, status: IdtyStatus::Validated } +] +Identity.IdentitiesNames = [ + "Alice" = () + "Bob" = () + "Charlie" = () + "Dave" = () +] +Identity.IdentitiesRemovableOn = [ +] +Identity.IdentityIndexOf = [ + 306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20 (5DAAnrj7...) = 4 + 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) = 2 + 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) = 3 + d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) = 1 +] +Identity.NextIdtyIndex = Some(5) +ImOnline.AuthoredBlocks = [ +] +ImOnline.HeartbeatAfter = None +ImOnline.Keys = Some(WeakBoundedVec([Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...))], 32)) +ImOnline.ReceivedHeartbeats = [ +] +Membership.CounterForMembership = Some(4) +Membership.Membership = [ + 1 = MembershipData { expire_on: 100 } + 2 = MembershipData { expire_on: 100 } + 3 = MembershipData { expire_on: 100 } + 4 = MembershipData { expire_on: 100 } +] +Membership.MembershipsExpireOn = [ + 100 = [1, 2, 3, 4] +] +Membership.PendingMembership = [ +] +Membership.PendingMembershipsExpireOn = [ +] +Multisig.Multisigs = [ +] +Offences.ConcurrentReportsIndex = [ +] +Offences.Reports = [ +] +OneshotAccount.OneshotAccounts = [ +] +Parameters.ParametersStorage = Parameters { babe_epoch_duration: 25, cert_period: 15, cert_max_by_issuer: 10, cert_min_received_cert_to_issue_cert: 2, cert_validity_period: 10000, idty_confirm_period: 40, idty_creation_period: 50, membership_period: 100, pending_membership_period: 500, ud_creation_period: 10, ud_reeval_period: 200, smith_cert_period: 15, smith_cert_max_by_issuer: 8, smith_cert_min_received_cert_to_issue_cert: 2, smith_cert_validity_period: 1000, smith_membership_period: 1000, smith_pending_membership_period: 500, smith_wot_first_cert_issuable_on: 20, smith_wot_min_cert_for_membership: 2, wot_first_cert_issuable_on: 20, wot_min_cert_for_create_idty_right: 2, wot_min_cert_for_membership: 2 } +Preimage.PreimageFor = [ +] +Preimage.StatusFor = [ +] +ProvideRandomness.CounterForRequestsIds = None +ProvideRandomness.NexEpochHookIn = Some(5) +ProvideRandomness.RequestIdProvider = None +ProvideRandomness.RequestsIds = [ +] +ProvideRandomness.RequestsReadyAtEpoch = [ +] +ProvideRandomness.RequestsReadyAtNextBlock = [] +Proxy.Announcements = [ +] +Proxy.Proxies = [ +] +Scheduler.Agenda = [ +] +Scheduler.IncompleteSince = None +Scheduler.Lookup = [ +] +Session.CurrentIndex = 0 +Session.DisabledValidators = [] +Session.KeyOwner = [ + (KeyTypeId([103, 114, 97, 110]), [136, 220, 52, 23, 213, 5, 142, 196, 180, 80, 62, 12, 18, 234, 26, 10, 137, 190, 32, 15, 233, 137, 34, 66, 61, 67, 52, 1, 79, 166, 176, 238]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) + (KeyTypeId([103, 114, 97, 110]), [209, 124, 45, 120, 35, 235, 242, 96, 253, 19, 143, 45, 126, 39, 209, 20, 192, 20, 93, 150, 139, 95, 245, 0, 97, 37, 242, 65, 79, 173, 174, 105]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([103, 114, 97, 110]), [67, 150, 96, 179, 108, 108, 3, 175, 175, 202, 2, 123, 145, 11, 79, 236, 249, 152, 1, 131, 76, 98, 165, 230, 0, 111, 39, 217, 120, 222, 35, 79]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([105, 109, 111, 110]), [142, 175, 4, 21, 22, 135, 115, 99, 38, 201, 254, 161, 126, 37, 252, 82, 135, 97, 54, 147, 201, 18, 144, 156, 178, 38, 170, 71, 148, 242, 106, 72]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([105, 109, 111, 110]), [144, 181, 171, 32, 92, 105, 116, 201, 234, 132, 27, 230, 136, 134, 70, 51, 220, 156, 168, 163, 87, 132, 62, 234, 207, 35, 20, 100, 153, 101, 254, 34]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([105, 109, 111, 110]), [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) + (KeyTypeId([97, 117, 100, 105]), [142, 175, 4, 21, 22, 135, 115, 99, 38, 201, 254, 161, 126, 37, 252, 82, 135, 97, 54, 147, 201, 18, 144, 156, 178, 38, 170, 71, 148, 242, 106, 72]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([97, 117, 100, 105]), [144, 181, 171, 32, 92, 105, 116, 201, 234, 132, 27, 230, 136, 134, 70, 51, 220, 156, 168, 163, 87, 132, 62, 234, 207, 35, 20, 100, 153, 101, 254, 34]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([97, 117, 100, 105]), [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) + (KeyTypeId([98, 97, 98, 101]), [142, 175, 4, 21, 22, 135, 115, 99, 38, 201, 254, 161, 126, 37, 252, 82, 135, 97, 54, 147, 201, 18, 144, 156, 178, 38, 170, 71, 148, 242, 106, 72]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([98, 97, 98, 101]), [144, 181, 171, 32, 92, 105, 116, 201, 234, 132, 27, 230, 136, 134, 70, 51, 220, 156, 168, 163, 87, 132, 62, 234, 207, 35, 20, 100, 153, 101, 254, 34]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([98, 97, 98, 101]), [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) +] +Session.NextKeys = [ + 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) = SessionKeys { grandpa: Public(d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae69 (5GoNkf6W...)), babe: Public(8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...)), im_online: Public(8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...)), authority_discovery: Public(8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...)) } + 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) = SessionKeys { grandpa: Public(439660b36c6c03afafca027b910b4fecf99801834c62a5e6006f27d978de234f (5DbKjhNL...)), babe: Public(90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...)), im_online: Public(90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...)), authority_discovery: Public(90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...)) } + d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) = SessionKeys { grandpa: Public(88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee (5FA9nQDV...)), babe: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), im_online: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), authority_discovery: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)) } +] +Session.QueuedChanged = false +Session.QueuedKeys = [(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...), SessionKeys { grandpa: Public(88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee (5FA9nQDV...)), babe: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), im_online: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), authority_discovery: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)) })] +Session.Validators = [d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)] +SmithCert.StorageCertsRemovableOn = [ + 1000 = [(2, 1), (3, 1), (1, 2), (3, 2), (1, 3), (2, 3)] +] +SmithCert.StorageIdtyCertMeta = [ + 1 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } + 2 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } + 3 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } +] +SmithCertCert.sByReceiver = [ + 1 = [(2, 1000), (3, 1000)] + 2 = [(1, 1000), (3, 1000)] + 3 = [(1, 1000), (2, 1000)] +] +SmithMembership.CounterForMembership = Some(3) +SmithMembership.Membership = [ + 1 = MembershipData { expire_on: 1000 } + 2 = MembershipData { expire_on: 1000 } + 3 = MembershipData { expire_on: 1000 } +] +SmithMembership.MembershipsExpireOn = [ + 1000 = [1, 2, 3] +] +SmithMembership.PendingMembership = [ +] +SmithMembership.PendingMembershipsExpireOn = [ +] +Sudo.Key = None +System.Account = [ + 306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20 (5DAAnrj7...) = AccountInfo { nonce: 0, consumers: 0, providers: 0, sufficients: 1, data: AccountData { random_id: Some(0x0303030303030303030303030303030303030303030303030303030303030303), free: 0, reserved: 0, fee_frozen: 0 } } + 6d6f646c70792f74727372790000000000000000000000000000000000000000 (5EYCAe5i...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 0, data: AccountData { random_id: None, free: 200, reserved: 0, fee_frozen: 0 } } + 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 1, data: AccountData { random_id: Some(0x0101010101010101010101010101010101010101010101010101010101010101), free: 0, reserved: 0, fee_frozen: 0 } } + 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 1, data: AccountData { random_id: Some(0x0202020202020202020202020202020202020202020202020202020202020202), free: 0, reserved: 0, fee_frozen: 0 } } + d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 1, data: AccountData { random_id: Some(0x0000000000000000000000000000000000000000000000000000000000000000), free: 0, reserved: 0, fee_frozen: 0 } } +] +System.AllExtrinsicsLen = None +System.BlockHash = [ + 0 = 0x4545454545454545454545454545454545454545454545454545454545454545 +] +System.BlockWeight = None +System.Digest = None +System.EventCount = None +System.EventTopics = [ +] +System.Events = None +System.ExecutionPhase = None +System.ExtrinsicCount = None +System.ExtrinsicData = [ +] +System.LastRuntimeUpgrade = Some(LastRuntimeUpgradeInfo { spec_version: 400, spec_name: RuntimeString::Owned("gdev") }) +System.Number = Some(3) +System.ParentHash = Some(0x4545454545454545454545454545454545454545454545454545454545454545) +System.UpgradedToTripleRefCount = Some(true) +System.UpgradedToU32RefCount = Some(true) +TechnicalCommittee.Members = [] +TechnicalCommittee.Prime = None +TechnicalCommittee.ProposalCount = 0 +TechnicalCommittee.ProposalOf = [ +] +TechnicalCommittee.Proposals = BoundedVec([], 20) +TechnicalCommittee.Voting = [ +] +Timestamp.DidUpdate = None +Timestamp.Now = 0 +TransactionPayment.NextFeeMultiplier = FixedU128(0.000000000000000000) +TransactionPayment.StorageVersion = None +Treasury.Approvals = BoundedVec([], 100) +Treasury.ProposalCount = 0 +Treasury.Proposals = [ +] +UniversalDividend.CurrentUd = 1000 +UniversalDividend.CurrentUdIndex = 1 +UniversalDividend.MonetaryMass = 0 +UniversalDividend.NextReeval = 100 +UniversalDividend.PastReevals = BoundedVec([(1, 1000)], 4) diff --git a/runtime/gdev/tests/values_storage_with_run_to_block.b.4.expected.txt b/runtime/gdev/tests/values_storage_with_run_to_block.b.4.expected.txt new file mode 100644 index 0000000000000000000000000000000000000000..b4971a26e76a03f8a13d6cbc6ef83edf86b8dabf --- /dev/null +++ b/runtime/gdev/tests/values_storage_with_run_to_block.b.4.expected.txt @@ -0,0 +1,251 @@ +Account.PendingNewAccounts = [ +] +Account.PendingRandomIdAssignments = [ +] +AtomicSwap.PendingSwaps = [ +] +AuthorityMembers.AccountIdOf = [ +] +AuthorityMembers.AuthoritiesCounter = 1 +AuthorityMembers.BlackList = [] +AuthorityMembers.IncomingAuthorities = [] +AuthorityMembers.Members = [ + 1 = MemberData { expire_on_session: 0, must_rotate_keys_before: 1500, owner_key: d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) } + 2 = MemberData { expire_on_session: 0, must_rotate_keys_before: 1500, owner_key: 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) } + 3 = MemberData { expire_on_session: 0, must_rotate_keys_before: 1500, owner_key: 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) } +] +AuthorityMembers.MustRotateKeysBefore = [ + 1500 = [1] +] +AuthorityMembers.OnlineAuthorities = [1] +AuthorityMembers.OutgoingAuthorities = [] +AuthorityMembersMembers.ExpireOn = [ +] +Authorship.Author = None +Authorship.DidSetUncles = Some(false) +Authorship.Uncles = Some(BoundedVec([], 11)) +Babe.AuthorVrfRandomness = None +Babe.Authorities = WeakBoundedVec([(Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), 1)], 32) +Babe.CurrentSlot = Slot(0) +Babe.EpochConfig = None +Babe.EpochIndex = 0 +Babe.EpochStart = None +Babe.GenesisSlot = Slot(0) +Babe.Initialized = Some(None) +Babe.Lateness = None +Babe.NextAuthorities = Some(WeakBoundedVec([(Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), 1)], 32)) +Babe.NextEpochConfig = None +Babe.NextRandomness = None +Babe.PendingEpochConfigChange = None +Babe.Randomness = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Babe.SegmentIndex = None +Babe.UnderConstruction = [ +] +Balances.Account = [ +] +Balances.Locks = [ +] +Balances.Reserves = [ +] +Balances.StorageVersion = None +Balances.TotalIssuance = 0 +Cert.CertsByReceiver = [ + 1 = [(2, 10000), (3, 10000), (4, 10000)] + 2 = [(1, 10000), (3, 10000), (4, 10000)] + 3 = [(1, 10000), (2, 10000), (4, 10000)] + 4 = [(1, 10000), (2, 10000), (3, 10000)] + 5 = [(1, 10003)] +] +Cert.StorageCertsRemovableOn = [ + 10000 = [(2, 1), (3, 1), (4, 1), (1, 2), (3, 2), (4, 2), (1, 3), (2, 3), (4, 3), (1, 4), (2, 4), (3, 4)] + 10003 = [(1, 5)] +] +Cert.StorageIdtyCertMeta = [ + 1 = IdtyCertMeta { issued_count: 4, next_issuable_on: 18, received_count: 3 } + 2 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 3 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 4 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 5 = IdtyCertMeta { issued_count: 0, next_issuable_on: 0, received_count: 1 } +] +Grandpa.CurrentSetId = None +Grandpa.NextForced = None +Grandpa.PendingChange = None +Grandpa.SetIdSession = [ + 0 = 0 +] +Grandpa.Stalled = None +Grandpa.State = None +Identity.CounterForIdentities = Some(5) +Identity.Identities = [ + 1 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 53, old_owner_key: None, owner_key: d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...), removable_on: 0, status: IdtyStatus::Validated } + 2 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...), removable_on: 0, status: IdtyStatus::Validated } + 3 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...), removable_on: 0, status: IdtyStatus::Validated } + 4 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: 306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20 (5DAAnrj7...), removable_on: 0, status: IdtyStatus::Validated } + 5 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(None) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e (5HGjWAeF...), removable_on: 43, status: IdtyStatus::Created } +] +Identity.IdentitiesNames = [ + "Alice" = () + "Bob" = () + "Charlie" = () + "Dave" = () +] +Identity.IdentitiesRemovableOn = [ + 43 = [(5, IdtyStatus::Created)] +] +Identity.IdentityIndexOf = [ + 306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20 (5DAAnrj7...) = 4 + 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) = 2 + 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) = 3 + d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) = 1 + e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e (5HGjWAeF...) = 5 +] +Identity.NextIdtyIndex = Some(6) +ImOnline.AuthoredBlocks = [ +] +ImOnline.HeartbeatAfter = None +ImOnline.Keys = Some(WeakBoundedVec([Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...))], 32)) +ImOnline.ReceivedHeartbeats = [ +] +Membership.CounterForMembership = Some(4) +Membership.Membership = [ + 1 = MembershipData { expire_on: 100 } + 2 = MembershipData { expire_on: 100 } + 3 = MembershipData { expire_on: 100 } + 4 = MembershipData { expire_on: 100 } +] +Membership.MembershipsExpireOn = [ + 100 = [1, 2, 3, 4] +] +Membership.PendingMembership = [ +] +Membership.PendingMembershipsExpireOn = [ +] +Multisig.Multisigs = [ +] +Offences.ConcurrentReportsIndex = [ +] +Offences.Reports = [ +] +OneshotAccount.OneshotAccounts = [ +] +Parameters.ParametersStorage = Parameters { babe_epoch_duration: 25, cert_period: 15, cert_max_by_issuer: 10, cert_min_received_cert_to_issue_cert: 2, cert_validity_period: 10000, idty_confirm_period: 40, idty_creation_period: 50, membership_period: 100, pending_membership_period: 500, ud_creation_period: 10, ud_reeval_period: 200, smith_cert_period: 15, smith_cert_max_by_issuer: 8, smith_cert_min_received_cert_to_issue_cert: 2, smith_cert_validity_period: 1000, smith_membership_period: 1000, smith_pending_membership_period: 500, smith_wot_first_cert_issuable_on: 20, smith_wot_min_cert_for_membership: 2, wot_first_cert_issuable_on: 20, wot_min_cert_for_create_idty_right: 2, wot_min_cert_for_membership: 2 } +Preimage.PreimageFor = [ +] +Preimage.StatusFor = [ +] +ProvideRandomness.CounterForRequestsIds = None +ProvideRandomness.NexEpochHookIn = Some(5) +ProvideRandomness.RequestIdProvider = None +ProvideRandomness.RequestsIds = [ +] +ProvideRandomness.RequestsReadyAtEpoch = [ +] +ProvideRandomness.RequestsReadyAtNextBlock = [] +Proxy.Announcements = [ +] +Proxy.Proxies = [ +] +Scheduler.Agenda = [ +] +Scheduler.IncompleteSince = None +Scheduler.Lookup = [ +] +Session.CurrentIndex = 0 +Session.DisabledValidators = [] +Session.KeyOwner = [ + (KeyTypeId([103, 114, 97, 110]), [136, 220, 52, 23, 213, 5, 142, 196, 180, 80, 62, 12, 18, 234, 26, 10, 137, 190, 32, 15, 233, 137, 34, 66, 61, 67, 52, 1, 79, 166, 176, 238]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) + (KeyTypeId([103, 114, 97, 110]), [209, 124, 45, 120, 35, 235, 242, 96, 253, 19, 143, 45, 126, 39, 209, 20, 192, 20, 93, 150, 139, 95, 245, 0, 97, 37, 242, 65, 79, 173, 174, 105]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([103, 114, 97, 110]), [67, 150, 96, 179, 108, 108, 3, 175, 175, 202, 2, 123, 145, 11, 79, 236, 249, 152, 1, 131, 76, 98, 165, 230, 0, 111, 39, 217, 120, 222, 35, 79]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([105, 109, 111, 110]), [142, 175, 4, 21, 22, 135, 115, 99, 38, 201, 254, 161, 126, 37, 252, 82, 135, 97, 54, 147, 201, 18, 144, 156, 178, 38, 170, 71, 148, 242, 106, 72]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([105, 109, 111, 110]), [144, 181, 171, 32, 92, 105, 116, 201, 234, 132, 27, 230, 136, 134, 70, 51, 220, 156, 168, 163, 87, 132, 62, 234, 207, 35, 20, 100, 153, 101, 254, 34]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([105, 109, 111, 110]), [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) + (KeyTypeId([97, 117, 100, 105]), [142, 175, 4, 21, 22, 135, 115, 99, 38, 201, 254, 161, 126, 37, 252, 82, 135, 97, 54, 147, 201, 18, 144, 156, 178, 38, 170, 71, 148, 242, 106, 72]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([97, 117, 100, 105]), [144, 181, 171, 32, 92, 105, 116, 201, 234, 132, 27, 230, 136, 134, 70, 51, 220, 156, 168, 163, 87, 132, 62, 234, 207, 35, 20, 100, 153, 101, 254, 34]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([97, 117, 100, 105]), [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) + (KeyTypeId([98, 97, 98, 101]), [142, 175, 4, 21, 22, 135, 115, 99, 38, 201, 254, 161, 126, 37, 252, 82, 135, 97, 54, 147, 201, 18, 144, 156, 178, 38, 170, 71, 148, 242, 106, 72]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([98, 97, 98, 101]), [144, 181, 171, 32, 92, 105, 116, 201, 234, 132, 27, 230, 136, 134, 70, 51, 220, 156, 168, 163, 87, 132, 62, 234, 207, 35, 20, 100, 153, 101, 254, 34]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([98, 97, 98, 101]), [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) +] +Session.NextKeys = [ + 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) = SessionKeys { grandpa: Public(d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae69 (5GoNkf6W...)), babe: Public(8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...)), im_online: Public(8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...)), authority_discovery: Public(8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...)) } + 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) = SessionKeys { grandpa: Public(439660b36c6c03afafca027b910b4fecf99801834c62a5e6006f27d978de234f (5DbKjhNL...)), babe: Public(90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...)), im_online: Public(90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...)), authority_discovery: Public(90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...)) } + d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) = SessionKeys { grandpa: Public(88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee (5FA9nQDV...)), babe: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), im_online: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), authority_discovery: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)) } +] +Session.QueuedChanged = false +Session.QueuedKeys = [(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...), SessionKeys { grandpa: Public(88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee (5FA9nQDV...)), babe: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), im_online: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), authority_discovery: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)) })] +Session.Validators = [d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)] +SmithCert.StorageCertsRemovableOn = [ + 1000 = [(2, 1), (3, 1), (1, 2), (3, 2), (1, 3), (2, 3)] +] +SmithCert.StorageIdtyCertMeta = [ + 1 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } + 2 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } + 3 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } +] +SmithCertCert.sByReceiver = [ + 1 = [(2, 1000), (3, 1000)] + 2 = [(1, 1000), (3, 1000)] + 3 = [(1, 1000), (2, 1000)] +] +SmithMembership.CounterForMembership = Some(3) +SmithMembership.Membership = [ + 1 = MembershipData { expire_on: 1000 } + 2 = MembershipData { expire_on: 1000 } + 3 = MembershipData { expire_on: 1000 } +] +SmithMembership.MembershipsExpireOn = [ + 1000 = [1, 2, 3] +] +SmithMembership.PendingMembership = [ +] +SmithMembership.PendingMembershipsExpireOn = [ +] +Sudo.Key = None +System.Account = [ + 306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20 (5DAAnrj7...) = AccountInfo { nonce: 0, consumers: 0, providers: 0, sufficients: 1, data: AccountData { random_id: Some(0x0303030303030303030303030303030303030303030303030303030303030303), free: 0, reserved: 0, fee_frozen: 0 } } + 6d6f646c70792f74727372790000000000000000000000000000000000000000 (5EYCAe5i...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 0, data: AccountData { random_id: None, free: 200, reserved: 0, fee_frozen: 0 } } + 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 1, data: AccountData { random_id: Some(0x0101010101010101010101010101010101010101010101010101010101010101), free: 0, reserved: 0, fee_frozen: 0 } } + 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 1, data: AccountData { random_id: Some(0x0202020202020202020202020202020202020202020202020202020202020202), free: 0, reserved: 0, fee_frozen: 0 } } + d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 1, data: AccountData { random_id: Some(0x0000000000000000000000000000000000000000000000000000000000000000), free: 0, reserved: 0, fee_frozen: 0 } } + e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e (5HGjWAeF...) = AccountInfo { nonce: 0, consumers: 0, providers: 0, sufficients: 1, data: AccountData { random_id: None, free: 0, reserved: 0, fee_frozen: 0 } } +] +System.AllExtrinsicsLen = None +System.BlockHash = [ + 0 = 0x4545454545454545454545454545454545454545454545454545454545454545 +] +System.BlockWeight = None +System.Digest = None +System.EventCount = None +System.EventTopics = [ +] +System.Events = None +System.ExecutionPhase = None +System.ExtrinsicCount = None +System.ExtrinsicData = [ +] +System.LastRuntimeUpgrade = Some(LastRuntimeUpgradeInfo { spec_version: 400, spec_name: RuntimeString::Owned("gdev") }) +System.Number = Some(4) +System.ParentHash = Some(0x4545454545454545454545454545454545454545454545454545454545454545) +System.UpgradedToTripleRefCount = Some(true) +System.UpgradedToU32RefCount = Some(true) +TechnicalCommittee.Members = [] +TechnicalCommittee.Prime = None +TechnicalCommittee.ProposalCount = 0 +TechnicalCommittee.ProposalOf = [ +] +TechnicalCommittee.Proposals = BoundedVec([], 20) +TechnicalCommittee.Voting = [ +] +Timestamp.DidUpdate = None +Timestamp.Now = 0 +TransactionPayment.NextFeeMultiplier = FixedU128(0.000000000000000000) +TransactionPayment.StorageVersion = None +Treasury.Approvals = BoundedVec([], 100) +Treasury.ProposalCount = 0 +Treasury.Proposals = [ +] +UniversalDividend.CurrentUd = 1000 +UniversalDividend.CurrentUdIndex = 1 +UniversalDividend.MonetaryMass = 0 +UniversalDividend.NextReeval = 100 +UniversalDividend.PastReevals = BoundedVec([(1, 1000)], 4) diff --git a/runtime/gdev/tests/values_storage_with_run_to_block.b.5.expected.txt b/runtime/gdev/tests/values_storage_with_run_to_block.b.5.expected.txt new file mode 100644 index 0000000000000000000000000000000000000000..0aa23d4f535ed7309ed9af337b680af8d36e284c --- /dev/null +++ b/runtime/gdev/tests/values_storage_with_run_to_block.b.5.expected.txt @@ -0,0 +1,254 @@ +Account.PendingNewAccounts = [ +] +Account.PendingRandomIdAssignments = [ +] +AtomicSwap.PendingSwaps = [ +] +AuthorityMembers.AccountIdOf = [ +] +AuthorityMembers.AuthoritiesCounter = 1 +AuthorityMembers.BlackList = [] +AuthorityMembers.IncomingAuthorities = [] +AuthorityMembers.Members = [ + 1 = MemberData { expire_on_session: 0, must_rotate_keys_before: 1500, owner_key: d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) } + 2 = MemberData { expire_on_session: 0, must_rotate_keys_before: 1500, owner_key: 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) } + 3 = MemberData { expire_on_session: 0, must_rotate_keys_before: 1500, owner_key: 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) } +] +AuthorityMembers.MustRotateKeysBefore = [ + 1500 = [1] +] +AuthorityMembers.OnlineAuthorities = [1] +AuthorityMembers.OutgoingAuthorities = [] +AuthorityMembersMembers.ExpireOn = [ +] +Authorship.Author = None +Authorship.DidSetUncles = Some(false) +Authorship.Uncles = Some(BoundedVec([], 11)) +Babe.AuthorVrfRandomness = None +Babe.Authorities = WeakBoundedVec([(Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), 1)], 32) +Babe.CurrentSlot = Slot(0) +Babe.EpochConfig = None +Babe.EpochIndex = 0 +Babe.EpochStart = None +Babe.GenesisSlot = Slot(0) +Babe.Initialized = Some(None) +Babe.Lateness = None +Babe.NextAuthorities = Some(WeakBoundedVec([(Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), 1)], 32)) +Babe.NextEpochConfig = None +Babe.NextRandomness = None +Babe.PendingEpochConfigChange = None +Babe.Randomness = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Babe.SegmentIndex = None +Babe.UnderConstruction = [ +] +Balances.Account = [ +] +Balances.Locks = [ +] +Balances.Reserves = [ +] +Balances.StorageVersion = None +Balances.TotalIssuance = 0 +Cert.CertsByReceiver = [ + 1 = [(2, 10000), (3, 10000), (4, 10000)] + 2 = [(1, 10000), (3, 10000), (4, 10000)] + 3 = [(1, 10000), (2, 10000), (4, 10000)] + 4 = [(1, 10000), (2, 10000), (3, 10000)] + 5 = [(1, 10003)] +] +Cert.StorageCertsRemovableOn = [ + 10000 = [(2, 1), (3, 1), (4, 1), (1, 2), (3, 2), (4, 2), (1, 3), (2, 3), (4, 3), (1, 4), (2, 4), (3, 4)] + 10003 = [(1, 5)] +] +Cert.StorageIdtyCertMeta = [ + 1 = IdtyCertMeta { issued_count: 4, next_issuable_on: 18, received_count: 3 } + 2 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 3 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 4 = IdtyCertMeta { issued_count: 3, next_issuable_on: 0, received_count: 3 } + 5 = IdtyCertMeta { issued_count: 0, next_issuable_on: 0, received_count: 1 } +] +Grandpa.CurrentSetId = None +Grandpa.NextForced = None +Grandpa.PendingChange = None +Grandpa.SetIdSession = [ + 0 = 0 +] +Grandpa.Stalled = None +Grandpa.State = None +Identity.CounterForIdentities = Some(5) +Identity.Identities = [ + 1 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 53, old_owner_key: None, owner_key: d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...), removable_on: 0, status: IdtyStatus::Validated } + 2 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...), removable_on: 0, status: IdtyStatus::Validated } + 3 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...), removable_on: 0, status: IdtyStatus::Validated } + 4 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(Some(1)) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: 306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20 (5DAAnrj7...), removable_on: 0, status: IdtyStatus::Validated } + 5 = IdtyValue { data: IdtyData { first_eligible_ud: FirstEligibleUd(None) }, next_creatable_identity_on: 0, old_owner_key: None, owner_key: e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e (5HGjWAeF...), removable_on: 43, status: IdtyStatus::ConfirmedByOwner } +] +Identity.IdentitiesNames = [ + "Alice" = () + "Bob" = () + "Charlie" = () + "Dave" = () + "Eeeeeveeeee" = () +] +Identity.IdentitiesRemovableOn = [ + 43 = [(5, IdtyStatus::Created)] +] +Identity.IdentityIndexOf = [ + 306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20 (5DAAnrj7...) = 4 + 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) = 2 + 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) = 3 + d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) = 1 + e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e (5HGjWAeF...) = 5 +] +Identity.NextIdtyIndex = Some(6) +ImOnline.AuthoredBlocks = [ +] +ImOnline.HeartbeatAfter = None +ImOnline.Keys = Some(WeakBoundedVec([Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...))], 32)) +ImOnline.ReceivedHeartbeats = [ +] +Membership.CounterForMembership = Some(4) +Membership.Membership = [ + 1 = MembershipData { expire_on: 100 } + 2 = MembershipData { expire_on: 100 } + 3 = MembershipData { expire_on: 100 } + 4 = MembershipData { expire_on: 100 } +] +Membership.MembershipsExpireOn = [ + 100 = [1, 2, 3, 4] +] +Membership.PendingMembership = [ + 5 = () +] +Membership.PendingMembershipsExpireOn = [ + 504 = [5] +] +Multisig.Multisigs = [ +] +Offences.ConcurrentReportsIndex = [ +] +Offences.Reports = [ +] +OneshotAccount.OneshotAccounts = [ +] +Parameters.ParametersStorage = Parameters { babe_epoch_duration: 25, cert_period: 15, cert_max_by_issuer: 10, cert_min_received_cert_to_issue_cert: 2, cert_validity_period: 10000, idty_confirm_period: 40, idty_creation_period: 50, membership_period: 100, pending_membership_period: 500, ud_creation_period: 10, ud_reeval_period: 200, smith_cert_period: 15, smith_cert_max_by_issuer: 8, smith_cert_min_received_cert_to_issue_cert: 2, smith_cert_validity_period: 1000, smith_membership_period: 1000, smith_pending_membership_period: 500, smith_wot_first_cert_issuable_on: 20, smith_wot_min_cert_for_membership: 2, wot_first_cert_issuable_on: 20, wot_min_cert_for_create_idty_right: 2, wot_min_cert_for_membership: 2 } +Preimage.PreimageFor = [ +] +Preimage.StatusFor = [ +] +ProvideRandomness.CounterForRequestsIds = None +ProvideRandomness.NexEpochHookIn = Some(5) +ProvideRandomness.RequestIdProvider = None +ProvideRandomness.RequestsIds = [ +] +ProvideRandomness.RequestsReadyAtEpoch = [ +] +ProvideRandomness.RequestsReadyAtNextBlock = [] +Proxy.Announcements = [ +] +Proxy.Proxies = [ +] +Scheduler.Agenda = [ +] +Scheduler.IncompleteSince = None +Scheduler.Lookup = [ +] +Session.CurrentIndex = 0 +Session.DisabledValidators = [] +Session.KeyOwner = [ + (KeyTypeId([103, 114, 97, 110]), [136, 220, 52, 23, 213, 5, 142, 196, 180, 80, 62, 12, 18, 234, 26, 10, 137, 190, 32, 15, 233, 137, 34, 66, 61, 67, 52, 1, 79, 166, 176, 238]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) + (KeyTypeId([103, 114, 97, 110]), [209, 124, 45, 120, 35, 235, 242, 96, 253, 19, 143, 45, 126, 39, 209, 20, 192, 20, 93, 150, 139, 95, 245, 0, 97, 37, 242, 65, 79, 173, 174, 105]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([103, 114, 97, 110]), [67, 150, 96, 179, 108, 108, 3, 175, 175, 202, 2, 123, 145, 11, 79, 236, 249, 152, 1, 131, 76, 98, 165, 230, 0, 111, 39, 217, 120, 222, 35, 79]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([105, 109, 111, 110]), [142, 175, 4, 21, 22, 135, 115, 99, 38, 201, 254, 161, 126, 37, 252, 82, 135, 97, 54, 147, 201, 18, 144, 156, 178, 38, 170, 71, 148, 242, 106, 72]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([105, 109, 111, 110]), [144, 181, 171, 32, 92, 105, 116, 201, 234, 132, 27, 230, 136, 134, 70, 51, 220, 156, 168, 163, 87, 132, 62, 234, 207, 35, 20, 100, 153, 101, 254, 34]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([105, 109, 111, 110]), [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) + (KeyTypeId([97, 117, 100, 105]), [142, 175, 4, 21, 22, 135, 115, 99, 38, 201, 254, 161, 126, 37, 252, 82, 135, 97, 54, 147, 201, 18, 144, 156, 178, 38, 170, 71, 148, 242, 106, 72]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([97, 117, 100, 105]), [144, 181, 171, 32, 92, 105, 116, 201, 234, 132, 27, 230, 136, 134, 70, 51, 220, 156, 168, 163, 87, 132, 62, 234, 207, 35, 20, 100, 153, 101, 254, 34]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([97, 117, 100, 105]), [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) + (KeyTypeId([98, 97, 98, 101]), [142, 175, 4, 21, 22, 135, 115, 99, 38, 201, 254, 161, 126, 37, 252, 82, 135, 97, 54, 147, 201, 18, 144, 156, 178, 38, 170, 71, 148, 242, 106, 72]) = 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) + (KeyTypeId([98, 97, 98, 101]), [144, 181, 171, 32, 92, 105, 116, 201, 234, 132, 27, 230, 136, 134, 70, 51, 220, 156, 168, 163, 87, 132, 62, 234, 207, 35, 20, 100, 153, 101, 254, 34]) = 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) + (KeyTypeId([98, 97, 98, 101]), [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]) = d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) +] +Session.NextKeys = [ + 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) = SessionKeys { grandpa: Public(d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae69 (5GoNkf6W...)), babe: Public(8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...)), im_online: Public(8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...)), authority_discovery: Public(8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...)) } + 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) = SessionKeys { grandpa: Public(439660b36c6c03afafca027b910b4fecf99801834c62a5e6006f27d978de234f (5DbKjhNL...)), babe: Public(90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...)), im_online: Public(90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...)), authority_discovery: Public(90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...)) } + d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) = SessionKeys { grandpa: Public(88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee (5FA9nQDV...)), babe: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), im_online: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), authority_discovery: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)) } +] +Session.QueuedChanged = false +Session.QueuedKeys = [(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...), SessionKeys { grandpa: Public(88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee (5FA9nQDV...)), babe: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), im_online: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)), authority_discovery: Public(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)) })] +Session.Validators = [d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...)] +SmithCert.StorageCertsRemovableOn = [ + 1000 = [(2, 1), (3, 1), (1, 2), (3, 2), (1, 3), (2, 3)] +] +SmithCert.StorageIdtyCertMeta = [ + 1 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } + 2 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } + 3 = IdtyCertMeta { issued_count: 2, next_issuable_on: 0, received_count: 2 } +] +SmithCertCert.sByReceiver = [ + 1 = [(2, 1000), (3, 1000)] + 2 = [(1, 1000), (3, 1000)] + 3 = [(1, 1000), (2, 1000)] +] +SmithMembership.CounterForMembership = Some(3) +SmithMembership.Membership = [ + 1 = MembershipData { expire_on: 1000 } + 2 = MembershipData { expire_on: 1000 } + 3 = MembershipData { expire_on: 1000 } +] +SmithMembership.MembershipsExpireOn = [ + 1000 = [1, 2, 3] +] +SmithMembership.PendingMembership = [ +] +SmithMembership.PendingMembershipsExpireOn = [ +] +Sudo.Key = None +System.Account = [ + 306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20 (5DAAnrj7...) = AccountInfo { nonce: 0, consumers: 0, providers: 0, sufficients: 1, data: AccountData { random_id: Some(0x0303030303030303030303030303030303030303030303030303030303030303), free: 0, reserved: 0, fee_frozen: 0 } } + 6d6f646c70792f74727372790000000000000000000000000000000000000000 (5EYCAe5i...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 0, data: AccountData { random_id: None, free: 200, reserved: 0, fee_frozen: 0 } } + 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48 (5FHneW46...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 1, data: AccountData { random_id: Some(0x0101010101010101010101010101010101010101010101010101010101010101), free: 0, reserved: 0, fee_frozen: 0 } } + 90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22 (5FLSigC9...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 1, data: AccountData { random_id: Some(0x0202020202020202020202020202020202020202020202020202020202020202), free: 0, reserved: 0, fee_frozen: 0 } } + d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d (5GrwvaEF...) = AccountInfo { nonce: 0, consumers: 0, providers: 1, sufficients: 1, data: AccountData { random_id: Some(0x0000000000000000000000000000000000000000000000000000000000000000), free: 0, reserved: 0, fee_frozen: 0 } } + e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e (5HGjWAeF...) = AccountInfo { nonce: 0, consumers: 0, providers: 0, sufficients: 1, data: AccountData { random_id: None, free: 0, reserved: 0, fee_frozen: 0 } } +] +System.AllExtrinsicsLen = None +System.BlockHash = [ + 0 = 0x4545454545454545454545454545454545454545454545454545454545454545 +] +System.BlockWeight = None +System.Digest = None +System.EventCount = None +System.EventTopics = [ +] +System.Events = None +System.ExecutionPhase = None +System.ExtrinsicCount = None +System.ExtrinsicData = [ +] +System.LastRuntimeUpgrade = Some(LastRuntimeUpgradeInfo { spec_version: 400, spec_name: RuntimeString::Owned("gdev") }) +System.Number = Some(5) +System.ParentHash = Some(0x4545454545454545454545454545454545454545454545454545454545454545) +System.UpgradedToTripleRefCount = Some(true) +System.UpgradedToU32RefCount = Some(true) +TechnicalCommittee.Members = [] +TechnicalCommittee.Prime = None +TechnicalCommittee.ProposalCount = 0 +TechnicalCommittee.ProposalOf = [ +] +TechnicalCommittee.Proposals = BoundedVec([], 20) +TechnicalCommittee.Voting = [ +] +Timestamp.DidUpdate = None +Timestamp.Now = 0 +TransactionPayment.NextFeeMultiplier = FixedU128(0.000000000000000000) +TransactionPayment.StorageVersion = None +Treasury.Approvals = BoundedVec([], 100) +Treasury.ProposalCount = 0 +Treasury.Proposals = [ +] +UniversalDividend.CurrentUd = 1000 +UniversalDividend.CurrentUdIndex = 1 +UniversalDividend.MonetaryMass = 0 +UniversalDividend.NextReeval = 100 +UniversalDividend.PastReevals = BoundedVec([(1, 1000)], 4)