diff --git a/src/lib.rs b/src/lib.rs index c229e21f19d..d367934b83f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -50,6 +50,7 @@ use codec::{ Codec, Decode, }; +use frame_metadata::StorageEntryModifier; use futures::future; use jsonrpsee_http_client::{ HttpClient, @@ -360,8 +361,12 @@ impl Client { &self, key: StorageKey, hash: Option, + modifier: StorageEntryModifier, ) -> Result, Error> { - if let Some(data) = self.rpc.storage(&key, hash).await? { + if let Some(mut data) = self.rpc.storage(&key, hash).await? { + if modifier == StorageEntryModifier::Optional { + data.0.insert(0, 1u8) + } Ok(Some(Decode::decode(&mut &data.0[..])?)) } else { Ok(None) @@ -375,7 +380,9 @@ impl Client { hash: Option, ) -> Result, Error> { let key = store.key(&self.metadata)?; - self.fetch_unhashed::(key, hash).await + let storage_meta = self.metadata.module(F::MODULE)?.storage(F::FIELD)?; + self.fetch_unhashed::(key, hash, storage_meta.modifier()) + .await } /// Fetch a StorageKey that has a default value with an optional block hash. diff --git a/src/metadata.rs b/src/metadata.rs index 9e4b992e0ac..e9fae4bb81a 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -273,6 +273,10 @@ impl StorageMetadata { StorageKey(bytes) } + pub fn modifier(&self) -> StorageEntryModifier { + self.modifier.clone() + } + pub fn default(&self) -> Result { Decode::decode(&mut &self.default[..]).map_err(MetadataError::DefaultError) }