From 8d038728158124b38ca66d816423700d2b81a5dc Mon Sep 17 00:00:00 2001 From: cgeek <cem.moreau@gmail.com> Date: Fri, 11 Aug 2023 13:13:02 +0200 Subject: [PATCH] feat: dc-dump first commit --- Cargo.lock | 305 +++-- client/dump/Cargo.toml | 153 +++ client/dump/src/assert.rs | 52 + client/dump/src/checker.rs | 74 ++ client/dump/src/iterative.rs | 145 ++ client/dump/src/key.rs | 1176 +++++++++++++++++ client/dump/src/lib.rs | 25 + client/dump/src/private.rs | 131 ++ client/dump/src/runtime.rs | 37 + client/dump/tests/simple_test.expected.txt | 181 +++ runtime/gdev/Cargo.toml | 1 + runtime/gdev/tests/integration_tests.rs | 31 + ...storage_with_run_to_block.b.2.expected.txt | 244 ++++ ...storage_with_run_to_block.b.3.expected.txt | 244 ++++ ...storage_with_run_to_block.b.4.expected.txt | 251 ++++ ...storage_with_run_to_block.b.5.expected.txt | 254 ++++ 16 files changed, 3216 insertions(+), 88 deletions(-) create mode 100644 client/dump/Cargo.toml create mode 100644 client/dump/src/assert.rs create mode 100644 client/dump/src/checker.rs create mode 100644 client/dump/src/iterative.rs create mode 100644 client/dump/src/key.rs create mode 100644 client/dump/src/lib.rs create mode 100644 client/dump/src/private.rs create mode 100644 client/dump/src/runtime.rs create mode 100644 client/dump/tests/simple_test.expected.txt create mode 100644 runtime/gdev/tests/values_storage_with_run_to_block.b.2.expected.txt create mode 100644 runtime/gdev/tests/values_storage_with_run_to_block.b.3.expected.txt create mode 100644 runtime/gdev/tests/values_storage_with_run_to_block.b.4.expected.txt create mode 100644 runtime/gdev/tests/values_storage_with_run_to_block.b.5.expected.txt diff --git a/Cargo.lock b/Cargo.lock index d00e4ff66..bc5e69343 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -319,7 +319,7 @@ checksum = "677d1d8ab452a3936018a687b20e6f7cf5363d713b732b8884001317b0e48aa3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -791,11 +791,11 @@ version = "3.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" dependencies = [ - "heck 0.4.0", + "heck 0.4.1", "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -804,11 +804,11 @@ version = "4.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0177313f9f02afc995627906bbd8967e2be069f5261954222dac78290c2b9014" dependencies = [ - "heck 0.4.0", + "heck 0.4.1", "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -858,8 +858,8 @@ version = "6.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e621e7e86c46fd8a14c32c6ae3cb95656621b4743a27d0cffedb831d46e7ad21" dependencies = [ - "strum", - "strum_macros", + "strum 0.24.1", + "strum_macros 0.24.3", "unicode-width", ] @@ -1201,7 +1201,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" dependencies = [ "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -1260,7 +1260,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn", + "syn 1.0.107", "synthez", ] @@ -1341,7 +1341,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn", + "syn 1.0.107", ] [[package]] @@ -1358,7 +1358,7 @@ checksum = "3e7e2adeb6a0d4a282e581096b06e1791532b7d576dcde5ccd9382acf55db8e6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -1382,7 +1382,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 1.0.107", ] [[package]] @@ -1393,7 +1393,7 @@ checksum = "7618812407e9402654622dd402b0a89dff9ba93badd6540781526117b92aab7e" dependencies = [ "darling_core", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -1419,7 +1419,83 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5bbed42daaa95e780b60a50546aa345b8413a1e46f9a40a12907d3598f038db" dependencies = [ "data-encoding", - "syn", + "syn 1.0.107", +] + +[[package]] +name = "dc-dump" +version = "1.0.0" +dependencies = [ + "bytes", + "common-runtime", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "gdev-runtime", + "hex-literal", + "log", + "maplit", + "pallet-atomic-swap", + "pallet-authority-discovery", + "pallet-authority-members", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-certification", + "pallet-collective", + "pallet-duniter-account", + "pallet-duniter-test-parameters", + "pallet-duniter-wot", + "pallet-grandpa", + "pallet-identity", + "pallet-im-online", + "pallet-membership", + "pallet-multisig", + "pallet-offences", + "pallet-oneshot-account", + "pallet-preimage", + "pallet-provide-randomness", + "pallet-proxy", + "pallet-scheduler", + "pallet-session", + "pallet-session-benchmarking", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-treasury", + "pallet-universal-dividend", + "pallet-upgrade-origin", + "pallet-utility", + "parity-scale-codec", + "pretty_assertions", + "scale-info", + "serde", + "serde_derive", + "serde_json", + "sp-api", + "sp-arithmetic", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-consensus-vrf", + "sp-core", + "sp-finality-grandpa", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-membership", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-storage", + "sp-transaction-pool", + "sp-version", + "strum 0.25.0", + "strum_macros 0.25.2", ] [[package]] @@ -1439,7 +1515,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -1450,9 +1526,15 @@ checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + [[package]] name = "difflib" version = "0.4.0" @@ -1693,7 +1775,7 @@ checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -1796,10 +1878,10 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ - "heck 0.4.0", + "heck 0.4.1", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -1885,7 +1967,7 @@ checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", "synstructure", ] @@ -2201,7 +2283,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -2213,7 +2295,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -2223,7 +2305,7 @@ source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9 dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -2419,7 +2501,7 @@ checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -2553,6 +2635,7 @@ name = "gdev-runtime" version = "3.0.0" dependencies = [ "common-runtime", + "dc-dump", "frame-benchmarking", "frame-executive", "frame-support", @@ -2704,7 +2787,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn", + "syn 1.0.107", "textwrap 0.12.1", "thiserror", "typed-builder", @@ -2718,7 +2801,7 @@ checksum = "41973d4c45f7a35af8753ba3457cc99d406d863941fd7f52663cff54a5ab99b3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -2818,7 +2901,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn", + "syn 1.0.107", ] [[package]] @@ -2829,7 +2912,7 @@ checksum = "e56b093bfda71de1da99758b036f4cc811fd2511c8a76f75680e9ffbd2bb4251" dependencies = [ "graphql_client_codegen", "proc-macro2", - "syn", + "syn 1.0.107", ] [[package]] @@ -2981,9 +3064,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" @@ -3273,7 +3356,7 @@ checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -3605,7 +3688,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -4024,9 +4107,9 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0eddc4497a8b5a506013c40e8189864f9c3a00db2b25671f428ae9007f3ba32" dependencies = [ - "heck 0.4.0", + "heck 0.4.1", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -4480,7 +4563,7 @@ dependencies = [ "cfg-if 1.0.0", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -4539,7 +4622,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.107", "synstructure", ] @@ -4589,7 +4672,7 @@ checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -4894,7 +4977,7 @@ checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -4962,7 +5045,7 @@ checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -5185,7 +5268,7 @@ dependencies = [ "num_enum", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -5628,7 +5711,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -5659,7 +5742,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" dependencies = [ "proc-macro2", - "syn", + "syn 1.0.107", "synstructure", ] @@ -5819,7 +5902,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -5860,7 +5943,7 @@ checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -6002,6 +6085,16 @@ dependencies = [ "termtree", ] +[[package]] +name = "pretty_assertions" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +dependencies = [ + "diff", + "yansi", +] + [[package]] name = "prettyplease" version = "0.1.22" @@ -6009,7 +6102,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c8992a85d8e93a28bdf76137db888d3874e3b230dee5ed8bebac4c9f7617773" dependencies = [ "proc-macro2", - "syn", + "syn 1.0.107", ] [[package]] @@ -6045,7 +6138,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.107", "version_check", ] @@ -6062,9 +6155,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.49" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -6103,7 +6196,7 @@ checksum = "66a455fbcb954c1a7decf3c586e860fd7889cddf4b8e164be736dbac95a953cd" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -6123,7 +6216,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb5320c680de74ba083512704acb90fe00f28f79207286a848e730c45dd73ed6" dependencies = [ "bytes", - "heck 0.4.0", + "heck 0.4.1", "itertools", "lazy_static", "log", @@ -6133,7 +6226,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn", + "syn 1.0.107", "tempfile", "which", ] @@ -6161,7 +6254,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -6202,9 +6295,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.23" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -6380,7 +6473,7 @@ checksum = "9f9c0c92af03644e4806106281fe2e068ac5bc0ae74a707266d06ea27bccee5f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -6772,7 +6865,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -7674,7 +7767,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -7777,7 +7870,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -7856,7 +7949,7 @@ dependencies = [ "heck 0.3.3", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -7868,7 +7961,7 @@ dependencies = [ "heck 0.3.3", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -7975,14 +8068,14 @@ checksum = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] name = "serde_json" -version = "1.0.91" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" dependencies = [ "itoa", "ryu", @@ -8227,7 +8320,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -8468,7 +8561,7 @@ dependencies = [ "proc-macro2", "quote", "sp-core-hashing", - "syn", + "syn 1.0.107", ] [[package]] @@ -8487,7 +8580,7 @@ source = "git+https://github.com/duniter/substrate?branch=duniter-substrate-v0.9 dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -8567,7 +8660,7 @@ dependencies = [ "lazy_static", "sp-core", "sp-runtime", - "strum", + "strum 0.24.1", ] [[package]] @@ -8688,7 +8781,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -8884,7 +8977,7 @@ dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -8984,7 +9077,7 @@ dependencies = [ "memchr", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -9012,20 +9105,39 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros", + "strum_macros 0.24.3", ] +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" + [[package]] name = "strum_macros" version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "heck 0.4.0", + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.107", +] + +[[package]] +name = "strum_macros" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8d03b598d3d0fff69bf533ee3ef19b8eeb342729596df84bcc7e1f96ec4059" +dependencies = [ + "heck 0.4.1", "proc-macro2", "quote", "rustversion", - "syn", + "syn 2.0.28", ] [[package]] @@ -9106,7 +9218,7 @@ dependencies = [ "cargo_metadata", "filetime", "sp-maybe-compressed-blob", - "strum", + "strum 0.24.1", "tempfile", "toml", "walkdir", @@ -9153,7 +9265,7 @@ source = "git+https://github.com/duniter/subxt.git?branch=duniter-substrate-v0.9 dependencies = [ "darling", "frame-metadata", - "heck 0.4.0", + "heck 0.4.1", "hex", "jsonrpsee 0.16.2", "parity-scale-codec", @@ -9162,7 +9274,7 @@ dependencies = [ "quote", "scale-info", "subxt-metadata", - "syn", + "syn 1.0.107", "tokio", ] @@ -9174,7 +9286,7 @@ dependencies = [ "darling", "proc-macro-error", "subxt-codegen", - "syn", + "syn 1.0.107", ] [[package]] @@ -9199,6 +9311,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "synstructure" version = "0.12.6" @@ -9207,7 +9330,7 @@ checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", "unicode-xid", ] @@ -9217,7 +9340,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "033178d0acccffc5490021657006e6a8dd586ee9dc6f7c24e7608b125e568cb1" dependencies = [ - "syn", + "syn 1.0.107", "synthez-codegen", "synthez-core", ] @@ -9228,7 +9351,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69263462a40e46960f070618e20094ce69e783a41f86e54bc75545136afd597a" dependencies = [ - "syn", + "syn 1.0.107", "synthez-core", ] @@ -9241,7 +9364,7 @@ dependencies = [ "proc-macro2", "quote", "sealed 0.3.0", - "syn", + "syn 1.0.107", ] [[package]] @@ -9364,7 +9487,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -9464,7 +9587,7 @@ checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -9549,7 +9672,7 @@ checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -9740,7 +9863,7 @@ checksum = "f85f4270f4f449a3f2c0cf2aecc8415e388a597aeacc7d55fc749c5c968c8533" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -10029,7 +10152,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.107", "wasm-bindgen-shared", ] @@ -10063,7 +10186,7 @@ checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -10638,6 +10761,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + [[package]] name = "yap" version = "0.7.2" @@ -10661,7 +10790,7 @@ checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", "synstructure", ] diff --git a/client/dump/Cargo.toml b/client/dump/Cargo.toml new file mode 100644 index 000000000..7f079820a --- /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 000000000..3c59295e5 --- /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 000000000..561aeeb96 --- /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 000000000..7642c4ccb --- /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 000000000..02f047fef --- /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 000000000..daf4ae8ef --- /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 000000000..d16ae56ff --- /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 000000000..33628a0f6 --- /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 000000000..208f4c2fd --- /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 8c8fd7788..1aedfed06 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 22d1fb056..d3806c7c9 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 000000000..5f27e0977 --- /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 000000000..b1509750a --- /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 000000000..b4971a26e --- /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 000000000..0aa23d4f5 --- /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) -- GitLab