From 6e8214ebcee2b56e02b3e1d8a39d4ca794c80f01 Mon Sep 17 00:00:00 2001
From: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com>
Date: Thu, 14 Dec 2023 11:49:38 +0100
Subject: [PATCH] sc-chain-spec: EHF + named patch fixes

---
 substrate/client/chain-spec/src/chain_spec.rs | 37 ++++++++++++-------
 1 file changed, 23 insertions(+), 14 deletions(-)

diff --git a/substrate/client/chain-spec/src/chain_spec.rs b/substrate/client/chain-spec/src/chain_spec.rs
index 93e1d6c4f05..122bddddee9 100644
--- a/substrate/client/chain-spec/src/chain_spec.rs
+++ b/substrate/client/chain-spec/src/chain_spec.rs
@@ -40,17 +40,26 @@ use std::{
 	sync::Arc,
 };
 
-#[derive(Serialize, Deserialize, Clone)]
+#[derive(Serialize, Deserialize)]
 #[serde(rename_all = "camelCase")]
-enum GenesisBuildAction {
+enum GenesisBuildAction<EHF> {
 	Patch(json::Value),
 	Full(json::Value),
-	// name of the patch, runtime code (todo: shared ref)
-	NamedPatch(String),
+	NamedPatch(String, PhantomData<EHF>),
+}
+
+impl<EHF> Clone for GenesisBuildAction<EHF> {
+	fn clone(&self) -> Self {
+		match self {
+			Self::Patch(ref p) => Self::Patch(p.clone()),
+			Self::Full(ref f) => Self::Full(f.clone()),
+			Self::NamedPatch(ref p, _) => Self::NamedPatch(p.clone(), Default::default()),
+		}
+	}
 }
 
 #[allow(deprecated)]
-enum GenesisSource<G> {
+enum GenesisSource<G, EHF> {
 	File(PathBuf),
 	Binary(Cow<'static, [u8]>),
 	/// factory function + code
@@ -58,10 +67,10 @@ enum GenesisSource<G> {
 	Factory(Arc<dyn Fn() -> G + Send + Sync>, Vec<u8>),
 	Storage(Storage),
 	/// build action + code
-	GenesisBuilderApi(GenesisBuildAction, Vec<u8>),
+	GenesisBuilderApi(GenesisBuildAction<EHF>, Vec<u8>),
 }
 
-impl<G> Clone for GenesisSource<G> {
+impl<G, EHF> Clone for GenesisSource<G, EHF> {
 	fn clone(&self) -> Self {
 		match *self {
 			Self::File(ref path) => Self::File(path.clone()),
@@ -73,7 +82,7 @@ impl<G> Clone for GenesisSource<G> {
 	}
 }
 
-impl<G: RuntimeGenesis> GenesisSource<G> {
+impl<G: RuntimeGenesis, EHF: HostFunctions> GenesisSource<G, EHF> {
 	fn resolve(&self) -> Result<Genesis<G>, String> {
 		/// helper container for deserializing genesis from the JSON file (ChainSpec JSON file is
 		/// also supported here)
@@ -120,8 +129,8 @@ impl<G: RuntimeGenesis> GenesisSource<G> {
 					json_blob: RuntimeGenesisConfigJson::Patch(patch.clone()),
 					code: code.clone(),
 				})),
-			Self::GenesisBuilderApi(GenesisBuildAction::NamedPatch(name), code) => {
-				let patch = RuntimeCaller::new(&code[..]).get_named_patch(name)?;
+			Self::GenesisBuilderApi(GenesisBuildAction::NamedPatch(name, _), code) => {
+				let patch = RuntimeCaller::<EHF>::new(&code[..]).get_named_patch(name)?;
 				Ok(Genesis::RuntimeGenesis(RuntimeGenesisInner {
 					json_blob: RuntimeGenesisConfigJson::Patch(patch),
 					code: code.clone(),
@@ -340,13 +349,13 @@ pub struct ChainSpecBuilder<G, E = NoExtension, EHF = ()> {
 	name: String,
 	id: String,
 	chain_type: ChainType,
-	genesis_build_action: GenesisBuildAction,
+	genesis_build_action: GenesisBuildAction<EHF>,
 	boot_nodes: Option<Vec<MultiaddrWithPeerId>>,
 	telemetry_endpoints: Option<TelemetryEndpoints>,
 	protocol_id: Option<String>,
 	fork_id: Option<String>,
 	properties: Option<Properties>,
-	_genesis: PhantomData<(G, EHF)>,
+	_genesis: PhantomData<G>,
 }
 
 impl<G, E, EHF> ChainSpecBuilder<G, E, EHF> {
@@ -436,7 +445,7 @@ impl<G, E, EHF> ChainSpecBuilder<G, E, EHF> {
 
 	/// Sets the name of runtime-provided JSON patch for runtime's GenesisConfig.
 	pub fn with_genesis_config_patch_name(mut self, name: String) -> Self {
-		self.genesis_build_action = GenesisBuildAction::NamedPatch(name);
+		self.genesis_build_action = GenesisBuildAction::NamedPatch(name, Default::default());
 		self
 	}
 
@@ -478,7 +487,7 @@ impl<G, E, EHF> ChainSpecBuilder<G, E, EHF> {
 /// runtime is using the non-standard host function during genesis state creation.
 pub struct ChainSpec<G, E = NoExtension, EHF = ()> {
 	client_spec: ClientSpec<E>,
-	genesis: GenesisSource<G>,
+	genesis: GenesisSource<G, EHF>,
 	_host_functions: PhantomData<EHF>,
 }
 
-- 
GitLab