mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-19 14:41:02 +00:00
Add basic support for V5 extrinsics
This commit is contained in:
Generated
+15
-15
@@ -327,7 +327,7 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "artifacts"
|
name = "artifacts"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"substrate-runner",
|
"substrate-runner",
|
||||||
]
|
]
|
||||||
@@ -1812,7 +1812,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "generate-custom-metadata"
|
name = "generate-custom-metadata"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"frame-metadata 16.0.0",
|
"frame-metadata 16.0.0",
|
||||||
"parity-scale-codec",
|
"parity-scale-codec",
|
||||||
@@ -2309,7 +2309,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "integration-tests"
|
name = "integration-tests"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"assert_matches",
|
"assert_matches",
|
||||||
"cfg_aliases",
|
"cfg_aliases",
|
||||||
@@ -4745,7 +4745,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "substrate-runner"
|
name = "substrate-runner"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subtle"
|
name = "subtle"
|
||||||
@@ -4755,7 +4755,7 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subxt"
|
name = "subxt"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"assert_matches",
|
"assert_matches",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
@@ -4798,7 +4798,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subxt-cli"
|
name = "subxt-cli"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap 4.5.4",
|
"clap 4.5.4",
|
||||||
"color-eyre",
|
"color-eyre",
|
||||||
@@ -4827,7 +4827,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subxt-codegen"
|
name = "subxt-codegen"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"frame-metadata 16.0.0",
|
"frame-metadata 16.0.0",
|
||||||
"getrandom",
|
"getrandom",
|
||||||
@@ -4847,7 +4847,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subxt-core"
|
name = "subxt-core"
|
||||||
version = "0.36.1"
|
version = "0.37.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"assert_matches",
|
"assert_matches",
|
||||||
"base58",
|
"base58",
|
||||||
@@ -4879,7 +4879,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subxt-lightclient"
|
name = "subxt-lightclient"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures",
|
"futures",
|
||||||
"futures-timer",
|
"futures-timer",
|
||||||
@@ -4904,7 +4904,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subxt-macro"
|
name = "subxt-macro"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"darling 0.20.8",
|
"darling 0.20.8",
|
||||||
"parity-scale-codec",
|
"parity-scale-codec",
|
||||||
@@ -4917,7 +4917,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subxt-metadata"
|
name = "subxt-metadata"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"assert_matches",
|
"assert_matches",
|
||||||
"bitvec",
|
"bitvec",
|
||||||
@@ -4931,7 +4931,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subxt-signer"
|
name = "subxt-signer"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bip32",
|
"bip32",
|
||||||
"bip39",
|
"bip39",
|
||||||
@@ -4958,7 +4958,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subxt-test-macro"
|
name = "subxt-test-macro"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.60",
|
"syn 2.0.60",
|
||||||
@@ -5021,7 +5021,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "test-runtime"
|
name = "test-runtime"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"hex",
|
"hex",
|
||||||
"impl-serde",
|
"impl-serde",
|
||||||
@@ -5446,7 +5446,7 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ui-tests"
|
name = "ui-tests"
|
||||||
version = "0.36.1"
|
version = "0.37.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"frame-metadata 16.0.0",
|
"frame-metadata 16.0.0",
|
||||||
"generate-custom-metadata",
|
"generate-custom-metadata",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "subxt-core"
|
name = "subxt-core"
|
||||||
version.workspace = true
|
version = "0.37.1"
|
||||||
authors.workspace = true
|
authors.workspace = true
|
||||||
edition.workspace = true
|
edition.workspace = true
|
||||||
rust-version.workspace = true
|
rust-version.workspace = true
|
||||||
|
|||||||
@@ -149,7 +149,9 @@ pub struct SignedExtrinsicDetails {
|
|||||||
address_end_idx: usize,
|
address_end_idx: usize,
|
||||||
/// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the signature. Equivalent to extra_start_idx.
|
/// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the signature. Equivalent to extra_start_idx.
|
||||||
signature_end_idx: usize,
|
signature_end_idx: usize,
|
||||||
/// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the signature.
|
/// start index of the range in `bytes` of `ExtrinsicDetails` that encodes the extensions.
|
||||||
|
extra_start_idx: usize,
|
||||||
|
/// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the extensions.
|
||||||
extra_end_idx: usize,
|
extra_end_idx: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,9 +167,8 @@ where
|
|||||||
metadata: Metadata,
|
metadata: Metadata,
|
||||||
ids: ExtrinsicPartTypeIds,
|
ids: ExtrinsicPartTypeIds,
|
||||||
) -> Result<ExtrinsicDetails<T>, Error> {
|
) -> Result<ExtrinsicDetails<T>, Error> {
|
||||||
const SIGNATURE_MASK: u8 = 0b1000_0000;
|
const SIGNATURE_MASK: u8 = 0b1100_0000;
|
||||||
const VERSION_MASK: u8 = 0b0111_1111;
|
const VERSION_MASK: u8 = 0b0011_1111;
|
||||||
const LATEST_EXTRINSIC_VERSION: u8 = 4;
|
|
||||||
|
|
||||||
// removing the compact encoded prefix:
|
// removing the compact encoded prefix:
|
||||||
let bytes: Arc<[u8]> = strip_compact_prefix(extrinsic_bytes)?.1.into();
|
let bytes: Arc<[u8]> = strip_compact_prefix(extrinsic_bytes)?.1.into();
|
||||||
@@ -179,11 +180,13 @@ where
|
|||||||
let first_byte: u8 = Decode::decode(&mut &bytes[..])?;
|
let first_byte: u8 = Decode::decode(&mut &bytes[..])?;
|
||||||
|
|
||||||
let version = first_byte & VERSION_MASK;
|
let version = first_byte & VERSION_MASK;
|
||||||
if version != LATEST_EXTRINSIC_VERSION {
|
if version != 4 && version != 5 {
|
||||||
return Err(BlockError::UnsupportedVersion(version).into());
|
return Err(BlockError::UnsupportedVersion(version).into());
|
||||||
}
|
}
|
||||||
|
|
||||||
let is_signed = first_byte & SIGNATURE_MASK != 0;
|
// Hack in rudimentory support for V5 extrinsics..
|
||||||
|
let is_signed = first_byte & SIGNATURE_MASK == 0b1000_0000;
|
||||||
|
let is_general = first_byte & SIGNATURE_MASK == 0b0100_0000;
|
||||||
|
|
||||||
// Skip over the first byte which denotes the version and signing.
|
// Skip over the first byte which denotes the version and signing.
|
||||||
let cursor = &mut &bytes[1..];
|
let cursor = &mut &bytes[1..];
|
||||||
@@ -191,25 +194,37 @@ where
|
|||||||
let signed_details = is_signed
|
let signed_details = is_signed
|
||||||
.then(|| -> Result<SignedExtrinsicDetails, Error> {
|
.then(|| -> Result<SignedExtrinsicDetails, Error> {
|
||||||
let address_start_idx = bytes.len() - cursor.len();
|
let address_start_idx = bytes.len() - cursor.len();
|
||||||
// Skip over the address, signature and extra fields.
|
// Skip over the address, signature and extra fields. If V5 general
|
||||||
scale_decode::visitor::decode_with_visitor(
|
// extrinsic then there is no address and signature so skip nothing,
|
||||||
cursor,
|
if !is_general {
|
||||||
ids.address,
|
scale_decode::visitor::decode_with_visitor(
|
||||||
metadata.types(),
|
cursor,
|
||||||
scale_decode::visitor::IgnoreVisitor::new(),
|
ids.address,
|
||||||
)
|
metadata.types(),
|
||||||
.map_err(scale_decode::Error::from)?;
|
scale_decode::visitor::IgnoreVisitor::new(),
|
||||||
|
)
|
||||||
|
.map_err(scale_decode::Error::from)?;
|
||||||
|
}
|
||||||
let address_end_idx = bytes.len() - cursor.len();
|
let address_end_idx = bytes.len() - cursor.len();
|
||||||
|
|
||||||
scale_decode::visitor::decode_with_visitor(
|
if !is_general {
|
||||||
cursor,
|
scale_decode::visitor::decode_with_visitor(
|
||||||
ids.signature,
|
cursor,
|
||||||
metadata.types(),
|
ids.signature,
|
||||||
scale_decode::visitor::IgnoreVisitor::new(),
|
metadata.types(),
|
||||||
)
|
scale_decode::visitor::IgnoreVisitor::new(),
|
||||||
.map_err(scale_decode::Error::from)?;
|
)
|
||||||
|
.map_err(scale_decode::Error::from)?;
|
||||||
|
}
|
||||||
let signature_end_idx = bytes.len() - cursor.len();
|
let signature_end_idx = bytes.len() - cursor.len();
|
||||||
|
|
||||||
|
if is_general {
|
||||||
|
// V5 general extrinsics have an extension version byte.
|
||||||
|
// For now we just ignore it as a hack to decode V5 exts.
|
||||||
|
let _extension_version = u8::decode(cursor)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let extra_start_idx = bytes.len() - cursor.len();
|
||||||
scale_decode::visitor::decode_with_visitor(
|
scale_decode::visitor::decode_with_visitor(
|
||||||
cursor,
|
cursor,
|
||||||
ids.extra,
|
ids.extra,
|
||||||
@@ -223,6 +238,7 @@ where
|
|||||||
address_start_idx,
|
address_start_idx,
|
||||||
address_end_idx,
|
address_end_idx,
|
||||||
signature_end_idx,
|
signature_end_idx,
|
||||||
|
extra_start_idx,
|
||||||
extra_end_idx,
|
extra_end_idx,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -320,7 +336,7 @@ where
|
|||||||
pub fn signed_extensions_bytes(&self) -> Option<&[u8]> {
|
pub fn signed_extensions_bytes(&self) -> Option<&[u8]> {
|
||||||
self.signed_details
|
self.signed_details
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|e| &self.bytes[e.signature_end_idx..e.extra_end_idx])
|
.map(|e| &self.bytes[e.extra_start_idx..e.extra_end_idx])
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `None` if the extrinsic is not signed.
|
/// Returns `None` if the extrinsic is not signed.
|
||||||
|
|||||||
Reference in New Issue
Block a user