mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-10-29 23:19:49 +00:00
* v0.50.0: Integrate frame-decode, redo storage APIs and break up Error. (#2100) * WIP integrating new frame-decode and working out new storage APIS * WIP: first pass adding new storage things to subxt-core * Second pass over Address type and start impl in Subxt * WIP new storage APIs * WIP New storage APIs roughly completed, lots of errors still * Remove PlainorMap enum; plain and map values now use same struct to simplify usage * Begin 'fixing' errors * WIP splitting errors and tidying payload/address traits * Get subxt-core compiling * Small fixes in subxt-core and remove metadata mod * subxt-core: cargo check --all-targets passes * Fix test * WIP starting to update subxt from subxt-core changes * WIP splitting up subxt errors into smaller variants * WIP errors: add DispatchError errors * Port new Storage APIs to subxt-core * cargo check -p subxt passes * Quick-fix errors in subxt-cli (explore subcommand) * fmt * Finish fixing codegen up and start fixing examples * get Subxt examples compiling and bytes_at for constants * Add some arcs to limit lifetimes in subxt/subxt-core storage APIs * A little Arcing to allow more method chaining in Storage APIs, aligning with Subxt * Update codegen test * cargo check --all-targets passing * cargo check --features 'unstable-light-client' passing * clippy * Remove unused dep in subxt * use published frame-decode * fix wasm-example * Add new tx extension to fix daily tests * Remove unused subxt_core::dynamic::DecodedValue type * Update book to match changes * Update docs to fix more broken bits * Add missing docs * fmt * allow larger result errs for now * Add missing alloc imports in subxt-core * Fix doc tests and fix bug getting constant info * Fix V14 -> Metadata transform for storage & constants * Fix parachain example * Fix FFI example * BlockLength decodes t ostruct, not u128 * use fetch/iter shorthands rather than entry in most storage tests * Fix some integration tests * Fix Runtime codegen tests * Expose the dynamic custom_value selecter and use in a UI test * Update codegen metadata * Tidy CLI storage query and support (str,str) as a storage address * Add (str,str) as valid constant address too * Show string tuple in constants example * Via the magic of traits, avoid needing any clones of queries/addresses and accept references to them * clippy * [v0.50] update scale-info-legacy and frame-decode to latest (#2119) * bump scale-info-legacy and frame-decode to latest * Remove something we don't need in this PR * Fully remove unused for now dep * [v0.50] Convert historic metadata to subxt::Metadata (#2120) * First pass converting historic metadatas to our subxt::Metadata type * use published frame-decode * fmt and rename legacy metadata macro * Enable legacy feature where needed in subxt_metadata so it compiles on its own * Use cargo hack more in CI and fix subxt-metadata features * Add tests for metadata conversion (need to optimise; some too expensive right now * Address performance and equality issues in metadata conversion testing * fmt * fmt all * clippy * Fix a doc link * Test codegen and fixes to make it work * Remove local frame-decode patch * bump frame-decode to latest * [v0.50.0] Allow visiting extrinsic fields in subxt_historic (#2124) * Allow visiting extrinsic fields * fmt * Don't use local scale-decode dep * Clippy and tidy * Extend 'subxt codegen' CLI to work with legacy metadatas * Simplify historic extrinsics example now that AccountId32s have paths/names * clippy * clippy * clippy.. * Allow visiting storage values, too, and clean up extrinsic visiting a little by narrowing lifetime * Try to fix flaky test * Add custom value decode to extrinsics example * Remove useless else branch ra thought I needed * Simplify examples * Prep to release v0.0.5 (#2126)
326 lines
12 KiB
Rust
326 lines
12 KiB
Rust
/// Any error emitted by this crate can convert into this.
|
|
// Dev Note: All errors here are transparent, because in many places
|
|
// the inner errors are returned and so need to provide enough context
|
|
// as-is, so there shouldn't be anything to add here.
|
|
#[allow(missing_docs)]
|
|
#[derive(Debug, thiserror::Error)]
|
|
#[non_exhaustive]
|
|
pub enum Error {
|
|
#[error(transparent)]
|
|
OnlineClientError(#[from] OnlineClientError),
|
|
#[error(transparent)]
|
|
OfflineClientAtBlockError(#[from] OfflineClientAtBlockError),
|
|
#[error(transparent)]
|
|
OnlineClientAtBlockError(#[from] OnlineClientAtBlockError),
|
|
#[error(transparent)]
|
|
ExtrinsicsError(#[from] ExtrinsicsError),
|
|
#[error(transparent)]
|
|
ExtrinsicTransactionExtensionError(#[from] ExtrinsicTransactionExtensionError),
|
|
#[error(transparent)]
|
|
ExtrinsicCallError(#[from] ExtrinsicCallError),
|
|
#[error(transparent)]
|
|
StorageError(#[from] StorageError),
|
|
#[error(transparent)]
|
|
StorageKeyError(#[from] StorageKeyError),
|
|
#[error(transparent)]
|
|
StorageValueError(#[from] StorageValueError),
|
|
}
|
|
|
|
/// Errors constructing an online client.
|
|
#[allow(missing_docs)]
|
|
#[derive(Debug, thiserror::Error)]
|
|
#[non_exhaustive]
|
|
pub enum OnlineClientError {
|
|
#[error("Cannot construct OnlineClient: The URL provided is invalid: {url}")]
|
|
InvalidUrl {
|
|
/// The URL that was invalid.
|
|
url: String,
|
|
},
|
|
#[error("Cannot construct OnlineClient owing to an RPC client error: {0}")]
|
|
RpcClientError(#[from] subxt_rpcs::Error),
|
|
}
|
|
|
|
/// Errors constructing an offline client at a specific block number.
|
|
#[allow(missing_docs)]
|
|
#[derive(Debug, thiserror::Error)]
|
|
#[non_exhaustive]
|
|
pub enum OfflineClientAtBlockError {
|
|
#[error(
|
|
"Cannot construct OfflineClientAtBlock: spec version not found for block number {block_number}"
|
|
)]
|
|
SpecVersionNotFound {
|
|
/// The block number for which the spec version was not found.
|
|
block_number: u64,
|
|
},
|
|
#[error(
|
|
"Cannot construct OfflineClientAtBlock: metadata not found for spec version {spec_version}"
|
|
)]
|
|
MetadataNotFound {
|
|
/// The spec version for which the metadata was not found.
|
|
spec_version: u32,
|
|
},
|
|
}
|
|
|
|
/// Errors constructing an online client at a specific block number.
|
|
#[allow(missing_docs)]
|
|
#[derive(Debug, thiserror::Error)]
|
|
#[non_exhaustive]
|
|
pub enum OnlineClientAtBlockError {
|
|
#[error(
|
|
"Cannot construct OnlineClientAtBlock: failed to get block hash from node for block {block_number}: {reason}"
|
|
)]
|
|
CannotGetBlockHash {
|
|
/// Block number we failed to get the hash for.
|
|
block_number: u64,
|
|
/// The error we encountered.
|
|
reason: subxt_rpcs::Error,
|
|
},
|
|
#[error("Cannot construct OnlineClientAtBlock: block number {block_number} not found")]
|
|
BlockNotFound {
|
|
/// The block number for which a block was not found.
|
|
block_number: u64,
|
|
},
|
|
#[error(
|
|
"Cannot construct OnlineClientAtBlock: failed to get spec version for block hash {block_hash}: {reason}"
|
|
)]
|
|
CannotGetSpecVersion {
|
|
/// The block hash for which we failed to get the spec version.
|
|
block_hash: String,
|
|
/// The error we encountered.
|
|
reason: String,
|
|
},
|
|
#[error(
|
|
"Cannot construct OnlineClientAtBlock: failed to get metadata for block hash {block_hash}: {reason}"
|
|
)]
|
|
CannotGetMetadata {
|
|
/// The block hash for which we failed to get the metadata.
|
|
block_hash: String,
|
|
/// The error we encountered.
|
|
reason: String,
|
|
},
|
|
#[error(
|
|
"Cannot inject types from metadata: failure to parse a type found in the metadata: {parse_error}"
|
|
)]
|
|
CannotInjectMetadataTypes {
|
|
/// Error parsing a type found in the metadata.
|
|
parse_error: scale_info_legacy::lookup_name::ParseError,
|
|
},
|
|
}
|
|
|
|
/// Errors working with extrinsics.
|
|
#[allow(missing_docs)]
|
|
#[derive(Debug, thiserror::Error)]
|
|
#[non_exhaustive]
|
|
pub enum ExtrinsicsError {
|
|
#[error("Could not fetch extrinsics: {reason}")]
|
|
FetchError {
|
|
/// The error that occurred while fetching the extrinsics.
|
|
reason: subxt_rpcs::Error,
|
|
},
|
|
#[error("Could not decode extrinsic at index {index}: {reason}")]
|
|
DecodeError {
|
|
/// The extrinsic index that failed to decode.
|
|
index: usize,
|
|
/// The error that occurred during decoding.
|
|
reason: frame_decode::extrinsics::ExtrinsicDecodeError,
|
|
},
|
|
#[error(
|
|
"Could not decode extrinsic at index {index}: there were undecoded bytes at the end, which implies that we did not decode it properly"
|
|
)]
|
|
LeftoverBytes {
|
|
/// The extrinsic index that had leftover bytes
|
|
index: usize,
|
|
/// The bytes that were left over after decoding the extrinsic.
|
|
leftover_bytes: Vec<u8>,
|
|
},
|
|
#[error("Could not decode extrinsics: Unsupported metadata version ({version})")]
|
|
UnsupportedMetadataVersion {
|
|
/// The metadata version that is not supported.
|
|
version: u32,
|
|
},
|
|
}
|
|
|
|
#[allow(missing_docs)]
|
|
#[derive(Debug, thiserror::Error)]
|
|
#[non_exhaustive]
|
|
pub enum ExtrinsicTransactionExtensionError {
|
|
#[error("Could not decode extrinsic transaction extensions: {reason}")]
|
|
AllDecodeError {
|
|
/// The error that occurred while decoding the transaction extensions.
|
|
reason: scale_decode::Error,
|
|
},
|
|
#[error(
|
|
"Could not decode extrinsic transaction extensions: there were undecoded bytes at the end, which implies that we did not decode it properly"
|
|
)]
|
|
AllLeftoverBytes {
|
|
/// The bytes that were left over after decoding the transaction extensions.
|
|
leftover_bytes: Vec<u8>,
|
|
},
|
|
#[error("Could not decode extrinsic transaction extension {name}: {reason}")]
|
|
DecodeError {
|
|
/// The name of the transaction extension that failed to decode.
|
|
name: String,
|
|
/// The error that occurred during decoding.
|
|
reason: scale_decode::Error,
|
|
},
|
|
#[error(
|
|
"Could not decode extrinsic transaction extension {name}: there were undecoded bytes at the end, which implies that we did not decode it properly"
|
|
)]
|
|
LeftoverBytes {
|
|
/// The name of the transaction extension that had leftover bytes.
|
|
name: String,
|
|
/// The bytes that were left over after decoding the transaction extension.
|
|
leftover_bytes: Vec<u8>,
|
|
},
|
|
}
|
|
|
|
#[allow(missing_docs)]
|
|
#[derive(Debug, thiserror::Error)]
|
|
#[non_exhaustive]
|
|
pub enum ExtrinsicCallError {
|
|
#[error("Could not decode the fields in extrinsic call: {reason}")]
|
|
FieldsDecodeError {
|
|
/// The error that occurred while decoding the fields of the extrinsic call.
|
|
reason: scale_decode::Error,
|
|
},
|
|
#[error(
|
|
"Could not decode the fields in extrinsic call: there were undecoded bytes at the end, which implies that we did not decode it properly"
|
|
)]
|
|
FieldsLeftoverBytes {
|
|
/// The bytes that were left over after decoding the extrinsic call.
|
|
leftover_bytes: Vec<u8>,
|
|
},
|
|
#[error("Could not decode field {name} in extrinsic call: {reason}")]
|
|
FieldDecodeError {
|
|
/// The name of the field that failed to decode.
|
|
name: String,
|
|
/// The error that occurred during decoding.
|
|
reason: scale_decode::Error,
|
|
},
|
|
#[error(
|
|
"Could not decode field {name} in extrinsic call: there were undecoded bytes at the end, which implies that we did not decode it properly"
|
|
)]
|
|
FieldLeftoverBytes {
|
|
/// The name of the field that had leftover bytes.
|
|
name: String,
|
|
/// The bytes that were left over after decoding the extrinsic call.
|
|
leftover_bytes: Vec<u8>,
|
|
},
|
|
}
|
|
|
|
#[allow(missing_docs)]
|
|
#[derive(Debug, thiserror::Error)]
|
|
#[error("Storage entry is not a map: pallet {pallet_name}, storage {entry_name}")]
|
|
pub struct StorageEntryIsNotAMap {
|
|
/// The pallet containing the storage entry that was not found.
|
|
pub pallet_name: String,
|
|
/// The storage entry that was not found.
|
|
pub entry_name: String,
|
|
}
|
|
|
|
#[allow(missing_docs)]
|
|
#[derive(Debug, thiserror::Error)]
|
|
#[error("Storage entry is not a plain value: pallet {pallet_name}, storage {entry_name}")]
|
|
pub struct StorageEntryIsNotAPlainValue {
|
|
/// The pallet containing the storage entry that was not found.
|
|
pub pallet_name: String,
|
|
/// The storage entry that was not found.
|
|
pub entry_name: String,
|
|
}
|
|
|
|
#[allow(missing_docs)]
|
|
#[derive(Debug, thiserror::Error)]
|
|
#[non_exhaustive]
|
|
pub enum StorageError {
|
|
#[error("RPC error interacting with storage APIs: {reason}")]
|
|
RpcError {
|
|
/// The error that occurred while fetching the storage entry.
|
|
reason: subxt_rpcs::Error,
|
|
},
|
|
#[error("Could not fetch next entry from storage subscription: {reason}")]
|
|
StorageEventError {
|
|
/// The error that occurred while fetching the next storage entry.
|
|
reason: String,
|
|
},
|
|
#[error("Could not construct storage key: {reason}")]
|
|
KeyEncodeError {
|
|
/// The error that occurred while constructing the storage key.
|
|
reason: frame_decode::storage::StorageKeyEncodeError,
|
|
},
|
|
#[error(
|
|
"Wrong number of keys provided to fetch a value: expected {num_keys_expected} keys, but got {num_keys_provided}"
|
|
)]
|
|
WrongNumberOfKeysProvidedForFetch {
|
|
/// The number of keys that were provided.
|
|
num_keys_provided: usize,
|
|
/// The number of keys expected.
|
|
num_keys_expected: usize,
|
|
},
|
|
#[error(
|
|
"too many keys were provided to iterate over a storage entry: expected at most {max_keys_expected} keys, but got {num_keys_provided}"
|
|
)]
|
|
TooManyKeysProvidedForIter {
|
|
/// The number of keys that were provided.
|
|
num_keys_provided: usize,
|
|
/// The maximum number of keys that we expect.
|
|
max_keys_expected: usize,
|
|
},
|
|
#[error(
|
|
"Could not extract storage information from metadata: Unsupported metadata version ({version})"
|
|
)]
|
|
UnsupportedMetadataVersion {
|
|
/// The metadata version that is not supported.
|
|
version: u32,
|
|
},
|
|
#[error("Could not extract storage information from metadata: {reason}")]
|
|
ExtractStorageInfoError {
|
|
/// The error that occurred while extracting storage information from the metadata.
|
|
reason: frame_decode::storage::StorageInfoError<'static>,
|
|
},
|
|
}
|
|
|
|
#[allow(missing_docs)]
|
|
#[derive(Debug, thiserror::Error)]
|
|
#[non_exhaustive]
|
|
pub enum StorageKeyError {
|
|
#[error("Could not decode the storage key: {reason}")]
|
|
DecodeError {
|
|
/// The error that occurred while decoding the storage key information.
|
|
reason: frame_decode::storage::StorageKeyDecodeError<String>,
|
|
},
|
|
#[error(
|
|
"Could not decode the storage key: there were undecoded bytes at the end, which implies that we did not decode it properly"
|
|
)]
|
|
LeftoverBytes {
|
|
/// The bytes that were left over after decoding the storage key.
|
|
leftover_bytes: Vec<u8>,
|
|
},
|
|
#[error("Could not decode the part of the storage key at index {index}: {reason}")]
|
|
DecodePartError {
|
|
index: usize,
|
|
reason: scale_decode::Error,
|
|
},
|
|
#[error("Could not decode values out of the storage key: {reason}")]
|
|
DecodeKeyValueError {
|
|
reason: frame_decode::storage::StorageKeyValueDecodeError,
|
|
},
|
|
}
|
|
|
|
#[allow(missing_docs)]
|
|
#[derive(Debug, thiserror::Error)]
|
|
#[non_exhaustive]
|
|
pub enum StorageValueError {
|
|
#[error("Could not decode storage value: {reason}")]
|
|
DecodeError {
|
|
/// The error that occurred while decoding the storage value.
|
|
reason: scale_decode::Error,
|
|
},
|
|
#[error(
|
|
"Could not decode storage value: there were undecoded bytes at the end, which implies that we did not decode it properly"
|
|
)]
|
|
LeftoverBytes {
|
|
/// The bytes that were left over after decoding the storage value.
|
|
leftover_bytes: Vec<u8>,
|
|
},
|
|
}
|