1use super::storage_encoder::encode_storage_key_prefix;
17use super::storage_type_info::{StorageHasher, StorageInfo, StorageTypeInfo};
18use crate::methods::storage_type_info::StorageInfoError;
19use crate::utils::{
20 DecodableValues, DecodeErrorTrace, IntoDecodableValues, decode_with_error_tracing,
21};
22use alloc::vec;
23use alloc::vec::Vec;
24use core::ops::Range;
25use scale_type_resolver::TypeResolver;
26
27#[non_exhaustive]
29#[allow(missing_docs)]
30#[derive(Clone, Debug, thiserror::Error)]
31pub enum StorageKeyDecodeError<TypeId> {
32 #[error("Cannot get storage info: {0}")]
33 CannotGetInfo(StorageInfoError<'static>),
34 #[error(
35 "The hashed storage prefix given does not match the pallet and storage name asked to decode."
36 )]
37 PrefixMismatch,
38 #[error("Not enough bytes left: we need at least {needed} bytes but have {have} bytes")]
39 NotEnoughBytes { needed: usize, have: usize },
40 #[error(
41 "Cannot decode storage key '{ty:?}':\n\n{reason}\n\nDecoded so far:\n\n{decoded_so_far}"
42 )]
43 CannotDecodeKey {
44 ty: TypeId,
45 reason: DecodeErrorTrace,
46 decoded_so_far: StorageKey<TypeId>,
47 },
48}
49
50impl<TypeId> StorageKeyDecodeError<TypeId> {
51 pub fn map_type_id<NewTypeId, F>(self, mut f: F) -> StorageKeyDecodeError<NewTypeId>
53 where
54 F: FnMut(TypeId) -> NewTypeId,
55 {
56 match self {
57 StorageKeyDecodeError::CannotGetInfo(e) => StorageKeyDecodeError::CannotGetInfo(e),
58 StorageKeyDecodeError::PrefixMismatch => StorageKeyDecodeError::PrefixMismatch,
59 StorageKeyDecodeError::NotEnoughBytes { needed, have } => {
60 StorageKeyDecodeError::NotEnoughBytes { needed, have }
61 }
62 StorageKeyDecodeError::CannotDecodeKey {
63 ty,
64 reason,
65 decoded_so_far,
66 } => StorageKeyDecodeError::CannotDecodeKey {
67 ty: f(ty),
68 reason,
69 decoded_so_far: decoded_so_far.map_type_id(f),
70 },
71 }
72 }
73}
74
75#[non_exhaustive]
77#[allow(missing_docs)]
78#[derive(Debug, thiserror::Error)]
79pub enum StorageKeyValueDecodeError {
80 #[error("Cannot decode storage value at index {index}: {error}")]
81 DecodeError {
82 index: usize,
83 error: scale_decode::Error,
84 },
85 #[error("Cannot decode storage key values; need {need} values but have {have}")]
86 WrongNumberOfValues { have: usize, need: usize },
87 #[error(
88 "There were leftover bytes after decoding a value, indicating that decoding was not successful"
89 )]
90 LeftoverBytes { bytes: Vec<u8> },
91 #[error(
92 "An invalid byte range was asked for from the key bytes, implying that the key bytes are not those that the information is about"
93 )]
94 InvalidRange,
95}
96
97#[non_exhaustive]
99#[allow(missing_docs)]
100#[derive(Clone, Debug)]
101pub enum StorageValueDecodeError<TypeId> {
102 CannotGetInfo(StorageInfoError<'static>),
103 CannotDecodeValue {
104 ty: TypeId,
105 reason: DecodeErrorTrace,
106 },
107}
108
109impl<TypeId: core::fmt::Debug> core::error::Error for StorageValueDecodeError<TypeId> {}
110
111impl<TypeId: core::fmt::Debug> core::fmt::Display for StorageValueDecodeError<TypeId> {
112 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
113 match self {
114 StorageValueDecodeError::CannotGetInfo(storage_info_error) => {
115 write!(f, "Cannot get storage info:\n\n{storage_info_error}")
116 }
117 StorageValueDecodeError::CannotDecodeValue { ty, reason } => {
118 write!(f, "Cannot decode value with type ID {ty:?}:\n\n{reason}")
119 }
120 }
121 }
122}
123
124impl<TypeId> StorageValueDecodeError<TypeId> {
125 pub fn map_type_id<NewTypeId, F>(self, mut f: F) -> StorageValueDecodeError<NewTypeId>
127 where
128 F: FnMut(TypeId) -> NewTypeId,
129 {
130 match self {
131 StorageValueDecodeError::CannotGetInfo(e) => StorageValueDecodeError::CannotGetInfo(e),
132 StorageValueDecodeError::CannotDecodeValue { ty, reason } => {
133 StorageValueDecodeError::CannotDecodeValue { ty: f(ty), reason }
134 }
135 }
136 }
137}
138
139#[derive(Clone, Debug)]
141pub struct StorageKey<TypeId> {
142 parts: Vec<StorageKeyPart<TypeId>>,
143}
144
145impl<TypeId: core::fmt::Debug> core::fmt::Display for StorageKey<TypeId> {
146 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
147 if self.parts.is_empty() {
149 write!(f, "No storage parts")?;
150 return Ok(());
151 }
152
153 for key in self.parts.iter() {
160 writeln!(f, "Hash type: {:?}", key.hasher)?;
161 writeln!(
162 f,
163 "Hash range: {}..{}",
164 key.hash_range.start, key.hash_range.end
165 )?;
166 if let Some(v) = &key.value {
167 writeln!(f, "Value type: {:?}", v.ty)?;
168 writeln!(f, "Value range: {}..{}", v.range.start, v.range.end)?;
169 }
170
171 writeln!(f)?;
172 }
173
174 Ok(())
175 }
176}
177
178impl<TypeId> core::ops::Index<usize> for StorageKey<TypeId> {
179 type Output = StorageKeyPart<TypeId>;
180 fn index(&self, index: usize) -> &Self::Output {
181 &self.parts[index]
182 }
183}
184
185impl<TypeId> StorageKey<TypeId> {
186 pub fn parts(&self) -> impl ExactSizeIterator<Item = &StorageKeyPart<TypeId>> {
188 self.parts.iter()
189 }
190
191 pub fn map_type_id<NewTypeId, F>(self, mut f: F) -> StorageKey<NewTypeId>
193 where
194 F: FnMut(TypeId) -> NewTypeId,
195 {
196 StorageKey {
197 parts: self
198 .parts
199 .into_iter()
200 .map(|p| p.map_type_id(&mut f))
201 .collect(),
202 }
203 }
204}
205
206#[derive(Clone, Debug)]
208pub struct StorageKeyPart<TypeId> {
209 hash_range: Range<u32>,
210 value: Option<StorageKeyPartValue<TypeId>>,
211 hasher: StorageHasher,
212}
213
214impl<TypeId> StorageKeyPart<TypeId> {
215 pub fn hash_range(&self) -> Range<usize> {
217 Range {
218 start: self.hash_range.start as usize,
219 end: self.hash_range.end as usize,
220 }
221 }
222
223 pub fn hasher(&self) -> StorageHasher {
225 self.hasher
226 }
227
228 pub fn value(&self) -> Option<&StorageKeyPartValue<TypeId>> {
231 self.value.as_ref()
232 }
233
234 pub fn map_type_id<NewTypeId, F>(self, f: F) -> StorageKeyPart<NewTypeId>
236 where
237 F: FnMut(TypeId) -> NewTypeId,
238 {
239 StorageKeyPart {
240 hash_range: self.hash_range,
241 value: self.value.map(|v| v.map_type_id(f)),
242 hasher: self.hasher,
243 }
244 }
245}
246
247#[derive(Clone, Debug)]
249pub struct StorageKeyPartValue<TypeId> {
250 range: Range<u32>,
251 ty: TypeId,
252}
253
254impl<TypeId> StorageKeyPartValue<TypeId> {
255 pub fn range(&self) -> Range<usize> {
257 Range {
258 start: self.range.start as usize,
259 end: self.range.end as usize,
260 }
261 }
262
263 pub fn ty(&self) -> &TypeId {
265 &self.ty
266 }
267
268 pub fn map_type_id<NewTypeId, F>(self, mut f: F) -> StorageKeyPartValue<NewTypeId>
270 where
271 F: FnMut(TypeId) -> NewTypeId,
272 {
273 StorageKeyPartValue {
274 range: self.range,
275 ty: f(self.ty),
276 }
277 }
278}
279
280pub fn decode_storage_key<Info, Resolver>(
333 pallet_name: &str,
334 storage_entry: &str,
335 cursor: &mut &[u8],
336 info: &Info,
337 type_resolver: &Resolver,
338) -> Result<StorageKey<Info::TypeId>, StorageKeyDecodeError<Info::TypeId>>
339where
340 Info: StorageTypeInfo,
341 Info::TypeId: Clone + core::fmt::Debug,
342 Resolver: TypeResolver<TypeId = Info::TypeId>,
343{
344 let storage_info = info
345 .storage_info(pallet_name, storage_entry)
346 .map_err(|e| StorageKeyDecodeError::CannotGetInfo(e.into_owned()))?;
347
348 let expected_prefix = encode_storage_key_prefix(pallet_name, storage_entry);
350 if cursor[..32] != expected_prefix {
351 return Err(StorageKeyDecodeError::PrefixMismatch);
352 }
353
354 decode_storage_key_with_info(cursor, &storage_info, type_resolver)
355}
356
357pub fn decode_storage_key_with_info<Resolver>(
368 cursor: &mut &[u8],
369 storage_info: &StorageInfo<<Resolver as TypeResolver>::TypeId>,
370 type_resolver: &Resolver,
371) -> Result<
372 StorageKey<<Resolver as TypeResolver>::TypeId>,
373 StorageKeyDecodeError<<Resolver as TypeResolver>::TypeId>,
374>
375where
376 Resolver: TypeResolver,
377 <Resolver as TypeResolver>::TypeId: Clone + core::fmt::Debug,
378{
379 let bytes = *cursor;
380 let curr_idx = |cursor: &mut &[u8]| (bytes.len() - cursor.len()) as u32;
381
382 let _prefix = strip_bytes(cursor, 32)?;
383
384 let mut parts = vec![];
385 for key in &*storage_info.keys {
386 let hasher = if storage_info.use_old_v9_storage_hashers {
387 map_to_old_v9_storage_hashers(key.hasher)
388 } else {
389 key.hasher
390 };
391
392 let start_idx = curr_idx(cursor);
393 let part = match &hasher {
394 StorageHasher::Blake2_128 | StorageHasher::Twox128 => {
395 strip_bytes(cursor, 16)?;
396 StorageKeyPart {
397 hash_range: Range {
398 start: start_idx,
399 end: curr_idx(cursor),
400 },
401 value: None,
402 hasher,
403 }
404 }
405 StorageHasher::Blake2_256 | StorageHasher::Twox256 => {
406 strip_bytes(cursor, 32)?;
407 StorageKeyPart {
408 hash_range: Range {
409 start: start_idx,
410 end: curr_idx(cursor),
411 },
412 value: None,
413 hasher,
414 }
415 }
416 StorageHasher::Blake2_128Concat => {
417 strip_bytes(cursor, 16)?;
418 let hash_end_idx = curr_idx(cursor);
419 decode_with_error_tracing(
420 cursor,
421 key.key_id.clone(),
422 type_resolver,
423 scale_decode::visitor::IgnoreVisitor::new(),
424 )
425 .map_err(|e| StorageKeyDecodeError::CannotDecodeKey {
426 ty: key.key_id.clone(),
427 reason: e,
428 decoded_so_far: StorageKey {
429 parts: parts.clone(),
430 },
431 })?;
432 StorageKeyPart {
433 hash_range: Range {
434 start: start_idx,
435 end: hash_end_idx,
436 },
437 value: Some(StorageKeyPartValue {
438 range: Range {
439 start: hash_end_idx,
440 end: curr_idx(cursor),
441 },
442 ty: key.key_id.clone(),
443 }),
444 hasher,
445 }
446 }
447 StorageHasher::Twox64Concat => {
448 strip_bytes(cursor, 8)?;
449 let hash_end_idx = curr_idx(cursor);
450 decode_with_error_tracing(
451 cursor,
452 key.key_id.clone(),
453 type_resolver,
454 scale_decode::visitor::IgnoreVisitor::new(),
455 )
456 .map_err(|e| StorageKeyDecodeError::CannotDecodeKey {
457 ty: key.key_id.clone(),
458 reason: e,
459 decoded_so_far: StorageKey {
460 parts: parts.clone(),
461 },
462 })?;
463 StorageKeyPart {
464 hash_range: Range {
465 start: start_idx,
466 end: hash_end_idx,
467 },
468 value: Some(StorageKeyPartValue {
469 range: Range {
470 start: hash_end_idx,
471 end: curr_idx(cursor),
472 },
473 ty: key.key_id.clone(),
474 }),
475 hasher,
476 }
477 }
478 StorageHasher::Identity => {
479 decode_with_error_tracing(
480 cursor,
481 key.key_id.clone(),
482 type_resolver,
483 scale_decode::visitor::IgnoreVisitor::new(),
484 )
485 .map_err(|e| StorageKeyDecodeError::CannotDecodeKey {
486 ty: key.key_id.clone(),
487 reason: e,
488 decoded_so_far: StorageKey {
489 parts: parts.clone(),
490 },
491 })?;
492 StorageKeyPart {
493 hash_range: Range {
494 start: start_idx,
495 end: start_idx,
496 },
497 value: Some(StorageKeyPartValue {
498 range: Range {
499 start: start_idx,
500 end: curr_idx(cursor),
501 },
502 ty: key.key_id.clone(),
503 }),
504 hasher,
505 }
506 }
507 };
508 parts.push(part)
509 }
510
511 Ok(StorageKey { parts })
512}
513
514pub fn decode_storage_key_values<Values, Resolver>(
576 key_bytes: &[u8],
577 decoded_key: &StorageKey<Resolver::TypeId>,
578 types: &Resolver,
579) -> Result<Values, StorageKeyValueDecodeError>
580where
581 Values: IntoDecodableValues,
582 Resolver: TypeResolver,
583{
584 let num_values = decoded_key
585 .parts()
586 .filter(|part| part.value.is_some())
587 .count();
588
589 let needed_values = Values::num_decodable_values();
590
591 if let Some(needed_values) = needed_values
593 && num_values < needed_values
594 {
595 return Err(StorageKeyValueDecodeError::WrongNumberOfValues {
596 have: num_values,
597 need: needed_values,
598 });
599 }
600
601 let mut decode_target = Values::into_decodable_values();
602
603 let value_info_iter =
605 (0..needed_values.unwrap_or(usize::MAX)).zip(decoded_key.parts().filter_map(|p| p.value()));
606
607 for (idx, value_info) in value_info_iter {
608 let value_bytes = &mut key_bytes
610 .get(value_info.range())
611 .ok_or(StorageKeyValueDecodeError::InvalidRange)?;
612 let value_ty = value_info.ty().clone();
613
614 decode_target
615 .decode_next_value(value_bytes, value_ty, types)
616 .map_err(|e| StorageKeyValueDecodeError::DecodeError {
617 index: idx,
618 error: e,
619 })?;
620
621 if !value_bytes.is_empty() {
622 return Err(StorageKeyValueDecodeError::LeftoverBytes {
623 bytes: value_bytes.to_vec(),
624 });
625 }
626 }
627
628 Ok(decode_target.decoded_target())
629}
630
631pub fn decode_storage_value<'scale, 'resolver, Info, Resolver, V>(
665 pallet_name: &str,
666 storage_entry: &str,
667 cursor: &mut &'scale [u8],
668 info: &Info,
669 type_resolver: &'resolver Resolver,
670 visitor: V,
671) -> Result<V::Value<'scale, 'resolver>, StorageValueDecodeError<Info::TypeId>>
672where
673 Info: StorageTypeInfo,
674 Info::TypeId: Clone + core::fmt::Debug,
675 Resolver: TypeResolver<TypeId = Info::TypeId>,
676 V: scale_decode::Visitor<TypeResolver = Resolver>,
677 V::Error: core::fmt::Debug,
678{
679 let storage_info = info
680 .storage_info(pallet_name, storage_entry)
681 .map_err(|e| StorageValueDecodeError::CannotGetInfo(e.into_owned()))?;
682
683 decode_storage_value_with_info(cursor, &storage_info, type_resolver, visitor)
684}
685
686pub fn decode_storage_value_with_info<'scale, 'resolver, V>(
692 cursor: &mut &'scale [u8],
693 storage_info: &StorageInfo<<V::TypeResolver as TypeResolver>::TypeId>,
694 type_resolver: &'resolver V::TypeResolver,
695 visitor: V,
696) -> Result<
697 V::Value<'scale, 'resolver>,
698 StorageValueDecodeError<<V::TypeResolver as TypeResolver>::TypeId>,
699>
700where
701 V: scale_decode::Visitor,
702 V::Error: core::fmt::Debug,
703{
704 let value_id = storage_info.value_id.clone();
705
706 decode_with_error_tracing(cursor, value_id.clone(), type_resolver, visitor).map_err(|e| {
707 StorageValueDecodeError::CannotDecodeValue {
708 ty: value_id,
709 reason: e,
710 }
711 })
712}
713
714pub fn decode_default_storage_value_with_info<'info, 'resolver, V>(
719 storage_info: &'info StorageInfo<<V::TypeResolver as TypeResolver>::TypeId>,
720 type_resolver: &'resolver V::TypeResolver,
721 visitor: V,
722) -> Result<
723 Option<V::Value<'info, 'resolver>>,
724 StorageValueDecodeError<<V::TypeResolver as TypeResolver>::TypeId>,
725>
726where
727 V: scale_decode::Visitor,
728 V::Error: core::fmt::Debug,
729{
730 let value_id = storage_info.value_id.clone();
731
732 let Some(default_bytes) = &storage_info.default_value else {
733 return Ok(None);
734 };
735 let value = decode_with_error_tracing(
736 &mut &**default_bytes,
737 value_id.clone(),
738 type_resolver,
739 visitor,
740 )
741 .map_err(|e| StorageValueDecodeError::CannotDecodeValue {
742 ty: value_id,
743 reason: e,
744 })?;
745
746 Ok(Some(value))
747}
748
749fn strip_bytes<'a, T>(
750 cursor: &mut &'a [u8],
751 num: usize,
752) -> Result<&'a [u8], StorageKeyDecodeError<T>> {
753 let bytes = cursor
754 .get(..num)
755 .ok_or_else(|| StorageKeyDecodeError::NotEnoughBytes {
756 needed: num,
757 have: cursor.len(),
758 })?;
759
760 *cursor = &cursor[num..];
761 Ok(bytes)
762}
763
764fn map_to_old_v9_storage_hashers(hasher: StorageHasher) -> StorageHasher {
765 match hasher {
766 StorageHasher::Blake2_128 => StorageHasher::Blake2_128,
770 StorageHasher::Blake2_256 => StorageHasher::Blake2_256,
771 StorageHasher::Blake2_128Concat => StorageHasher::Twox128,
772 StorageHasher::Twox128 => StorageHasher::Twox256,
773 StorageHasher::Twox256 => StorageHasher::Twox64Concat,
774
775 StorageHasher::Twox64Concat => StorageHasher::Twox64Concat,
777 StorageHasher::Identity => StorageHasher::Identity,
778 }
779}
780
781#[cfg(test)]
782mod test {
783 use super::*;
784
785 #[test]
786 fn test_strip_bytes() {
787 let v = vec![0, 1, 2, 3, 4, 5, 6, 7, 8];
788 let cursor = &mut &*v;
789 let stripped = strip_bytes::<()>(cursor, 4).unwrap();
790 assert_eq!(stripped, &[0, 1, 2, 3]);
791 assert_eq!(cursor, &[4, 5, 6, 7, 8]);
792 }
793}