diff --git a/Cargo.lock b/Cargo.lock index d7510c044e..ce2ae275b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -327,7 +327,7 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "artifacts" -version = "0.36.1" +version = "0.37.0" dependencies = [ "substrate-runner", ] @@ -1812,7 +1812,7 @@ dependencies = [ [[package]] name = "generate-custom-metadata" -version = "0.36.1" +version = "0.37.0" dependencies = [ "frame-metadata 16.0.0", "parity-scale-codec", @@ -2309,7 +2309,7 @@ dependencies = [ [[package]] name = "integration-tests" -version = "0.36.1" +version = "0.37.0" dependencies = [ "assert_matches", "cfg_aliases", @@ -4745,7 +4745,7 @@ dependencies = [ [[package]] name = "substrate-runner" -version = "0.36.1" +version = "0.37.0" [[package]] name = "subtle" @@ -4755,7 +4755,7 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "subxt" -version = "0.36.1" +version = "0.37.0" dependencies = [ "assert_matches", "async-trait", @@ -4798,7 +4798,7 @@ dependencies = [ [[package]] name = "subxt-cli" -version = "0.36.1" +version = "0.37.0" dependencies = [ "clap 4.5.4", "color-eyre", @@ -4827,7 +4827,7 @@ dependencies = [ [[package]] name = "subxt-codegen" -version = "0.36.1" +version = "0.37.0" dependencies = [ "frame-metadata 16.0.0", "getrandom", @@ -4847,7 +4847,7 @@ dependencies = [ [[package]] name = "subxt-core" -version = "0.36.1" +version = "0.37.1" dependencies = [ "assert_matches", "base58", @@ -4879,7 +4879,7 @@ dependencies = [ [[package]] name = "subxt-lightclient" -version = "0.36.1" +version = "0.37.0" dependencies = [ "futures", "futures-timer", @@ -4904,7 +4904,7 @@ dependencies = [ [[package]] name = "subxt-macro" -version = "0.36.1" +version = "0.37.0" dependencies = [ "darling 0.20.8", "parity-scale-codec", @@ -4917,7 +4917,7 @@ dependencies = [ [[package]] name = "subxt-metadata" -version = "0.36.1" +version = "0.37.0" dependencies = [ "assert_matches", "bitvec", @@ -4931,7 +4931,7 @@ dependencies = [ [[package]] name = "subxt-signer" -version = "0.36.1" +version = "0.37.0" dependencies = [ "bip32", "bip39", @@ -4958,7 +4958,7 @@ dependencies = [ [[package]] name = "subxt-test-macro" -version = "0.36.1" +version = "0.37.0" dependencies = [ "quote", "syn 2.0.60", @@ -5021,7 +5021,7 @@ dependencies = [ [[package]] name = "test-runtime" -version = "0.36.1" +version = "0.37.0" dependencies = [ "hex", "impl-serde", @@ -5446,7 +5446,7 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ui-tests" -version = "0.36.1" +version = "0.37.0" dependencies = [ "frame-metadata 16.0.0", "generate-custom-metadata", diff --git a/core/Cargo.toml b/core/Cargo.toml index 7e6019ff61..3e62e8e72f 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "subxt-core" -version.workspace = true +version = "0.37.1" authors.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/core/src/blocks/extrinsics.rs b/core/src/blocks/extrinsics.rs index 283431f206..7734f3fb10 100644 --- a/core/src/blocks/extrinsics.rs +++ b/core/src/blocks/extrinsics.rs @@ -149,7 +149,9 @@ pub struct SignedExtrinsicDetails { address_end_idx: usize, /// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the signature. Equivalent to extra_start_idx. 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, } @@ -165,9 +167,8 @@ where metadata: Metadata, ids: ExtrinsicPartTypeIds, ) -> Result, Error> { - const SIGNATURE_MASK: u8 = 0b1000_0000; - const VERSION_MASK: u8 = 0b0111_1111; - const LATEST_EXTRINSIC_VERSION: u8 = 4; + const SIGNATURE_MASK: u8 = 0b1100_0000; + const VERSION_MASK: u8 = 0b0011_1111; // removing the compact encoded prefix: 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 version = first_byte & VERSION_MASK; - if version != LATEST_EXTRINSIC_VERSION { + if version != 4 && version != 5 { 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. let cursor = &mut &bytes[1..]; @@ -191,25 +194,37 @@ where let signed_details = is_signed .then(|| -> Result { let address_start_idx = bytes.len() - cursor.len(); - // Skip over the address, signature and extra fields. - scale_decode::visitor::decode_with_visitor( - cursor, - ids.address, - metadata.types(), - scale_decode::visitor::IgnoreVisitor::new(), - ) - .map_err(scale_decode::Error::from)?; + // Skip over the address, signature and extra fields. If V5 general + // extrinsic then there is no address and signature so skip nothing, + if !is_general { + scale_decode::visitor::decode_with_visitor( + cursor, + ids.address, + metadata.types(), + scale_decode::visitor::IgnoreVisitor::new(), + ) + .map_err(scale_decode::Error::from)?; + } let address_end_idx = bytes.len() - cursor.len(); - scale_decode::visitor::decode_with_visitor( - cursor, - ids.signature, - metadata.types(), - scale_decode::visitor::IgnoreVisitor::new(), - ) - .map_err(scale_decode::Error::from)?; + if !is_general { + scale_decode::visitor::decode_with_visitor( + cursor, + ids.signature, + metadata.types(), + scale_decode::visitor::IgnoreVisitor::new(), + ) + .map_err(scale_decode::Error::from)?; + } 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( cursor, ids.extra, @@ -223,6 +238,7 @@ where address_start_idx, address_end_idx, signature_end_idx, + extra_start_idx, extra_end_idx, }) }) @@ -320,7 +336,7 @@ where pub fn signed_extensions_bytes(&self) -> Option<&[u8]> { self.signed_details .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.