diff --git a/implementors/clap_builder/derive/trait.Args.js b/implementors/clap_builder/derive/trait.Args.js
index 54633376139..4c5e035c914 100644
--- a/implementors/clap_builder/derive/trait.Args.js
+++ b/implementors/clap_builder/derive/trait.Args.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl Args for Command"],["impl Args for Command"],["impl Args for LiveState"],["impl Args for Command"],["impl Args for Command"],["impl Args for SharedParams"],["impl Args for TryRuntime"],["impl Args for Command"]]
+"try_runtime_core":[["impl Args for Command"],["impl Args for Command"],["impl Args for Command"],["impl Args for Command"],["impl Args for Command"],["impl Args for SharedParams"],["impl Args for Command"],["impl Args for LiveState"],["impl Args for TryRuntime"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/clap_builder/derive/trait.CommandFactory.js b/implementors/clap_builder/derive/trait.CommandFactory.js
index 8a33554744e..134ba22dcee 100644
--- a/implementors/clap_builder/derive/trait.CommandFactory.js
+++ b/implementors/clap_builder/derive/trait.CommandFactory.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl CommandFactory for Command"],["impl CommandFactory for TryRuntime"],["impl CommandFactory for Command"],["impl CommandFactory for Command"],["impl CommandFactory for Command"],["impl CommandFactory for Command"],["impl CommandFactory for SharedParams"]]
+"try_runtime_core":[["impl CommandFactory for Chain"],["impl CommandFactory for SharedParams"],["impl CommandFactory for TryRuntime"],["impl CommandFactory for Command"],["impl CommandFactory for Command"],["impl CommandFactory for Command"],["impl CommandFactory for Command"],["impl CommandFactory for Command"],["impl CommandFactory for Command"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/clap_builder/derive/trait.FromArgMatches.js b/implementors/clap_builder/derive/trait.FromArgMatches.js
index b9e57dd4e8d..e55ceb35eab 100644
--- a/implementors/clap_builder/derive/trait.FromArgMatches.js
+++ b/implementors/clap_builder/derive/trait.FromArgMatches.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl FromArgMatches for Command"],["impl FromArgMatches for Command"],["impl FromArgMatches for LiveState"],["impl FromArgMatches for Command"],["impl FromArgMatches for State"],["impl FromArgMatches for Command"],["impl FromArgMatches for Action"],["impl FromArgMatches for TryRuntime"],["impl FromArgMatches for SharedParams"],["impl FromArgMatches for Command"]]
+"try_runtime_core":[["impl FromArgMatches for Command"],["impl FromArgMatches for Command"],["impl FromArgMatches for Chain"],["impl FromArgMatches for LiveState"],["impl FromArgMatches for TryRuntime"],["impl FromArgMatches for State"],["impl FromArgMatches for Command"],["impl FromArgMatches for Command"],["impl FromArgMatches for Command"],["impl FromArgMatches for Command"],["impl FromArgMatches for SharedParams"],["impl FromArgMatches for Action"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/clap_builder/derive/trait.Parser.js b/implementors/clap_builder/derive/trait.Parser.js
index 9772aebf1e2..e8406208eb2 100644
--- a/implementors/clap_builder/derive/trait.Parser.js
+++ b/implementors/clap_builder/derive/trait.Parser.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl Parser for Command"],["impl Parser for SharedParams"],["impl Parser for Command"],["impl Parser for Command"],["impl Parser for TryRuntime"],["impl Parser for Command"],["impl Parser for Command"]]
+"try_runtime_core":[["impl Parser for SharedParams"],["impl Parser for Command"],["impl Parser for TryRuntime"],["impl Parser for Command"],["impl Parser for Command"],["impl Parser for Command"],["impl Parser for Command"],["impl Parser for Command"],["impl Parser for Chain"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/clap_builder/derive/trait.Subcommand.js b/implementors/clap_builder/derive/trait.Subcommand.js
index a4f7f188c93..67a75cf97e1 100644
--- a/implementors/clap_builder/derive/trait.Subcommand.js
+++ b/implementors/clap_builder/derive/trait.Subcommand.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl Subcommand for Action"],["impl Subcommand for State"]]
+"try_runtime_core":[["impl Subcommand for Action"],["impl Subcommand for State"],["impl Subcommand for Chain"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/clone/trait.Clone.js b/implementors/core/clone/trait.Clone.js
index 2f551caf511..cde4ba1c2ec 100644
--- a/implementors/core/clone/trait.Clone.js
+++ b/implementors/core/clone/trait.Clone.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl Clone for Command"],["impl Clone for SharedParams"],["impl Clone for Command"],["impl Clone for Command"],["impl Clone for Command"],["impl Clone for Action"],["impl Clone for LiveState"],["impl Clone for TryRuntime"],["impl Clone for Command"],["impl Clone for State"],["impl Clone for Runtime"]]
+"try_runtime_core":[["impl Clone for Command"],["impl Clone for TryRuntime"],["impl Clone for Chain"],["impl Clone for State"],["impl Clone for Command"],["impl Clone for LiveState"],["impl Clone for Command"],["impl Clone for Command"],["impl Clone for Action"],["impl Clone for Runtime"],["impl Clone for SharedParams"],["impl Clone for Command"],["impl Clone for Command"],["impl Clone for ChainIter"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/fmt/trait.Debug.js b/implementors/core/fmt/trait.Debug.js
index bbc952e7c06..5a13c30bd09 100644
--- a/implementors/core/fmt/trait.Debug.js
+++ b/implementors/core/fmt/trait.Debug.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl Debug for Command"],["impl Debug for LiveState"],["impl Debug for Command"],["impl Debug for TryRuntime"],["impl Debug for Runtime"],["impl Debug for Action"],["impl Debug for Command"],["impl Debug for Command"],["impl Debug for Command"],["impl Debug for State"],["impl Debug for SharedParams"]]
+"try_runtime_core":[["impl Debug for Command"],["impl Debug for ChainIter"],["impl Debug for Chain"],["impl Debug for State"],["impl Debug for Command"],["impl Debug for Action"],["impl Debug for LiveState"],["impl Debug for Command"],["impl Debug for Command"],["impl Debug for Command"],["impl Debug for Runtime"],["impl Debug for TryRuntime"],["impl Debug for SharedParams"],["impl Debug for Command"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/fmt/trait.Display.js b/implementors/core/fmt/trait.Display.js
new file mode 100644
index 00000000000..e76720b24d9
--- /dev/null
+++ b/implementors/core/fmt/trait.Display.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"try_runtime_core":[["impl Display for Chain"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/iter/traits/double_ended/trait.DoubleEndedIterator.js b/implementors/core/iter/traits/double_ended/trait.DoubleEndedIterator.js
new file mode 100644
index 00000000000..bdc07e80912
--- /dev/null
+++ b/implementors/core/iter/traits/double_ended/trait.DoubleEndedIterator.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"try_runtime_core":[["impl DoubleEndedIterator for ChainIter"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/iter/traits/exact_size/trait.ExactSizeIterator.js b/implementors/core/iter/traits/exact_size/trait.ExactSizeIterator.js
new file mode 100644
index 00000000000..075604ddedd
--- /dev/null
+++ b/implementors/core/iter/traits/exact_size/trait.ExactSizeIterator.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"try_runtime_core":[["impl ExactSizeIterator for ChainIter"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/iter/traits/iterator/trait.Iterator.js b/implementors/core/iter/traits/iterator/trait.Iterator.js
new file mode 100644
index 00000000000..09ea251d290
--- /dev/null
+++ b/implementors/core/iter/traits/iterator/trait.Iterator.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"try_runtime_core":[["impl Iterator for ChainIter"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/marker/trait.Freeze.js b/implementors/core/marker/trait.Freeze.js
index a42ad47badd..5c4c61fcd26 100644
--- a/implementors/core/marker/trait.Freeze.js
+++ b/implementors/core/marker/trait.Freeze.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl Freeze for Command",1,["try_runtime_core::commands::create_snapshot::Command"]],["impl Freeze for Command",1,["try_runtime_core::commands::execute_block::Command"]],["impl Freeze for Command",1,["try_runtime_core::commands::follow_chain::Command"]],["impl Freeze for Command",1,["try_runtime_core::commands::offchain_worker::Command"]],["impl Freeze for Command",1,["try_runtime_core::commands::on_runtime_upgrade::Command"]],["impl Freeze for TryRuntime",1,["try_runtime_core::commands::TryRuntime"]],["impl Freeze for Action",1,["try_runtime_core::commands::Action"]],["impl Freeze for SharedParams",1,["try_runtime_core::shared_parameters::SharedParams"]],["impl Freeze for Runtime",1,["try_runtime_core::shared_parameters::Runtime"]],["impl Freeze for LiveState",1,["try_runtime_core::state::LiveState"]],["impl Freeze for State",1,["try_runtime_core::state::State"]],["impl Freeze for RefTimeInfo",1,["try_runtime_core::RefTimeInfo"]]]
+"try_runtime_core":[["impl Freeze for Command",1,["try_runtime_core::commands::create_snapshot::Command"]],["impl Freeze for Command",1,["try_runtime_core::commands::execute_block::Command"]],["impl Freeze for Command",1,["try_runtime_core::commands::fast_forward::Command"]],["impl Freeze for Command",1,["try_runtime_core::commands::follow_chain::Command"]],["impl Freeze for Command",1,["try_runtime_core::commands::offchain_worker::Command"]],["impl Freeze for Command",1,["try_runtime_core::commands::on_runtime_upgrade::Command"]],["impl Freeze for TryRuntime",1,["try_runtime_core::commands::TryRuntime"]],["impl Freeze for Action",1,["try_runtime_core::commands::Action"]],["impl Freeze for Chain",1,["try_runtime_core::inherent_provider::Chain"]],["impl Freeze for ChainIter",1,["try_runtime_core::inherent_provider::ChainIter"]],["impl Freeze for SharedParams",1,["try_runtime_core::shared_parameters::SharedParams"]],["impl Freeze for Runtime",1,["try_runtime_core::shared_parameters::Runtime"]],["impl Freeze for LiveState",1,["try_runtime_core::state::LiveState"]],["impl Freeze for State",1,["try_runtime_core::state::State"]],["impl Freeze for RefTimeInfo",1,["try_runtime_core::RefTimeInfo"]]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/marker/trait.Send.js b/implementors/core/marker/trait.Send.js
index cfda31c6e74..22a95951ac2 100644
--- a/implementors/core/marker/trait.Send.js
+++ b/implementors/core/marker/trait.Send.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl Send for Command",1,["try_runtime_core::commands::create_snapshot::Command"]],["impl Send for Command",1,["try_runtime_core::commands::execute_block::Command"]],["impl Send for Command",1,["try_runtime_core::commands::follow_chain::Command"]],["impl Send for Command",1,["try_runtime_core::commands::offchain_worker::Command"]],["impl Send for Command",1,["try_runtime_core::commands::on_runtime_upgrade::Command"]],["impl Send for TryRuntime",1,["try_runtime_core::commands::TryRuntime"]],["impl Send for Action",1,["try_runtime_core::commands::Action"]],["impl Send for SharedParams",1,["try_runtime_core::shared_parameters::SharedParams"]],["impl Send for Runtime",1,["try_runtime_core::shared_parameters::Runtime"]],["impl Send for LiveState",1,["try_runtime_core::state::LiveState"]],["impl Send for State",1,["try_runtime_core::state::State"]],["impl Send for RefTimeInfo",1,["try_runtime_core::RefTimeInfo"]]]
+"try_runtime_core":[["impl Send for Command",1,["try_runtime_core::commands::create_snapshot::Command"]],["impl Send for Command",1,["try_runtime_core::commands::execute_block::Command"]],["impl Send for Command",1,["try_runtime_core::commands::fast_forward::Command"]],["impl Send for Command",1,["try_runtime_core::commands::follow_chain::Command"]],["impl Send for Command",1,["try_runtime_core::commands::offchain_worker::Command"]],["impl Send for Command",1,["try_runtime_core::commands::on_runtime_upgrade::Command"]],["impl Send for TryRuntime",1,["try_runtime_core::commands::TryRuntime"]],["impl Send for Action",1,["try_runtime_core::commands::Action"]],["impl Send for Chain",1,["try_runtime_core::inherent_provider::Chain"]],["impl Send for ChainIter",1,["try_runtime_core::inherent_provider::ChainIter"]],["impl Send for SharedParams",1,["try_runtime_core::shared_parameters::SharedParams"]],["impl Send for Runtime",1,["try_runtime_core::shared_parameters::Runtime"]],["impl Send for LiveState",1,["try_runtime_core::state::LiveState"]],["impl Send for State",1,["try_runtime_core::state::State"]],["impl Send for RefTimeInfo",1,["try_runtime_core::RefTimeInfo"]]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/marker/trait.Sync.js b/implementors/core/marker/trait.Sync.js
index a485d7a7b16..ed3c46fab32 100644
--- a/implementors/core/marker/trait.Sync.js
+++ b/implementors/core/marker/trait.Sync.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl Sync for Command",1,["try_runtime_core::commands::create_snapshot::Command"]],["impl Sync for Command",1,["try_runtime_core::commands::execute_block::Command"]],["impl Sync for Command",1,["try_runtime_core::commands::follow_chain::Command"]],["impl Sync for Command",1,["try_runtime_core::commands::offchain_worker::Command"]],["impl Sync for Command",1,["try_runtime_core::commands::on_runtime_upgrade::Command"]],["impl Sync for TryRuntime",1,["try_runtime_core::commands::TryRuntime"]],["impl Sync for Action",1,["try_runtime_core::commands::Action"]],["impl Sync for SharedParams",1,["try_runtime_core::shared_parameters::SharedParams"]],["impl Sync for Runtime",1,["try_runtime_core::shared_parameters::Runtime"]],["impl Sync for LiveState",1,["try_runtime_core::state::LiveState"]],["impl Sync for State",1,["try_runtime_core::state::State"]],["impl Sync for RefTimeInfo",1,["try_runtime_core::RefTimeInfo"]]]
+"try_runtime_core":[["impl Sync for Command",1,["try_runtime_core::commands::create_snapshot::Command"]],["impl Sync for Command",1,["try_runtime_core::commands::execute_block::Command"]],["impl Sync for Command",1,["try_runtime_core::commands::fast_forward::Command"]],["impl Sync for Command",1,["try_runtime_core::commands::follow_chain::Command"]],["impl Sync for Command",1,["try_runtime_core::commands::offchain_worker::Command"]],["impl Sync for Command",1,["try_runtime_core::commands::on_runtime_upgrade::Command"]],["impl Sync for TryRuntime",1,["try_runtime_core::commands::TryRuntime"]],["impl Sync for Action",1,["try_runtime_core::commands::Action"]],["impl Sync for Chain",1,["try_runtime_core::inherent_provider::Chain"]],["impl Sync for ChainIter",1,["try_runtime_core::inherent_provider::ChainIter"]],["impl Sync for SharedParams",1,["try_runtime_core::shared_parameters::SharedParams"]],["impl Sync for Runtime",1,["try_runtime_core::shared_parameters::Runtime"]],["impl Sync for LiveState",1,["try_runtime_core::state::LiveState"]],["impl Sync for State",1,["try_runtime_core::state::State"]],["impl Sync for RefTimeInfo",1,["try_runtime_core::RefTimeInfo"]]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/marker/trait.Unpin.js b/implementors/core/marker/trait.Unpin.js
index e4dd6989084..bdbff54f631 100644
--- a/implementors/core/marker/trait.Unpin.js
+++ b/implementors/core/marker/trait.Unpin.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl Unpin for Command",1,["try_runtime_core::commands::create_snapshot::Command"]],["impl Unpin for Command",1,["try_runtime_core::commands::execute_block::Command"]],["impl Unpin for Command",1,["try_runtime_core::commands::follow_chain::Command"]],["impl Unpin for Command",1,["try_runtime_core::commands::offchain_worker::Command"]],["impl Unpin for Command",1,["try_runtime_core::commands::on_runtime_upgrade::Command"]],["impl Unpin for TryRuntime",1,["try_runtime_core::commands::TryRuntime"]],["impl Unpin for Action",1,["try_runtime_core::commands::Action"]],["impl Unpin for SharedParams",1,["try_runtime_core::shared_parameters::SharedParams"]],["impl Unpin for Runtime",1,["try_runtime_core::shared_parameters::Runtime"]],["impl Unpin for LiveState",1,["try_runtime_core::state::LiveState"]],["impl Unpin for State",1,["try_runtime_core::state::State"]],["impl Unpin for RefTimeInfo",1,["try_runtime_core::RefTimeInfo"]]]
+"try_runtime_core":[["impl Unpin for Command",1,["try_runtime_core::commands::create_snapshot::Command"]],["impl Unpin for Command",1,["try_runtime_core::commands::execute_block::Command"]],["impl Unpin for Command",1,["try_runtime_core::commands::fast_forward::Command"]],["impl Unpin for Command",1,["try_runtime_core::commands::follow_chain::Command"]],["impl Unpin for Command",1,["try_runtime_core::commands::offchain_worker::Command"]],["impl Unpin for Command",1,["try_runtime_core::commands::on_runtime_upgrade::Command"]],["impl Unpin for TryRuntime",1,["try_runtime_core::commands::TryRuntime"]],["impl Unpin for Action",1,["try_runtime_core::commands::Action"]],["impl Unpin for Chain",1,["try_runtime_core::inherent_provider::Chain"]],["impl Unpin for ChainIter",1,["try_runtime_core::inherent_provider::ChainIter"]],["impl Unpin for SharedParams",1,["try_runtime_core::shared_parameters::SharedParams"]],["impl Unpin for Runtime",1,["try_runtime_core::shared_parameters::Runtime"]],["impl Unpin for LiveState",1,["try_runtime_core::state::LiveState"]],["impl Unpin for State",1,["try_runtime_core::state::State"]],["impl Unpin for RefTimeInfo",1,["try_runtime_core::RefTimeInfo"]]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js b/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
index e670114576b..40df6ff8d2f 100644
--- a/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
+++ b/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl RefUnwindSafe for Command",1,["try_runtime_core::commands::create_snapshot::Command"]],["impl RefUnwindSafe for Command",1,["try_runtime_core::commands::execute_block::Command"]],["impl RefUnwindSafe for Command",1,["try_runtime_core::commands::follow_chain::Command"]],["impl RefUnwindSafe for Command",1,["try_runtime_core::commands::offchain_worker::Command"]],["impl RefUnwindSafe for Command",1,["try_runtime_core::commands::on_runtime_upgrade::Command"]],["impl RefUnwindSafe for TryRuntime",1,["try_runtime_core::commands::TryRuntime"]],["impl RefUnwindSafe for Action",1,["try_runtime_core::commands::Action"]],["impl RefUnwindSafe for SharedParams",1,["try_runtime_core::shared_parameters::SharedParams"]],["impl RefUnwindSafe for Runtime",1,["try_runtime_core::shared_parameters::Runtime"]],["impl RefUnwindSafe for LiveState",1,["try_runtime_core::state::LiveState"]],["impl RefUnwindSafe for State",1,["try_runtime_core::state::State"]],["impl RefUnwindSafe for RefTimeInfo",1,["try_runtime_core::RefTimeInfo"]]]
+"try_runtime_core":[["impl RefUnwindSafe for Command",1,["try_runtime_core::commands::create_snapshot::Command"]],["impl RefUnwindSafe for Command",1,["try_runtime_core::commands::execute_block::Command"]],["impl RefUnwindSafe for Command",1,["try_runtime_core::commands::fast_forward::Command"]],["impl RefUnwindSafe for Command",1,["try_runtime_core::commands::follow_chain::Command"]],["impl RefUnwindSafe for Command",1,["try_runtime_core::commands::offchain_worker::Command"]],["impl RefUnwindSafe for Command",1,["try_runtime_core::commands::on_runtime_upgrade::Command"]],["impl RefUnwindSafe for TryRuntime",1,["try_runtime_core::commands::TryRuntime"]],["impl RefUnwindSafe for Action",1,["try_runtime_core::commands::Action"]],["impl RefUnwindSafe for Chain",1,["try_runtime_core::inherent_provider::Chain"]],["impl RefUnwindSafe for ChainIter",1,["try_runtime_core::inherent_provider::ChainIter"]],["impl RefUnwindSafe for SharedParams",1,["try_runtime_core::shared_parameters::SharedParams"]],["impl RefUnwindSafe for Runtime",1,["try_runtime_core::shared_parameters::Runtime"]],["impl RefUnwindSafe for LiveState",1,["try_runtime_core::state::LiveState"]],["impl RefUnwindSafe for State",1,["try_runtime_core::state::State"]],["impl RefUnwindSafe for RefTimeInfo",1,["try_runtime_core::RefTimeInfo"]]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/panic/unwind_safe/trait.UnwindSafe.js b/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
index 4e565360ae6..2d44bf93dc5 100644
--- a/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
+++ b/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl UnwindSafe for Command",1,["try_runtime_core::commands::create_snapshot::Command"]],["impl UnwindSafe for Command",1,["try_runtime_core::commands::execute_block::Command"]],["impl UnwindSafe for Command",1,["try_runtime_core::commands::follow_chain::Command"]],["impl UnwindSafe for Command",1,["try_runtime_core::commands::offchain_worker::Command"]],["impl UnwindSafe for Command",1,["try_runtime_core::commands::on_runtime_upgrade::Command"]],["impl UnwindSafe for TryRuntime",1,["try_runtime_core::commands::TryRuntime"]],["impl UnwindSafe for Action",1,["try_runtime_core::commands::Action"]],["impl UnwindSafe for SharedParams",1,["try_runtime_core::shared_parameters::SharedParams"]],["impl UnwindSafe for Runtime",1,["try_runtime_core::shared_parameters::Runtime"]],["impl UnwindSafe for LiveState",1,["try_runtime_core::state::LiveState"]],["impl UnwindSafe for State",1,["try_runtime_core::state::State"]],["impl UnwindSafe for RefTimeInfo",1,["try_runtime_core::RefTimeInfo"]]]
+"try_runtime_core":[["impl UnwindSafe for Command",1,["try_runtime_core::commands::create_snapshot::Command"]],["impl UnwindSafe for Command",1,["try_runtime_core::commands::execute_block::Command"]],["impl UnwindSafe for Command",1,["try_runtime_core::commands::fast_forward::Command"]],["impl UnwindSafe for Command",1,["try_runtime_core::commands::follow_chain::Command"]],["impl UnwindSafe for Command",1,["try_runtime_core::commands::offchain_worker::Command"]],["impl UnwindSafe for Command",1,["try_runtime_core::commands::on_runtime_upgrade::Command"]],["impl UnwindSafe for TryRuntime",1,["try_runtime_core::commands::TryRuntime"]],["impl UnwindSafe for Action",1,["try_runtime_core::commands::Action"]],["impl UnwindSafe for Chain",1,["try_runtime_core::inherent_provider::Chain"]],["impl UnwindSafe for ChainIter",1,["try_runtime_core::inherent_provider::ChainIter"]],["impl UnwindSafe for SharedParams",1,["try_runtime_core::shared_parameters::SharedParams"]],["impl UnwindSafe for Runtime",1,["try_runtime_core::shared_parameters::Runtime"]],["impl UnwindSafe for LiveState",1,["try_runtime_core::state::LiveState"]],["impl UnwindSafe for State",1,["try_runtime_core::state::State"]],["impl UnwindSafe for RefTimeInfo",1,["try_runtime_core::RefTimeInfo"]]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/str/traits/trait.FromStr.js b/implementors/core/str/traits/trait.FromStr.js
index 63ac1947eb0..52139a4b6d7 100644
--- a/implementors/core/str/traits/trait.FromStr.js
+++ b/implementors/core/str/traits/trait.FromStr.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"try_runtime_core":[["impl FromStr for Runtime"]]
+"try_runtime_core":[["impl FromStr for Runtime"],["impl FromStr for Chain"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/strum/trait.IntoEnumIterator.js b/implementors/strum/trait.IntoEnumIterator.js
new file mode 100644
index 00000000000..cb5a3345864
--- /dev/null
+++ b/implementors/strum/trait.IntoEnumIterator.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"try_runtime_core":[["impl IntoEnumIterator for Chain"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/try_runtime_core/inherent_provider/trait.InherentProvider.js b/implementors/try_runtime_core/inherent_provider/trait.InherentProvider.js
new file mode 100644
index 00000000000..d047903f786
--- /dev/null
+++ b/implementors/try_runtime_core/inherent_provider/trait.InherentProvider.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"try_runtime_core":[]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/search-index.js b/search-index.js
index ee9c3f16f2b..376cd4520cd 100644
--- a/search-index.js
+++ b/search-index.js
@@ -1,6 +1,6 @@
var searchIndex = JSON.parse('{\
"try_runtime":{"doc":"Try-runtime","t":"FF","n":["init_env","main"],"q":[[0,"try_runtime"]],"d":["",""],"i":[0,0],"f":[[[]],[[]]],"c":[],"p":[]},\
-"try_runtime_core":{"doc":"","t":"DLLALLLLLLLLLLLLLLLMAALLLLLLMLENNNNNDLLMLLLLLLLLLLLLLLALLLLLLALLALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLAALLMLLLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLMLLLLLLLLLLLLLLFMLLLLLLLLLLDLLLMLLLLLLLLLLLLLLLLLLLLLLLLLFMLLLMLLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLMFMLLLMLLLLLLMLDLLLLLLLLLLLLLLLLLLLLLMLLLLLLLFMLLLLLLLLLLDLLLLLMLLLLLLLLLLLLLLLLLLLLLLLMFMLLLLLLLLLLNNEDLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLLLLLMLLLLLLLLLLLLLLMMLLLLLLLLLLLLLLLLLLMMNDNELLMLLLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLLLLLLLMLLMM","n":["RefTimeInfo","borrow","borrow_mut","commands","deref","deref_mut","drop","from","from_mut","from_mut","from_ref","from_ref","init","into","into_any","into_any_arc","into_any_rc","into_mut","into_ref","max","shared_parameters","state","try_from","try_into","type_id","type_name","unchecked_into","unique_saturated_into","used","vzip","Action","CreateSnapshot","ExecuteBlock","FollowChain","OffchainWorker","OnRuntimeUpgrade","TryRuntime","__clone_box","__clone_box","action","augment_args","augment_args_for_update","augment_subcommands","augment_subcommands_for_update","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","command","command_for_update","create_snapshot","deref","deref","deref_mut","deref_mut","drop","drop","execute_block","fmt","fmt","follow_chain","from","from","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","from_mut","from_mut","from_mut","from_mut","from_ref","from_ref","from_ref","from_ref","group_id","has_subcommand","init","init","into","into","into_any","into_any","into_any_arc","into_any_arc","into_any_rc","into_any_rc","into_mut","into_mut","into_ref","into_ref","offchain_worker","on_runtime_upgrade","run","run","shared","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","type_name","type_name","unchecked_into","unchecked_into","unique_saturated_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","vzip","vzip","Command","__clone_box","augment_args","augment_args_for_update","borrow","borrow_mut","clone","clone_into","command","command_for_update","deref","deref_mut","drop","fmt","from","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_ref","from_ref","group_id","init","into","into_any","into_any_arc","into_any_rc","into_mut","into_ref","run","snapshot_path","to_owned","try_from","try_into","type_id","type_name","unchecked_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","vzip","Command","__clone_box","augment_args","augment_args_for_update","block_ws_uri","borrow","borrow_mut","clone","clone_into","command","command_for_update","deref","deref_mut","drop","fmt","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_ref","from_ref","group_id","init","into","into_any","into_any_arc","into_any_rc","into_mut","into_ref","run","state","to_owned","try_from","try_into","try_state","type_id","type_name","unchecked_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","vzip","Command","__clone_box","augment_args","augment_args_for_update","borrow","borrow_mut","clone","clone_into","command","command_for_update","deref","deref_mut","drop","fmt","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_ref","from_ref","group_id","init","into","into_any","into_any_arc","into_any_rc","into_mut","into_ref","keep_connection","run","state_root_check","to_owned","try_from","try_into","try_state","type_id","type_name","unchecked_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","uri","vzip","Command","__clone_box","augment_args","augment_args_for_update","borrow","borrow_mut","clone","clone_into","command","command_for_update","deref","deref_mut","drop","fmt","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_ref","from_ref","group_id","header_ws_uri","init","into","into_any","into_any_arc","into_any_rc","into_mut","into_ref","run","state","to_owned","try_from","try_into","type_id","type_name","unchecked_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","vzip","Command","__clone_box","augment_args","augment_args_for_update","borrow","borrow_mut","checks","clone","clone_into","command","command_for_update","deref","deref_mut","drop","fmt","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_ref","from_ref","group_id","init","into","into_any","into_any_arc","into_any_rc","into_mut","into_ref","no_weight_warnings","run","state","to_owned","try_from","try_into","type_id","type_name","unchecked_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","vzip","Existing","Path","Runtime","SharedParams","__clone_box","__clone_box","augment_args","augment_args_for_update","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","command","command_for_update","deref","deref","deref_mut","deref_mut","drop","drop","export_proof","fmt","fmt","from","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_mut","from_mut","from_ref","from_ref","from_ref","from_ref","from_str","group_id","heap_pages","init","init","into","into","into_any","into_any","into_any_arc","into_any_arc","into_any_rc","into_any_rc","into_mut","into_mut","into_ref","into_ref","overwrite_state_version","runtime","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","type_name","type_name","unchecked_into","unchecked_into","unique_saturated_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","vzip","vzip","wasm_method","wasmtime_instantiation_strategy","Live","LiveState","Snap","State","__clone_box","__clone_box","at","augment_args","augment_args_for_update","augment_subcommands","augment_subcommands_for_update","borrow","borrow","borrow_mut","borrow_mut","child_tree","clone","clone","clone_into","clone_into","deref","deref","deref_mut","deref_mut","drop","drop","fmt","fmt","from","from","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","from_mut","from_mut","from_mut","from_mut","from_ref","from_ref","from_ref","from_ref","group_id","has_subcommand","init","init","into","into","into_any","into_any","into_any_arc","into_any_arc","into_any_rc","into_any_rc","into_mut","into_mut","into_ref","into_ref","pallet","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","type_name","type_name","unchecked_into","unchecked_into","unique_saturated_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","uri","vzip","vzip","path","snapshot_path"],"q":[[0,"try_runtime_core"],[30,"try_runtime_core::commands"],[120,"try_runtime_core::commands::create_snapshot"],[162,"try_runtime_core::commands::execute_block"],[205,"try_runtime_core::commands::follow_chain"],[249,"try_runtime_core::commands::offchain_worker"],[291,"try_runtime_core::commands::on_runtime_upgrade"],[334,"try_runtime_core::shared_parameters"],[412,"try_runtime_core::state"],[492,"try_runtime_core::state::State"]],"d":["","","","","","","","Returns the argument unchanged.","Get a mutable reference to the inner from the outer.","","Get a reference to the inner from the outer.","","","Calls U::from(self).","","","","","","","","","","","","","","","","","Possible actions of try-runtime.","Create snapshot files.","Executes the given block against some state.","Follow the given chain’s finalized blocks and apply all …","Executes the offchain worker hooks of a given block …","Execute the migrations of the given runtime","Ready to use, vanilla command combining common actions.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","Get a mutable reference to the inner from the outer.","","Get a mutable reference to the inner from the outer.","","Get a reference to the inner from the outer.","Get a reference to the inner from the outer.","","","","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Configurations for run.","","","","","","","","","","","","","","Returns the argument unchanged.","The source of the snapshot. Must be a remote node.","","","Get a mutable reference to the inner from the outer.","","","Get a reference to the inner from the outer.","","","Calls U::from(self).","","","","","","Runs the create_snapshot command.","The snapshot path to write to.","","","","","","","","","","","Configurations for run.","","","","The ws uri from which to fetch the block.","","","","","","","","","","","Returns the argument unchanged.","","","","Get a mutable reference to the inner from the outer.","Get a reference to the inner from the outer.","","","","Calls U::from(self).","","","","","","","The state type to use.","","","","Which try-state targets to execute when running this …","","","","","","","","Configurations for run.","","","","","","","","","","","","","","Returns the argument unchanged.","","","","Get a mutable reference to the inner from the outer.","Get a reference to the inner from the outer.","","","","Calls U::from(self).","","","","","","If present, a single connection to a node will be kept and …","","If set, then the state root check is enabled.","","","","Which try-state targets to execute when running this …","","","","","","","The url to connect to.","","Configuration for run.","","","","","","","","","","","","","","Returns the argument unchanged.","","","Get a mutable reference to the inner from the outer.","","Get a reference to the inner from the outer.","","","The ws uri from which to fetch the header.","","Calls U::from(self).","","","","","","","The state type to use.","","","","","","","","","","","Configuration for run.","","","","","","Select which optional checks to perform. Selects all when …","","","","","","","","","Returns the argument unchanged.","","","","Get a mutable reference to the inner from the outer.","","Get a reference to the inner from the outer.","","","Calls U::from(self).","","","","","","Whether to assume that the runtime is a relay chain …","","The state type to use.","","","","","","","","","","","Use the code of the remote node, or the snapshot.","Use the given path to the wasm binary file.","","Shared parameters of the try-runtime commands","","","","","","","","","","","","","","","","","","","","","Path to a file to export the storage proof into (as a …","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","Get a mutable reference to the inner from the outer.","Get a mutable reference to the inner from the outer.","","","Get a reference to the inner from the outer.","Get a reference to the inner from the outer.","","","","The number of 64KB pages to allocate for Wasm execution. …","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","Overwrite the state_version.","The runtime to use.","","","","","","","","","","","","","","","","","","","Type of wasm execution used.","The WASM instantiation method to use.","Use a live chain as the source of runtime state.","A Live variant for State","Use a state snapshot as the source of runtime state.","The source of runtime state to use.","","","The block hash at which to fetch the state.","","","","","","","","","Fetch the child-keys as well.","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","Get a mutable reference to the inner from the outer.","","","Get a mutable reference to the inner from the outer.","","Get a reference to the inner from the outer.","","Get a reference to the inner from the outer.","","","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","A pallet to scrape. Can be provided multiple times. If …","","","","","","","","","","","","","","","","","","","The url to connect to.","","","","DEPRECATED: use --path instead."],"i":[0,31,31,0,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,0,0,31,31,31,31,31,31,31,31,0,13,13,13,13,13,0,12,13,12,12,12,13,13,12,13,12,13,12,13,12,13,12,12,0,12,13,12,13,12,13,0,12,13,0,12,13,12,13,12,13,12,12,13,13,12,12,13,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,0,0,12,13,12,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,0,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,0,23,23,23,23,23,23,23,23,23,23,23,0,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,0,24,24,24,24,24,24,24,24,24,24,24,24,0,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,0,25,25,25,25,25,25,25,25,25,25,25,25,25,0,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,0,26,26,26,26,26,26,26,26,26,26,26,0,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,0,27,27,27,27,27,27,27,27,27,27,27,28,28,0,0,22,28,22,22,22,28,22,28,22,28,22,28,22,22,22,28,22,28,22,28,22,22,28,22,28,22,22,22,22,28,28,22,22,28,28,28,22,22,22,28,22,28,22,28,22,28,22,28,22,28,22,28,22,22,22,28,22,28,22,28,22,28,22,28,22,28,22,28,22,22,22,28,22,22,30,0,30,0,29,30,29,29,29,30,30,29,30,29,30,29,29,30,29,30,29,30,29,30,29,30,29,30,29,30,29,30,29,30,29,29,30,30,29,29,30,30,29,30,29,30,29,30,29,30,29,30,29,30,29,30,29,30,29,29,30,29,30,29,30,29,30,29,30,29,30,29,30,29,30,29,30,29,29,30,32,32],"f":[0,[[]],[[]],0,[1],[1],[1],[[]],[[]],[[]],[[]],[[]],[[],1],[[]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[[]],[[]],0,0,0,[[],7],[[],7],[[],8],[[],9],[[]],[[]],0,[[]],0,0,0,0,0,0,0,[10],[10],0,[11,11],[11,11],[11,11],[11,11],[[]],[[]],[[]],[[]],[12,12],[13,13],[[]],[[]],[[],11],[[],11],0,[1],[1],[1],[1],[1],[1],0,[[12,14],15],[[13,14],15],0,[[]],[[]],[16,[[7,[12,17]]]],[16,[[7,[13,17]]]],[16,[[7,[12,17]]]],[16,[[7,[13,17]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],[9,20],[[],1],[[],1],[[]],[[]],[[[3,[2]]],[[3,[4,2]]]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[6,[[6,[4]]]],[[]],[[]],[[]],[[]],0,0,[12,21],[[13,22],21],0,[[]],[[]],[[],7],[[],7],[[],7],[[],7],[[],8],[[],8],[[],9],[[],9],[[]],[[]],[[]],[[]],[[12,16],[[7,[17]]]],[[13,16],[[7,[17]]]],[[12,16],[[7,[17]]]],[[13,16],[[7,[17]]]],[[]],[[]],0,[10],[11,11],[11,11],[[]],[[]],[23,23],[[]],[[],11],[[],11],[1],[1],[1],[[23,14],15],[[]],0,[16,[[7,[23,17]]]],[16,[[7,[23,17]]]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],[[],1],[[]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[[]],[[]],[[22,23],21],0,[[]],[[],7],[[],7],[[],8],[[],9],[[]],[[]],[[23,16],[[7,[17]]]],[[23,16],[[7,[17]]]],[[]],0,[10],[11,11],[11,11],0,[[]],[[]],[24,24],[[]],[[],11],[[],11],[1],[1],[1],[[24,14],15],[[]],[16,[[7,[24,17]]]],[16,[[7,[24,17]]]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],[[],1],[[]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[[]],[[]],[[22,24],21],0,[[]],[[],7],[[],7],0,[[],8],[[],9],[[]],[[]],[[24,16],[[7,[17]]]],[[24,16],[[7,[17]]]],[[]],0,[10],[11,11],[11,11],[[]],[[]],[25,25],[[]],[[],11],[[],11],[1],[1],[1],[[25,14],15],[[]],[16,[[7,[25,17]]]],[16,[[7,[25,17]]]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],[[],1],[[]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[[]],[[]],0,[[22,25],21],0,[[]],[[],7],[[],7],0,[[],8],[[],9],[[]],[[]],[[25,16],[[7,[17]]]],[[25,16],[[7,[17]]]],0,[[]],0,[10],[11,11],[11,11],[[]],[[]],[26,26],[[]],[[],11],[[],11],[1],[1],[1],[[26,14],15],[[]],[16,[[7,[26,17]]]],[16,[[7,[26,17]]]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],0,[[],1],[[]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[[]],[[]],[[22,26],21],0,[[]],[[],7],[[],7],[[],8],[[],9],[[]],[[]],[[26,16],[[7,[17]]]],[[26,16],[[7,[17]]]],[[]],0,[10],[11,11],[11,11],[[]],[[]],0,[27,27],[[]],[[],11],[[],11],[1],[1],[1],[[27,14],15],[[]],[16,[[7,[27,17]]]],[16,[[7,[27,17]]]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],[[],1],[[]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[[]],[[]],0,[[22,27],21],0,[[]],[[],7],[[],7],[[],8],[[],9],[[]],[[]],[[27,16],[[7,[17]]]],[[27,16],[[7,[17]]]],[[]],0,0,0,0,[10],[10],[11,11],[11,11],[[]],[[]],[[]],[[]],[22,22],[28,28],[[]],[[]],[[],11],[[],11],[1],[1],[1],[1],[1],[1],0,[[22,14],15],[[28,14],15],[[]],[[]],[16,[[7,[22,17]]]],[16,[[7,[22,17]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[9,[[7,[28]]]],[[],[[19,[18]]]],0,[[],1],[[],1],[[]],[[]],[[[3,[2]]],[[3,[4,2]]]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[6,[[6,[4]]]],[[]],[[]],[[]],[[]],0,0,[[]],[[]],[[],7],[[],7],[[],7],[[],7],[[],8],[[],8],[[],9],[[],9],[[]],[[]],[[]],[[]],[[22,16],[[7,[17]]]],[[22,16],[[7,[17]]]],[[]],[[]],0,0,0,0,0,0,[10],[10],0,[11,11],[11,11],[11,11],[11,11],[[]],[[]],[[]],[[]],0,[29,29],[30,30],[[]],[[]],[1],[1],[1],[1],[1],[1],[[29,14],15],[[30,14],15],[[]],[[]],[16,[[7,[29,17]]]],[16,[[7,[30,17]]]],[16,[[7,[29,17]]]],[16,[[7,[30,17]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],[9,20],[[],1],[[],1],[[]],[[]],[[[3,[2]]],[[3,[4,2]]]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[6,[[6,[4]]]],[[]],[[]],[[]],[[]],0,[[]],[[]],[[],7],[[],7],[[],7],[[],7],[[],8],[[],8],[[],9],[[],9],[[]],[[]],[[]],[[]],[[29,16],[[7,[17]]]],[[30,16],[[7,[17]]]],[[29,16],[[7,[17]]]],[[30,16],[[7,[17]]]],0,[[]],[[]],0,0],"c":[],"p":[[15,"usize"],[3,"Global"],[3,"Box"],[8,"Any"],[3,"Arc"],[3,"Rc"],[4,"Result"],[3,"TypeId"],[15,"str"],[3,"Private"],[3,"Command"],[3,"TryRuntime"],[4,"Action"],[3,"Formatter"],[6,"Result"],[3,"ArgMatches"],[6,"Error"],[3,"Id"],[4,"Option"],[15,"bool"],[6,"Result"],[3,"SharedParams"],[3,"Command"],[3,"Command"],[3,"Command"],[3,"Command"],[3,"Command"],[4,"Runtime"],[3,"LiveState"],[4,"State"],[3,"RefTimeInfo"],[13,"Snap"]]}\
+"try_runtime_core":{"doc":"","t":"DLLALLLLLLLLALLLLLLLMAALLLLLLMLENNNNNNDLLMLLLLLLLLLLLLLLALLLLLLAALLALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLAALLMLLLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLMLLLLLLLLLLLLLLFMLLLLLLLLLLDLLLMLLLLLLLLLLLLLLLLLLLLLLLLLFMLLLMLLLLLLLDLLLMLLMLLLLLLLLLLLLLLLLLLLLLLLMFMMLLLMLLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLMFMLLLMLLLLLLMLDLLLLLLLLLLLLLLLLLLLLLMLLLLLLLFMLLLLLLLLLLDLLLLLMLLLLLLLLLLLLLLLLLLLLLLLMFMLLLLLLLLLLNEDQINNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNEDLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLLLLLMLLLLLLLLLLLLLLMMLLLLLLLLLLLLLLLLLLMMNDNELLMLLLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLLLLLLLMLLMM","n":["RefTimeInfo","borrow","borrow_mut","commands","deref","deref_mut","drop","from","from_mut","from_mut","from_ref","from_ref","inherent_provider","init","into","into_any","into_any_arc","into_any_rc","into_mut","into_ref","max","shared_parameters","state","try_from","try_into","type_id","type_name","unchecked_into","unique_saturated_into","used","vzip","Action","CreateSnapshot","ExecuteBlock","FastForward","FollowChain","OffchainWorker","OnRuntimeUpgrade","TryRuntime","__clone_box","__clone_box","action","augment_args","augment_args_for_update","augment_subcommands","augment_subcommands_for_update","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","command","command_for_update","create_snapshot","deref","deref","deref_mut","deref_mut","drop","drop","execute_block","fast_forward","fmt","fmt","follow_chain","from","from","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","from_mut","from_mut","from_mut","from_mut","from_ref","from_ref","from_ref","from_ref","group_id","has_subcommand","init","init","into","into","into_any","into_any","into_any_arc","into_any_arc","into_any_rc","into_any_rc","into_mut","into_mut","into_ref","into_ref","offchain_worker","on_runtime_upgrade","run","run","shared","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","type_name","type_name","unchecked_into","unchecked_into","unique_saturated_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","vzip","vzip","Command","__clone_box","augment_args","augment_args_for_update","borrow","borrow_mut","clone","clone_into","command","command_for_update","deref","deref_mut","drop","fmt","from","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_ref","from_ref","group_id","init","into","into_any","into_any_arc","into_any_rc","into_mut","into_ref","run","snapshot_path","to_owned","try_from","try_into","type_id","type_name","unchecked_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","vzip","Command","__clone_box","augment_args","augment_args_for_update","block_ws_uri","borrow","borrow_mut","clone","clone_into","command","command_for_update","deref","deref_mut","drop","fmt","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_ref","from_ref","group_id","init","into","into_any","into_any_arc","into_any_rc","into_mut","into_ref","run","state","to_owned","try_from","try_into","try_state","type_id","type_name","unchecked_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","vzip","Command","__clone_box","augment_args","augment_args_for_update","block_ws_uri","borrow","borrow_mut","chain","clone","clone_into","command","command_for_update","deref","deref_mut","drop","fmt","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_ref","from_ref","group_id","init","into","into_any","into_any_arc","into_any_rc","into_mut","into_ref","n_blocks","run","run_migrations","state","to_owned","try_from","try_into","try_state","type_id","type_name","unchecked_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","vzip","Command","__clone_box","augment_args","augment_args_for_update","borrow","borrow_mut","clone","clone_into","command","command_for_update","deref","deref_mut","drop","fmt","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_ref","from_ref","group_id","init","into","into_any","into_any_arc","into_any_rc","into_mut","into_ref","keep_connection","run","state_root_check","to_owned","try_from","try_into","try_state","type_id","type_name","unchecked_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","uri","vzip","Command","__clone_box","augment_args","augment_args_for_update","borrow","borrow_mut","clone","clone_into","command","command_for_update","deref","deref_mut","drop","fmt","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_ref","from_ref","group_id","header_ws_uri","init","into","into_any","into_any_arc","into_any_rc","into_mut","into_ref","run","state","to_owned","try_from","try_into","type_id","type_name","unchecked_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","vzip","Command","__clone_box","augment_args","augment_args_for_update","borrow","borrow_mut","checks","clone","clone_into","command","command_for_update","deref","deref_mut","drop","fmt","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_ref","from_ref","group_id","init","into","into_any","into_any_arc","into_any_rc","into_mut","into_ref","no_weight_warnings","run","state","to_owned","try_from","try_into","type_id","type_name","unchecked_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","vzip","AlephZero","Chain","ChainIter","Err","InherentProvider","Kusama","Polkadot","Rococo","SubstrateKitchenSink","SubstrateNodeTemplate","Westend","__clone_box","__clone_box","augment_subcommands","augment_subcommands_for_update","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","command","command_for_update","deref","deref","deref_mut","deref_mut","drop","drop","fmt","fmt","fmt","from","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_mut","from_mut","from_ref","from_ref","from_ref","from_ref","from_str","get_inherent_providers_and_pre_digest","get_inherent_providers_and_pre_digest","has_subcommand","init","init","into","into","into_any","into_any","into_any_arc","into_any_arc","into_any_rc","into_any_rc","into_iter","into_mut","into_mut","into_ref","into_ref","iter","len","len","next","next_back","nth","par_bridge","progress_with","size_hint","to_owned","to_owned","to_string","try_collect","try_from","try_from","try_into","try_into","type_id","type_id","type_name","type_name","unchecked_into","unchecked_into","unique_saturated_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","vzip","vzip","Existing","Path","Runtime","SharedParams","__clone_box","__clone_box","augment_args","augment_args_for_update","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","command","command_for_update","deref","deref","deref_mut","deref_mut","drop","drop","export_proof","fmt","fmt","from","from","from_arg_matches","from_arg_matches_mut","from_mut","from_mut","from_mut","from_mut","from_ref","from_ref","from_ref","from_ref","from_str","group_id","heap_pages","init","init","into","into","into_any","into_any","into_any_arc","into_any_arc","into_any_rc","into_any_rc","into_mut","into_mut","into_ref","into_ref","overwrite_state_version","runtime","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","type_name","type_name","unchecked_into","unchecked_into","unique_saturated_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches_mut","vzip","vzip","wasm_method","wasmtime_instantiation_strategy","Live","LiveState","Snap","State","__clone_box","__clone_box","at","augment_args","augment_args_for_update","augment_subcommands","augment_subcommands_for_update","borrow","borrow","borrow_mut","borrow_mut","child_tree","clone","clone","clone_into","clone_into","deref","deref","deref_mut","deref_mut","drop","drop","fmt","fmt","from","from","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","from_mut","from_mut","from_mut","from_mut","from_ref","from_ref","from_ref","from_ref","group_id","has_subcommand","init","init","into","into","into_any","into_any","into_any_arc","into_any_arc","into_any_rc","into_any_rc","into_mut","into_mut","into_ref","into_ref","pallet","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","type_name","type_name","unchecked_into","unchecked_into","unique_saturated_into","unique_saturated_into","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","uri","vzip","vzip","path","snapshot_path"],"q":[[0,"try_runtime_core"],[31,"try_runtime_core::commands"],[123,"try_runtime_core::commands::create_snapshot"],[165,"try_runtime_core::commands::execute_block"],[208,"try_runtime_core::commands::fast_forward"],[254,"try_runtime_core::commands::follow_chain"],[298,"try_runtime_core::commands::offchain_worker"],[340,"try_runtime_core::commands::on_runtime_upgrade"],[383,"try_runtime_core::inherent_provider"],[477,"try_runtime_core::shared_parameters"],[555,"try_runtime_core::state"],[635,"try_runtime_core::state::State"]],"d":["","","","","","","","Returns the argument unchanged.","Get a mutable reference to the inner from the outer.","","Get a reference to the inner from the outer.","","TODO: Docs","","Calls U::from(self).","","","","","","","","","","","","","","","","","Possible actions of try-runtime.","Create snapshot files.","Executes the given block against some state.","Executes a runtime upgrade (optional), then mines a number …","Follow the given chain’s finalized blocks and apply all …","Executes the offchain worker hooks of a given block …","Execute the migrations of the given runtime","Ready to use, vanilla command combining common actions.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","Get a mutable reference to the inner from the outer.","Get a mutable reference to the inner from the outer.","","","Get a reference to the inner from the outer.","Get a reference to the inner from the outer.","","","","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Configurations for run.","","","","","","","","","","","","","","Returns the argument unchanged.","The source of the snapshot. Must be a remote node.","","","Get a mutable reference to the inner from the outer.","","","Get a reference to the inner from the outer.","","","Calls U::from(self).","","","","","","Runs the create_snapshot command.","The snapshot path to write to.","","","","","","","","","","","Configurations for run.","","","","The ws uri from which to fetch the block.","","","","","","","","","","","Returns the argument unchanged.","","","","Get a mutable reference to the inner from the outer.","","Get a reference to the inner from the outer.","","","Calls U::from(self).","","","","","","","The state type to use.","","","","Which try-state targets to execute when running this …","","","","","","","","Configuration for run.","","","","The ws uri from which to fetch the block.","","","Chain","","","","","","","","","Returns the argument unchanged.","","","","Get a mutable reference to the inner from the outer.","","Get a reference to the inner from the outer.","","","Calls U::from(self).","","","","","","How many empty blocks should be processed.","","Whether to run pending migrations before fast-forwarding.","The state type to use.","","","","Which try-state targets to execute when running this …","","","","","","","","Configurations for run.","","","","","","","","","","","","","","Returns the argument unchanged.","","","Get a mutable reference to the inner from the outer.","","","Get a reference to the inner from the outer.","","","Calls U::from(self).","","","","","","If present, a single connection to a node will be kept and …","","If set, then the state root check is enabled.","","","","Which try-state targets to execute when running this …","","","","","","","The url to connect to.","","Configuration for run.","","","","","","","","","","","","","","Returns the argument unchanged.","","","","Get a mutable reference to the inner from the outer.","Get a reference to the inner from the outer.","","","The ws uri from which to fetch the header.","","Calls U::from(self).","","","","","","","The state type to use.","","","","","","","","","","","Configuration for run.","","","","","","Select which optional checks to perform. Selects all when …","","","","","","","","","Returns the argument unchanged.","","","","Get a mutable reference to the inner from the outer.","","Get a reference to the inner from the outer.","","","Calls U::from(self).","","","","","","Whether to assume that the runtime is a relay chain …","","The state type to use.","","","","","","","","","","","","Chains that have InherentProvider implemented.","An iterator over the variants of Chain","","Trait for providing the inherent data and digest items for …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","Get a mutable reference to the inner from the outer.","","","Get a mutable reference to the inner from the outer.","","Get a reference to the inner from the outer.","","Get a reference to the inner from the outer.","","","","","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Use the code of the remote node, or the snapshot.","Use the given path to the wasm binary file.","","Shared parameters of the try-runtime commands","","","","","","","","","","","","","","","","","","","","","Path to a file to export the storage proof into (as a …","","","Returns the argument unchanged.","Returns the argument unchanged.","","","Get a mutable reference to the inner from the outer.","","","Get a mutable reference to the inner from the outer.","","Get a reference to the inner from the outer.","Get a reference to the inner from the outer.","","","","The number of 64KB pages to allocate for Wasm execution. …","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","Overwrite the state_version.","The runtime to use.","","","","","","","","","","","","","","","","","","","Type of wasm execution used.","The WASM instantiation method to use.","Use a live chain as the source of runtime state.","A Live variant for State","Use a state snapshot as the source of runtime state.","The source of runtime state to use.","","","The block hash at which to fetch the state.","","","","","","","","","Fetch the child-keys as well.","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","Get a mutable reference to the inner from the outer.","","","Get a mutable reference to the inner from the outer.","Get a reference to the inner from the outer.","","Get a reference to the inner from the outer.","","","","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","A pallet to scrape. Can be provided multiple times. If …","","","","","","","","","","","","","","","","","","","The url to connect to.","","","","DEPRECATED: use --path instead."],"i":[0,40,40,0,40,40,40,40,40,40,40,40,0,40,40,40,40,40,40,40,40,0,0,40,40,40,40,40,40,40,40,0,13,13,13,13,13,13,0,12,13,12,12,12,13,13,12,13,12,13,12,13,12,13,12,12,0,12,13,12,13,12,13,0,0,12,13,0,12,13,12,13,12,13,12,12,13,13,12,12,13,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,0,0,12,13,12,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,0,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,0,23,23,23,23,23,23,23,23,23,23,23,0,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,0,24,24,24,24,24,24,24,24,24,24,24,24,0,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,0,25,25,25,25,25,25,25,25,25,25,25,25,25,0,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,0,26,26,26,26,26,26,26,26,26,26,26,26,26,0,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,0,27,27,27,27,27,27,27,27,27,27,27,0,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,0,28,28,28,28,28,28,28,28,28,28,28,29,0,0,41,0,29,29,29,29,29,29,29,30,29,29,29,30,29,30,29,30,29,30,29,29,29,30,29,30,29,30,29,29,30,29,30,29,29,29,29,30,30,29,29,30,30,29,41,29,29,29,30,29,30,29,30,29,30,29,30,30,29,30,29,30,29,30,30,30,30,30,30,30,30,29,30,29,30,29,30,29,30,29,30,29,30,29,30,29,30,29,29,29,30,37,37,0,0,22,37,22,22,22,37,22,37,22,37,22,37,22,22,22,37,22,37,22,37,22,22,37,22,37,22,22,22,22,37,37,22,22,37,37,37,22,22,22,37,22,37,22,37,22,37,22,37,22,37,22,37,22,22,22,37,22,37,22,37,22,37,22,37,22,37,22,37,22,22,22,37,22,22,39,0,39,0,38,39,38,38,38,39,39,38,39,38,39,38,38,39,38,39,38,39,38,39,38,39,38,39,38,39,38,39,38,39,38,38,39,39,38,38,39,39,38,39,38,39,38,39,38,39,38,39,38,39,38,39,38,39,38,38,39,38,39,38,39,38,39,38,39,38,39,38,39,38,39,38,39,38,38,39,42,42],"f":[0,[[]],[[]],0,[1],[1],[1],[[]],[[]],[[]],[[]],[[]],0,[[],1],[[]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[[]],[[]],0,0,0,[[],7],[[],7],[[],8],[[],9],[[]],[[]],0,[[]],0,0,0,0,0,0,0,0,[10],[10],0,[11,11],[11,11],[11,11],[11,11],[[]],[[]],[[]],[[]],[12,12],[13,13],[[]],[[]],[[],11],[[],11],0,[1],[1],[1],[1],[1],[1],0,0,[[12,14],15],[[13,14],15],0,[[]],[[]],[16,[[7,[12,17]]]],[16,[[7,[13,17]]]],[16,[[7,[12,17]]]],[16,[[7,[13,17]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],[9,20],[[],1],[[],1],[[]],[[]],[[[3,[2]]],[[3,[4,2]]]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[6,[[6,[4]]]],[[]],[[]],[[]],[[]],0,0,[12,21],[[13,22],21],0,[[]],[[]],[[],7],[[],7],[[],7],[[],7],[[],8],[[],8],[[],9],[[],9],[[]],[[]],[[]],[[]],[[12,16],[[7,[17]]]],[[13,16],[[7,[17]]]],[[12,16],[[7,[17]]]],[[13,16],[[7,[17]]]],[[]],[[]],0,[10],[11,11],[11,11],[[]],[[]],[23,23],[[]],[[],11],[[],11],[1],[1],[1],[[23,14],15],[[]],0,[16,[[7,[23,17]]]],[16,[[7,[23,17]]]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],[[],1],[[]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[[]],[[]],[[22,23],21],0,[[]],[[],7],[[],7],[[],8],[[],9],[[]],[[]],[[23,16],[[7,[17]]]],[[23,16],[[7,[17]]]],[[]],0,[10],[11,11],[11,11],0,[[]],[[]],[24,24],[[]],[[],11],[[],11],[1],[1],[1],[[24,14],15],[[]],[16,[[7,[24,17]]]],[16,[[7,[24,17]]]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],[[],1],[[]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[[]],[[]],[[22,24],21],0,[[]],[[],7],[[],7],0,[[],8],[[],9],[[]],[[]],[[24,16],[[7,[17]]]],[[24,16],[[7,[17]]]],[[]],0,[10],[11,11],[11,11],0,[[]],[[]],0,[25,25],[[]],[[],11],[[],11],[1],[1],[1],[[25,14],15],[[]],[16,[[7,[25,17]]]],[16,[[7,[25,17]]]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],[[],1],[[]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[[]],[[]],0,[[22,25],21],0,0,[[]],[[],7],[[],7],0,[[],8],[[],9],[[]],[[]],[[25,16],[[7,[17]]]],[[25,16],[[7,[17]]]],[[]],0,[10],[11,11],[11,11],[[]],[[]],[26,26],[[]],[[],11],[[],11],[1],[1],[1],[[26,14],15],[[]],[16,[[7,[26,17]]]],[16,[[7,[26,17]]]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],[[],1],[[]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[[]],[[]],0,[[22,26],21],0,[[]],[[],7],[[],7],0,[[],8],[[],9],[[]],[[]],[[26,16],[[7,[17]]]],[[26,16],[[7,[17]]]],0,[[]],0,[10],[11,11],[11,11],[[]],[[]],[27,27],[[]],[[],11],[[],11],[1],[1],[1],[[27,14],15],[[]],[16,[[7,[27,17]]]],[16,[[7,[27,17]]]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],0,[[],1],[[]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[[]],[[]],[[22,27],21],0,[[]],[[],7],[[],7],[[],8],[[],9],[[]],[[]],[[27,16],[[7,[17]]]],[[27,16],[[7,[17]]]],[[]],0,[10],[11,11],[11,11],[[]],[[]],0,[28,28],[[]],[[],11],[[],11],[1],[1],[1],[[28,14],15],[[]],[16,[[7,[28,17]]]],[16,[[7,[28,17]]]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],[[],1],[[]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[[]],[[]],0,[[22,28],21],0,[[]],[[],7],[[],7],[[],8],[[],9],[[]],[[]],[[28,16],[[7,[17]]]],[[28,16],[[7,[17]]]],[[]],0,0,0,0,0,0,0,0,0,0,0,[10],[10],[11,11],[11,11],[[]],[[]],[[]],[[]],[29,29],[30,30],[[]],[[]],[[],11],[[],11],[1],[1],[1],[1],[1],[1],[[29,14],[[7,[31]]]],[[29,14],15],[[30,14],15],[[]],[[]],[16,[[7,[29,17]]]],[16,[[7,[29,17]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[9,[[7,[29]]]],[19,7],[[29,19],7],[9,20],[[],1],[[],1],[[]],[[]],[[[3,[2]]],[[3,[4,2]]]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[6,[[6,[4]]]],[[]],[[]],[[]],[[]],[[]],[[],30],[30,1],[[],1],[30,19],[30,19],[[30,1],19],[[],32],[33,34],[30],[[]],[[]],[[],35],[[],[[7,[36]]]],[[],7],[[],7],[[],7],[[],7],[[],8],[[],8],[[],9],[[],9],[[]],[[]],[[]],[[]],[[29,16],[[7,[17]]]],[[29,16],[[7,[17]]]],[[]],[[]],0,0,0,0,[10],[10],[11,11],[11,11],[[]],[[]],[[]],[[]],[22,22],[37,37],[[]],[[]],[[],11],[[],11],[1],[1],[1],[1],[1],[1],0,[[22,14],15],[[37,14],15],[[]],[[]],[16,[[7,[22,17]]]],[16,[[7,[22,17]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[9,[[7,[37]]]],[[],[[19,[18]]]],0,[[],1],[[],1],[[]],[[]],[[[3,[2]]],[[3,[4,2]]]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[6,[[6,[4]]]],[[]],[[]],[[]],[[]],0,0,[[]],[[]],[[],7],[[],7],[[],7],[[],7],[[],8],[[],8],[[],9],[[],9],[[]],[[]],[[]],[[]],[[22,16],[[7,[17]]]],[[22,16],[[7,[17]]]],[[]],[[]],0,0,0,0,0,0,[10],[10],0,[11,11],[11,11],[11,11],[11,11],[[]],[[]],[[]],[[]],0,[38,38],[39,39],[[]],[[]],[1],[1],[1],[1],[1],[1],[[38,14],15],[[39,14],15],[[]],[[]],[16,[[7,[38,17]]]],[16,[[7,[39,17]]]],[16,[[7,[38,17]]]],[16,[[7,[39,17]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[[19,[18]]]],[9,20],[[],1],[[],1],[[]],[[]],[[[3,[2]]],[[3,[4,2]]]],[[[3,[2]]],[[3,[4,2]]]],[5,[[5,[4]]]],[5,[[5,[4]]]],[6,[[6,[4]]]],[6,[[6,[4]]]],[[]],[[]],[[]],[[]],0,[[]],[[]],[[],7],[[],7],[[],7],[[],7],[[],8],[[],8],[[],9],[[],9],[[]],[[]],[[]],[[]],[[38,16],[[7,[17]]]],[[39,16],[[7,[17]]]],[[38,16],[[7,[17]]]],[[39,16],[[7,[17]]]],0,[[]],[[]],0,0],"c":[],"p":[[15,"usize"],[3,"Global"],[3,"Box"],[8,"Any"],[3,"Arc"],[3,"Rc"],[4,"Result"],[3,"TypeId"],[15,"str"],[3,"Private"],[3,"Command"],[3,"TryRuntime"],[4,"Action"],[3,"Formatter"],[6,"Result"],[3,"ArgMatches"],[6,"Error"],[3,"Id"],[4,"Option"],[15,"bool"],[6,"Result"],[3,"SharedParams"],[3,"Command"],[3,"Command"],[3,"Command"],[3,"Command"],[3,"Command"],[3,"Command"],[4,"Chain"],[3,"ChainIter"],[3,"Error"],[3,"IterBridge"],[3,"ProgressBar"],[3,"ProgressBarIter"],[3,"String"],[3,"BoundedVec"],[4,"Runtime"],[3,"LiveState"],[4,"State"],[3,"RefTimeInfo"],[8,"InherentProvider"],[13,"Snap"]]}\
}');
if (typeof window !== 'undefined' && window.initSearch) {window.initSearch(searchIndex)};
if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
diff --git a/source-files.js b/source-files.js
index 222849a2709..3d1f7fef7f5 100644
--- a/source-files.js
+++ b/source-files.js
@@ -1,5 +1,5 @@
var sourcesIndex = JSON.parse('{\
"try_runtime":["",[],["main.rs"]],\
-"try_runtime_core":["",[["commands",[],["create_snapshot.rs","execute_block.rs","follow_chain.rs","mod.rs","offchain_worker.rs","on_runtime_upgrade.rs"]]],["lib.rs","parse.rs","shared_parameters.rs","state.rs"]]\
+"try_runtime_core":["",[["commands",[],["create_snapshot.rs","execute_block.rs","fast_forward.rs","follow_chain.rs","mod.rs","offchain_worker.rs","on_runtime_upgrade.rs"]]],["inherent_provider.rs","lib.rs","parse.rs","shared_parameters.rs","state.rs"]]\
}');
createSourceSidebar();
diff --git a/src/try_runtime/main.rs.html b/src/try_runtime/main.rs.html
index e1243cdc553..db362c846e1 100644
--- a/src/try_runtime/main.rs.html
+++ b/src/try_runtime/main.rs.html
@@ -326,6 +326,9 @@
326327328
+329
+330
+331
// This file is part of try-runtime-cli.
// Copyright (C) Parity Technologies (UK) Ltd.
@@ -414,6 +417,8 @@
//!
//! * [`Action::OnRuntimeUpgrade`]: execute all the [`OnRuntimeUpgrade`] hooks.
//! * [`Action::ExecuteBlock`]: re-execute the given block.
+//! * [`Action::FastForward`]: execute [`OnRuntimeUpgrade`] hooks, then fast-forward the chain a
+//! given number of blocks while checking try-state invarients.
//! * [`Action::OffchainWorker`]: re-execute the given block's offchain worker code path.
//! * [`Action::FollowChain`]: continuously execute the blocks of a remote chain on top of a given
//! runtime.
@@ -620,6 +625,7 @@
//! [`Action::ExecuteBlock`]: ../try_runtime_core/commands/enum.Action.html#variant.ExecuteBlock
//! [`Action::OffchainWorker`]: ../try_runtime_core/commands/enum.Action.html#variant.OffchainWorker
//! [`Action::CreateSnapshot`]: ../try_runtime_core/commands/enum.Action.html#variant.CreateSnapshot
+//! [`Action::FastForward`]: ../try_runtime_core/commands/enum.Action.html#variant.FastForward
//! [`SharedParams`]: ../try_runtime_core/shared_parameters/struct.SharedParams.html
//! [`SharedParams::runtime`]: ../try_runtime_core/shared_parameters/struct.SharedParams.html#structfield.runtime
//! [`SharedParams::overwrite_state_version`]: ../try_runtime_core/shared_parameters/struct.SharedParams.html#structfield.overwrite_state_version
diff --git a/src/try_runtime_core/commands/execute_block.rs.html b/src/try_runtime_core/commands/execute_block.rs.html
index 7b0ba9d23b3..d37f6d1588c 100644
--- a/src/try_runtime_core/commands/execute_block.rs.html
+++ b/src/try_runtime_core/commands/execute_block.rs.html
@@ -311,7 +311,7 @@
)
.encode();
- let _ = state_machine_call_with_proof::<HostFns>(
+ let _ = state_machine_call_with_proof::<Block, HostFns>(
&ext,
&executor,
"TryRuntime_execute_block",
diff --git a/src/try_runtime_core/commands/fast_forward.rs.html b/src/try_runtime_core/commands/fast_forward.rs.html
new file mode 100644
index 00000000000..f00c11a7da8
--- /dev/null
+++ b/src/try_runtime_core/commands/fast_forward.rs.html
@@ -0,0 +1,607 @@
+fast_forward.rs - source
// This file is part of Substrate.
+
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use std::{fmt::Debug, str::FromStr};
+
+use parity_scale_codec::{Decode, Encode};
+use sc_cli::Result;
+use sc_executor::{sp_wasm_interface::HostFunctions, WasmExecutor};
+use serde::de::DeserializeOwned;
+use sp_api::HashingFor;
+use sp_core::H256;
+use sp_inherents::InherentData;
+use sp_runtime::{
+ traits::{Header, NumberFor, One, Saturating},
+ Digest,
+};
+use sp_state_machine::TestExternalities;
+use substrate_rpc_client::{ws_client, ChainApi};
+
+use crate::{
+ build_executor, full_extensions,
+ inherent_provider::{Chain, InherentProvider},
+ rpc_err_handler,
+ state::{LiveState, State},
+ state_machine_call, state_machine_call_with_proof, BlockT, SharedParams,
+};
+
+/// Configuration for [`run`].
+#[derive(Debug, Clone, clap::Parser)]
+pub struct Command {
+ /// How many empty blocks should be processed.
+ #[arg(long)]
+ pub n_blocks: u64,
+
+ /// Chain
+ #[arg(long)]
+ pub chain: Chain,
+
+ /// The ws uri from which to fetch the block.
+ ///
+ /// If `state` is `Live`, this is ignored. Otherwise, it must not be empty.
+ #[arg(long, value_parser = crate::parse::url)]
+ pub block_ws_uri: Option<String>,
+
+ /// Which try-state targets to execute when running this command.
+ ///
+ /// Expected values:
+ /// - `all`
+ /// - `none`
+ /// - A comma separated list of pallets, as per pallet names in `construct_runtime!()` (e.g.
+ /// `Staking, System`).
+ /// - `rr-[x]` where `[x]` is a number. Then, the given number of pallets are checked in a
+ /// round-robin fashion.
+ #[arg(long, default_value = "all")]
+ pub try_state: frame_try_runtime::TryStateSelect,
+
+ /// Whether to run pending migrations before fast-forwarding.
+ #[arg(long, default_value = "true")]
+ pub run_migrations: bool,
+
+ /// The state type to use.
+ #[command(subcommand)]
+ pub state: State,
+}
+
+impl Command {
+ fn block_ws_uri(&self) -> &str {
+ match self.state {
+ State::Live(LiveState { ref uri, .. }) => uri,
+ _ => self
+ .block_ws_uri
+ .as_ref()
+ .expect("Either `--block-uri` must be provided, or state must be `live`"),
+ }
+ }
+}
+
+/// Read the block number corresponding to `hash` with an RPC call to `ws_uri`.
+async fn get_block_number<Block: BlockT>(
+ hash: Block::Hash,
+ ws_uri: &str,
+) -> Result<NumberFor<Block>>
+where
+ Block::Header: DeserializeOwned,
+{
+ let rpc = ws_client(ws_uri).await?;
+ Ok(
+ ChainApi::<(), Block::Hash, Block::Header, ()>::header(&rpc, Some(hash))
+ .await
+ .map_err(rpc_err_handler)
+ .and_then(|maybe_header| maybe_header.ok_or("header_not_found").map(|h| *h.number()))?,
+ )
+}
+
+/// Call `method` with `data` and return the result. `externalities` will not change.
+fn dry_call<T: Decode, Block: BlockT, HostFns: HostFunctions>(
+ externalities: &TestExternalities<HashingFor<Block>>,
+ executor: &WasmExecutor<HostFns>,
+ method: &'static str,
+ data: &[u8],
+) -> Result<T> {
+ let (_, result) = state_machine_call::<Block, HostFns>(
+ externalities,
+ executor,
+ method,
+ data,
+ full_extensions(executor.clone()),
+ )?;
+
+ Ok(<T>::decode(&mut &*result)?)
+}
+
+/// Call `method` with `data` and actually save storage changes to `externalities`.
+async fn call<Block: BlockT, HostFns: HostFunctions>(
+ externalities: &mut TestExternalities<HashingFor<Block>>,
+ executor: &WasmExecutor<HostFns>,
+ method: &'static str,
+ data: &[u8],
+) -> Result<()> {
+ let (mut changes, _) = state_machine_call::<Block, HostFns>(
+ externalities,
+ executor,
+ method,
+ data,
+ full_extensions(executor.clone()),
+ )?;
+
+ let storage_changes =
+ changes.drain_storage_changes(&externalities.backend, externalities.state_version)?;
+
+ externalities.backend.apply_transaction(
+ storage_changes.transaction_storage_root,
+ storage_changes.transaction,
+ );
+
+ Ok(())
+}
+
+/// Produces next block containing only inherents.
+async fn produce_next_block<Block: BlockT, HostFns: HostFunctions>(
+ externalities: &mut TestExternalities<HashingFor<Block>>,
+ executor: &WasmExecutor<HostFns>,
+ parent_height: NumberFor<Block>,
+ parent_hash: Block::Hash,
+ inherent_provider: &dyn InherentProvider<Err = String>,
+ previous_block_building_info: Option<(InherentData, Digest)>,
+) -> Result<(Block, Option<(InherentData, Digest)>)> {
+ let (inherent_data_provider, pre_digest) =
+ inherent_provider.get_inherent_providers_and_pre_digest(previous_block_building_info)?;
+
+ let inherent_data = inherent_data_provider
+ .create_inherent_data()
+ .await
+ .map_err(|s| sc_cli::Error::Input(s.to_string()))?;
+ let digest = Digest { logs: pre_digest };
+
+ let header = Block::Header::new(
+ parent_height + One::one(),
+ Default::default(),
+ Default::default(),
+ parent_hash,
+ digest.clone(),
+ );
+
+ call::<Block, _>(
+ externalities,
+ executor,
+ "Core_initialize_block",
+ &header.encode(),
+ )
+ .await?;
+
+ let extrinsics = dry_call::<Vec<Block::Extrinsic>, Block, _>(
+ externalities,
+ executor,
+ "BlockBuilder_inherent_extrinsics",
+ &inherent_data.encode(),
+ )?;
+
+ for xt in &extrinsics {
+ call::<Block, _>(
+ externalities,
+ executor,
+ "BlockBuilder_apply_extrinsic",
+ &xt.encode(),
+ )
+ .await?;
+ }
+
+ let header = dry_call::<Block::Header, Block, _>(
+ externalities,
+ executor,
+ "BlockBuilder_finalize_block",
+ &[0u8; 0],
+ )?;
+
+ call::<Block, _>(
+ externalities,
+ executor,
+ "BlockBuilder_finalize_block",
+ &[0u8; 0],
+ )
+ .await?;
+
+ Ok((
+ Block::new(header, extrinsics),
+ Some((inherent_data, digest)),
+ ))
+}
+
+pub async fn run<Block, HostFns>(shared: SharedParams, command: Command) -> Result<()>
+where
+ Block: BlockT<Hash = H256> + DeserializeOwned,
+ Block::Header: DeserializeOwned,
+ <Block::Hash as FromStr>::Err: Debug,
+ NumberFor<Block>: FromStr,
+ <NumberFor<Block> as FromStr>::Err: Debug,
+ HostFns: HostFunctions,
+{
+ let executor = build_executor::<HostFns>(&shared);
+ let ext = command
+ .state
+ .to_ext::<Block, HostFns>(&shared, &executor, None, true)
+ .await?;
+
+ if command.run_migrations {
+ log::info!("Running migrations...");
+ state_machine_call_with_proof::<Block, HostFns>(
+ &ext,
+ &executor,
+ "TryRuntime_on_runtime_upgrade",
+ command.try_state.encode().as_ref(),
+ Default::default(), // we don't really need any extensions here.
+ None,
+ )?;
+ }
+
+ log::info!("Fast forwarding {} blocks...", command.n_blocks);
+ let mut last_block_hash = ext.block_hash;
+ let mut last_block_number =
+ get_block_number::<Block>(last_block_hash, command.block_ws_uri()).await?;
+ let mut prev_block_building_info = None;
+
+ let mut ext = ext.inner_ext;
+
+ for _ in 1..=command.n_blocks {
+ // We are saving state before we overwrite it while producing new block.
+ let backend = ext.as_backend();
+
+ log::info!(
+ "Producing new empty block at height {:?}",
+ last_block_number + One::one()
+ );
+
+ let (next_block, new_block_building_info) = produce_next_block::<Block, HostFns>(
+ &mut ext,
+ &executor,
+ last_block_number,
+ last_block_hash,
+ &command.chain,
+ prev_block_building_info,
+ )
+ .await?;
+
+ log::info!("Produced a new block: {:?}", next_block.header());
+
+ // And now we restore previous state.
+ ext.backend = backend;
+
+ let state_root_check = true;
+ let signature_check = true;
+ let payload = (
+ next_block.clone(),
+ state_root_check,
+ signature_check,
+ command.try_state.clone(),
+ )
+ .encode();
+ call::<Block, _>(&mut ext, &executor, "TryRuntime_execute_block", &payload).await?;
+
+ log::info!("Executed the new block");
+
+ prev_block_building_info = new_block_building_info;
+ last_block_hash = next_block.hash();
+ last_block_number.saturating_inc();
+ }
+
+ Ok(())
+}
+
\ No newline at end of file
diff --git a/src/try_runtime_core/commands/follow_chain.rs.html b/src/try_runtime_core/commands/follow_chain.rs.html
index 59744fda2b0..f9fea07a8ca 100644
--- a/src/try_runtime_core/commands/follow_chain.rs.html
+++ b/src/try_runtime_core/commands/follow_chain.rs.html
@@ -208,7 +208,6 @@
208209210
-211
// This file is part of try-runtime-cli.
// Copyright (C) Parity Technologies (UK) Ltd.
@@ -362,7 +361,7 @@
.as_mut()
.expect("state_ext either existed or was just created");
- let result = state_machine_call_with_proof::<HostFns>(
+ let result = state_machine_call_with_proof::<Block, HostFns>(
state_ext,
&executor,
"TryRuntime_execute_block",
@@ -396,7 +395,6 @@
let storage_changes = changes
.drain_storage_changes(
&state_ext.backend,
- &mut Default::default(),
// Note that in case a block contains a runtime upgrade, state version could
// potentially be incorrect here, this is very niche and would only result in
// unaligned roots, so this use case is ignored for now.
diff --git a/src/try_runtime_core/commands/mod.rs.html b/src/try_runtime_core/commands/mod.rs.html
index ba2b50e2d61..f41a053b684 100644
--- a/src/try_runtime_core/commands/mod.rs.html
+++ b/src/try_runtime_core/commands/mod.rs.html
@@ -158,6 +158,18 @@
158159160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
// This file is part of try-runtime-cli.
// Copyright (C) Parity Technologies (UK) Ltd.
@@ -188,6 +200,7 @@
pub mod create_snapshot;
pub mod execute_block;
+pub mod fast_forward;
pub mod follow_chain;
pub mod offchain_worker;
pub mod on_runtime_upgrade;
@@ -279,12 +292,20 @@
///
/// 1. Create a snapshot from a remote node:
///
- /// try-runtime create-snapshot --uri <remote-node-uri> my_state.snap
+ /// try-runtime create-snapshot --uri ws://remote-node-uri my_state.snap
///
/// 2. Utilize the snapshot with `on-runtime-upgrade`:
///
/// try-runtime --runtime ./path/to/runtime.wasm on-runtime-upgrade snap --path my_state.snap
CreateSnapshot(create_snapshot::Command),
+
+ /// Executes a runtime upgrade (optional), then mines a number of blocks while performing
+ /// try-state checks.
+ ///
+ /// The try-state checks are performed using the `TryRuntime_execute_block` runtime api.
+ ///
+ /// See [`TryRuntime`] and [`fast_forward::Command`] for more information.
+ FastForward(fast_forward::Command),
}
impl Action {
@@ -315,6 +336,9 @@
Action::CreateSnapshot(cmd) => {
create_snapshot::run::<Block, HostFns>(shared.clone(), cmd.clone()).await
}
+ Action::FastForward(cmd) => {
+ fast_forward::run::<Block, HostFns>(shared.clone(), cmd.clone()).await
+ }
}
}
}
diff --git a/src/try_runtime_core/commands/offchain_worker.rs.html b/src/try_runtime_core/commands/offchain_worker.rs.html
index 30c54d463c9..92626450f25 100644
--- a/src/try_runtime_core/commands/offchain_worker.rs.html
+++ b/src/try_runtime_core/commands/offchain_worker.rs.html
@@ -199,7 +199,7 @@
.map(|maybe_header| maybe_header.ok_or("Header does not exist"))??;
let payload = header.encode();
- let _ = state_machine_call::<HostFns>(
+ let _ = state_machine_call::<Block, HostFns>(
&ext,
&executor,
"OffchainWorkerApi_offchain_worker",
diff --git a/src/try_runtime_core/commands/on_runtime_upgrade.rs.html b/src/try_runtime_core/commands/on_runtime_upgrade.rs.html
index e853d7f58f7..614b429cd11 100644
--- a/src/try_runtime_core/commands/on_runtime_upgrade.rs.html
+++ b/src/try_runtime_core/commands/on_runtime_upgrade.rs.html
@@ -214,6 +214,10 @@
214215216
+217
+218
+219
+220
// This file is part of try-runtime-cli.
// Copyright (C) Parity Technologies (UK) Ltd.
@@ -237,7 +241,8 @@
use frame_try_runtime::UpgradeCheckSelect;
use parity_scale_codec::Encode;
use sc_executor::sp_wasm_interface::HostFunctions;
-use sp_core::{hexdisplay::HexDisplay, H256};
+use sp_api::HashingFor;
+use sp_core::{hexdisplay::HexDisplay, Hasher};
use sp_runtime::traits::{Block as BlockT, NumberFor};
use sp_state_machine::{CompactProof, StorageProof};
@@ -303,7 +308,7 @@
}
let pre_root = ext.backend.root();
- let (_, proof, ref_time_results) = state_machine_call_with_proof::<HostFns>(
+ let (_, proof, ref_time_results) = state_machine_call_with_proof::<Block, HostFns>(
&ext,
&executor,
"TryRuntime_on_runtime_upgrade",
@@ -312,7 +317,7 @@
shared.export_proof,
)?;
- let pov_safety = analyse_pov(proof, *pre_root, command.no_weight_warnings);
+ let pov_safety = analyse_pov::<HashingFor<Block>>(proof, *pre_root, command.no_weight_warnings);
let ref_time_safety = analyse_ref_time(ref_time_results, command.no_weight_warnings);
match (pov_safety, ref_time_safety, command.no_weight_warnings) {
@@ -350,11 +355,14 @@
const DEFAULT_WARNING_THRESHOLD: f32 = 0.8;
/// Analyse the given ref_times and return if there is a potential weight safety issue.
-fn analyse_pov(proof: StorageProof, pre_root: H256, no_weight_warnings: bool) -> WeightSafety {
+fn analyse_pov<H>(proof: StorageProof, pre_root: H::Out, no_weight_warnings: bool) -> WeightSafety
+where
+ H: Hasher,
+{
let encoded_proof_size = proof.encoded_size();
let compact_proof = proof
.clone()
- .into_compact_proof::<sp_runtime::traits::BlakeTwo256>(pre_root)
+ .into_compact_proof::<H>(pre_root)
.map_err(|e| {
log::error!(target: LOG_TARGET, "failed to generate compact proof: {:?}", e);
e
diff --git a/src/try_runtime_core/inherent_provider.rs.html b/src/try_runtime_core/inherent_provider.rs.html
new file mode 100644
index 00000000000..07b2fca3f9c
--- /dev/null
+++ b/src/try_runtime_core/inherent_provider.rs.html
@@ -0,0 +1,453 @@
+inherent_provider.rs - source
\ No newline at end of file
diff --git a/try_runtime/fn.main.html b/try_runtime/fn.main.html
index f4918d60d6e..5f9c32bd861 100644
--- a/try_runtime/fn.main.html
+++ b/try_runtime/fn.main.html
@@ -1 +1 @@
-main in try_runtime - Rust
\ No newline at end of file
diff --git a/try_runtime/index.html b/try_runtime/index.html
index 7bcad54b1b3..6d95da985f1 100644
--- a/try_runtime/index.html
+++ b/try_runtime/index.html
@@ -1,4 +1,4 @@
-try_runtime - Rust
Action::FollowChain: continuously execute the blocks of a remote chain on top of a given
runtime.
diff --git a/try_runtime_core/all.html b/try_runtime_core/all.html
index f2e5ca2d304..abf875439f9 100644
--- a/try_runtime_core/all.html
+++ b/try_runtime_core/all.html
@@ -1 +1 @@
-List of all items in this crate
\ No newline at end of file
diff --git a/try_runtime_core/commands/enum.Action.html b/try_runtime_core/commands/enum.Action.html
index c6d1faee0d5..b4c23633d3a 100644
--- a/try_runtime_core/commands/enum.Action.html
+++ b/try_runtime_core/commands/enum.Action.html
@@ -1,9 +1,10 @@
-Action in try_runtime_core::commands - Rust
\ No newline at end of file
diff --git a/try_runtime_core/commands/fast_forward/index.html b/try_runtime_core/commands/fast_forward/index.html
new file mode 100644
index 00000000000..688500e9297
--- /dev/null
+++ b/try_runtime_core/commands/fast_forward/index.html
@@ -0,0 +1 @@
+try_runtime_core::commands::fast_forward - Rust
\ No newline at end of file
diff --git a/try_runtime_core/commands/fast_forward/sidebar-items.js b/try_runtime_core/commands/fast_forward/sidebar-items.js
new file mode 100644
index 00000000000..e1e3fc6b8d8
--- /dev/null
+++ b/try_runtime_core/commands/fast_forward/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"fn":["run"],"struct":["Command"]};
\ No newline at end of file
diff --git a/try_runtime_core/commands/fast_forward/struct.Command.html b/try_runtime_core/commands/fast_forward/struct.Command.html
new file mode 100644
index 00000000000..50a210bc01f
--- /dev/null
+++ b/try_runtime_core/commands/fast_forward/struct.Command.html
@@ -0,0 +1,80 @@
+Command in try_runtime_core::commands::fast_forward - Rust
\ No newline at end of file
diff --git a/try_runtime_core/commands/follow_chain/fn.run.html b/try_runtime_core/commands/follow_chain/fn.run.html
index 6b95e872b91..cb662c9827b 100644
--- a/try_runtime_core/commands/follow_chain/fn.run.html
+++ b/try_runtime_core/commands/follow_chain/fn.run.html
@@ -1,4 +1,4 @@
-run in try_runtime_core::commands::follow_chain - Rust
\ No newline at end of file
diff --git a/try_runtime_core/commands/index.html b/try_runtime_core/commands/index.html
index 2d38bff0861..ad7f0e971fb 100644
--- a/try_runtime_core/commands/index.html
+++ b/try_runtime_core/commands/index.html
@@ -1 +1 @@
-try_runtime_core::commands - Rust
\ No newline at end of file
diff --git a/try_runtime_core/commands/on_runtime_upgrade/fn.run.html b/try_runtime_core/commands/on_runtime_upgrade/fn.run.html
index 5c9382a0bbd..00985886445 100644
--- a/try_runtime_core/commands/on_runtime_upgrade/fn.run.html
+++ b/try_runtime_core/commands/on_runtime_upgrade/fn.run.html
@@ -1,4 +1,4 @@
-run in try_runtime_core::commands::on_runtime_upgrade - Rust
\ No newline at end of file
diff --git a/try_runtime_core/commands/on_runtime_upgrade/struct.Command.html b/try_runtime_core/commands/on_runtime_upgrade/struct.Command.html
index 30fa45aa65f..531680545c5 100644
--- a/try_runtime_core/commands/on_runtime_upgrade/struct.Command.html
+++ b/try_runtime_core/commands/on_runtime_upgrade/struct.Command.html
@@ -1,4 +1,4 @@
-Command in try_runtime_core::commands::on_runtime_upgrade - Rust
\ No newline at end of file
diff --git a/try_runtime_core/inherent_provider/enum.Chain.html b/try_runtime_core/inherent_provider/enum.Chain.html
new file mode 100644
index 00000000000..150ba7cf3c1
--- /dev/null
+++ b/try_runtime_core/inherent_provider/enum.Chain.html
@@ -0,0 +1,73 @@
+Chain in try_runtime_core::inherent_provider - Rust
\ No newline at end of file
diff --git a/try_runtime_core/inherent_provider/index.html b/try_runtime_core/inherent_provider/index.html
new file mode 100644
index 00000000000..79baabd838c
--- /dev/null
+++ b/try_runtime_core/inherent_provider/index.html
@@ -0,0 +1,2 @@
+try_runtime_core::inherent_provider - Rust
Trait for providing the inherent data and digest items for block construction.
\ No newline at end of file
diff --git a/try_runtime_core/inherent_provider/sidebar-items.js b/try_runtime_core/inherent_provider/sidebar-items.js
new file mode 100644
index 00000000000..ffef361df2b
--- /dev/null
+++ b/try_runtime_core/inherent_provider/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"enum":["Chain"],"struct":["ChainIter"],"trait":["InherentProvider"]};
\ No newline at end of file
diff --git a/try_runtime_core/inherent_provider/struct.ChainIter.html b/try_runtime_core/inherent_provider/struct.ChainIter.html
new file mode 100644
index 00000000000..85b47012d3c
--- /dev/null
+++ b/try_runtime_core/inherent_provider/struct.ChainIter.html
@@ -0,0 +1,1061 @@
+ChainIter in try_runtime_core::inherent_provider - Rust
Creates an iterator which can use the peek and peek_mut methods
+to look at the next element of the iterator without consuming it. See
+their documentation for more information. Read more
🔬This is a nightly-only experimental API. (iter_partition_in_place)
Reorders the elements of this iterator in-place according to the given predicate,
+such that all those that return true precede all those that return false.
+Returns the number of true elements found. Read more
🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate,
+such that all those that return true precede all those that return false. Read more
🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the
+closure returns a failure, the failure is propagated back to the caller immediately. Read more
Lexicographically compares the PartialOrd elements of
+this Iterator with those of another. The comparison works like short-circuit
+evaluation, returning a result without comparing the remaining elements.
+As soon as an order can be determined, the evaluation stops and a result is returned. Read more
A “meta iterator adaptor”. Its closure receives a reference to the
+iterator and may pick off as many elements as it likes, to produce the
+next iterator element. Read more
Return an iterable that can group iterator elements.
+Consecutive elements that map to the same key (“runs”), are assigned
+to the same group. Read more
Return an iterator over all windows, wrapping back to the first
+elements when the window would otherwise exceed the length of the
+iterator, producing tuples of a specific size (up to 12). Read more
Return an iterator adaptor that merges the two base iterators in
+ascending order. If both base iterators are sorted (ascending), the
+result is sorted. Read more
Remove duplicates from sections of consecutive identical elements,
+determining equality using a comparison function.
+If the iterator is sorted, all elements will be unique. Read more
Remove duplicates from sections of consecutive identical elements, while keeping a count of
+how many repeated elements were present.
+If the iterator is sorted, all elements will be unique. Read more
Remove duplicates from sections of consecutive identical elements, while keeping a count of
+how many repeated elements were present.
+This will determine equality using a comparison function.
+If the iterator is sorted, all elements will be unique. Read more
Return an iterator adaptor that produces elements that appear more than once during the
+iteration. Duplicates are detected using hash and equality. Read more
Return an iterator adaptor that produces elements that appear more than once during the
+iteration. Duplicates are detected using hash and equality. Read more
Return an iterator adaptor that filters out elements that have
+already been produced once during the iteration. Duplicates
+are detected using hash and equality. Read more
If the iterator yields exactly one element, that element will be returned, otherwise
+an error will be returned containing an iterator that has the same output as the input
+iterator. Read more
If the iterator yields no elements, Ok(None) will be returned. If the iterator yields
+exactly one element, that element will be returned, otherwise an error will be returned
+containing an iterator that has the same output as the input iterator. Read more
Collect the items in this iterator and return a HashMap which
+contains each item that appears in the iterator and the number
+of times it appears. Read more
Collect the items in this iterator and return a HashMap which
+contains each item that appears in the iterator and the number
+of times it appears,
+determining identity using a keying function. Read more
A “meta iterator adaptor”. Its closure receives a reference to the
+iterator and may pick off as many elements as it likes, to produce the
+next iterator element. Read more
Return an iterable that can group iterator elements.
+Consecutive elements that map to the same key (“runs”), are assigned
+to the same group. Read more
Return an iterator over all windows, wrapping back to the first
+elements when the window would otherwise exceed the length of the
+iterator, producing tuples of a specific size (up to 12). Read more
Return an iterator adaptor that merges the two base iterators in
+ascending order. If both base iterators are sorted (ascending), the
+result is sorted. Read more
Remove duplicates from sections of consecutive identical elements,
+determining equality using a comparison function.
+If the iterator is sorted, all elements will be unique. Read more
Remove duplicates from sections of consecutive identical elements, while keeping a count of
+how many repeated elements were present.
+If the iterator is sorted, all elements will be unique. Read more
Remove duplicates from sections of consecutive identical elements, while keeping a count of
+how many repeated elements were present.
+This will determine equality using a comparison function.
+If the iterator is sorted, all elements will be unique. Read more
Return an iterator adaptor that produces elements that appear more than once during the
+iteration. Duplicates are detected using hash and equality. Read more
Return an iterator adaptor that produces elements that appear more than once during the
+iteration. Duplicates are detected using hash and equality. Read more
Return an iterator adaptor that filters out elements that have
+already been produced once during the iteration. Duplicates
+are detected using hash and equality. Read more
Returns an iterator adaptor that consumes elements while the given
+predicate is true, including the element for which the predicate
+first returned false. Read more
If there are elements and they are all equal, return a single copy of that element.
+If there are no elements, return an Error containing None.
+If there are elements and they are not all equal, return a tuple containing the first
+two non-equal elements found. Read more
If the iterator yields exactly one element, that element will be returned, otherwise
+an error will be returned containing an iterator that has the same output as the input
+iterator. Read more
If the iterator yields no elements, Ok(None) will be returned. If the iterator yields
+exactly one element, that element will be returned, otherwise an error will be returned
+containing an iterator that has the same output as the input iterator. Read more
Collect the items in this iterator and return a HashMap which
+contains each item that appears in the iterator and the number
+of times it appears. Read more
Collect the items in this iterator and return a HashMap which
+contains each item that appears in the iterator and the number
+of times it appears,
+determining identity using a keying function. Read more
Wrap an iterator with default styling. Uses Iterator::size_hint to get length.
+Returns Some(..) only if size_hint.1 is Some. If you want to create a progress bar
+even if size_hint.1 returns None use progress_count or progress_with instead.
\ No newline at end of file
diff --git a/try_runtime_core/inherent_provider/trait.InherentProvider.html b/try_runtime_core/inherent_provider/trait.InherentProvider.html
new file mode 100644
index 00000000000..8c8dd4acf00
--- /dev/null
+++ b/try_runtime_core/inherent_provider/trait.InherentProvider.html
@@ -0,0 +1,13 @@
+InherentProvider in try_runtime_core::inherent_provider - Rust
\ No newline at end of file
diff --git a/try_runtime_core/sidebar-items.js b/try_runtime_core/sidebar-items.js
index 8efc20625c9..611d006e37f 100644
--- a/try_runtime_core/sidebar-items.js
+++ b/try_runtime_core/sidebar-items.js
@@ -1 +1 @@
-window.SIDEBAR_ITEMS = {"mod":["commands","shared_parameters","state"],"struct":["RefTimeInfo"]};
\ No newline at end of file
+window.SIDEBAR_ITEMS = {"mod":["commands","inherent_provider","shared_parameters","state"],"struct":["RefTimeInfo"]};
\ No newline at end of file
diff --git a/try_runtime_core/struct.RefTimeInfo.html b/try_runtime_core/struct.RefTimeInfo.html
index acf227baa73..81685f62144 100644
--- a/try_runtime_core/struct.RefTimeInfo.html
+++ b/try_runtime_core/struct.RefTimeInfo.html
@@ -1,4 +1,4 @@
-RefTimeInfo in try_runtime_core - Rust