From 48baa68d9a76184c33fe00485a42651df439cae5 Mon Sep 17 00:00:00 2001 From: James Wilson Date: Wed, 31 May 2023 17:56:32 +0100 Subject: [PATCH] Update scale-encode, scale-decode and scale-value to latest --- Cargo.lock | 24 ++++++++++++++---------- Cargo.toml | 6 +++--- subxt/src/blocks/extrinsic_types.rs | 19 +++++++++++++------ subxt/src/events/events_type.rs | 20 ++++++++++++++------ subxt/src/runtime_api/runtime_payload.rs | 21 +++------------------ subxt/src/tx/tx_payload.rs | 7 ++++++- 6 files changed, 53 insertions(+), 44 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 27bc2a7172..ac7635c895 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2645,23 +2645,24 @@ dependencies = [ [[package]] name = "scale-decode" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e5527e4b3bf079d4c0b2f253418598c380722ba37ef20fac9088081407f2b6" +checksum = "f0459d00b0dbd2e765009924a78ef36b2ff7ba116292d732f00eb0ed8e465d15" dependencies = [ "parity-scale-codec", "primitive-types", "scale-bits", "scale-decode-derive", "scale-info", + "smallvec", "thiserror", ] [[package]] name = "scale-decode-derive" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b38741b2f78e4391b94eac6b102af0f6ea2b0f7fe65adb55d7f4004f507854db" +checksum = "4391f0dfbb6690f035f6d2a15d6a12f88cc5395c36bcc056db07ffa2a90870ec" dependencies = [ "darling 0.14.4", "proc-macro-crate", @@ -2672,23 +2673,24 @@ dependencies = [ [[package]] name = "scale-encode" -version = "0.1.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15546e5efbb45f0fc2291f7e202dee8623274c5d8bbfdf9c6886cc8b44a7ced3" +checksum = "b0401b7cdae8b8aa33725f3611a051358d5b32887ecaa0fda5953a775b2d4d76" dependencies = [ "parity-scale-codec", "primitive-types", "scale-bits", "scale-encode-derive", "scale-info", + "smallvec", "thiserror", ] [[package]] name = "scale-encode-derive" -version = "0.1.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd983cf0a9effd76138554ead18a6de542d1af175ac12fd5e91836c5c0268082" +checksum = "316e0fb10ec0fee266822bd641bab5e332a4ab80ef8c5b5ff35e5401a394f5a6" dependencies = [ "darling 0.14.4", "proc-macro-crate", @@ -2725,10 +2727,12 @@ dependencies = [ [[package]] name = "scale-value" -version = "0.7.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f549769261561e6764218f847e500588f9a79a289de49ce92f9e26642a3574" +checksum = "f2096d36e94ce9bf87d8addb752423b6b19730dc88edd7cc452bb2b90573f7a7" dependencies = [ + "base58", + "blake2", "either", "frame-metadata", "parity-scale-codec", diff --git a/Cargo.toml b/Cargo.toml index a542bbbda4..88c3269459 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,10 +55,10 @@ proc-macro2 = "1.0.59" quote = "1.0.28" regex = "1.8.3" scale-info = "2.7.0" -scale-value = "0.7.0" +scale-value = "0.10.0" scale-bits = "0.3" -scale-decode = "0.5.0" -scale-encode = "0.1.0" +scale-decode = "0.7.0" +scale-encode = "0.3.0" serde = { version = "1.0.163" } serde_json = { version = "1.0.96" } syn = { version = "2.0.15", features = ["full", "extra-traits"] } diff --git a/subxt/src/blocks/extrinsic_types.rs b/subxt/src/blocks/extrinsic_types.rs index 4b3b5b8c10..92dc42c196 100644 --- a/subxt/src/blocks/extrinsic_types.rs +++ b/subxt/src/blocks/extrinsic_types.rs @@ -382,9 +382,14 @@ where let bytes = &mut self.field_bytes(); let extrinsic_metadata = self.extrinsic_metadata()?; + let mut fields = extrinsic_metadata + .variant + .fields + .iter() + .map(|f| scale_decode::Field::new(f.ty.id, f.name.as_deref())); let decoded = >::decode_as_fields( bytes, - &extrinsic_metadata.variant.fields, + &mut fields, self.metadata.types(), )?; @@ -398,11 +403,13 @@ where if extrinsic_metadata.pallet.name() == E::PALLET && extrinsic_metadata.variant.name == E::CALL { - let decoded = E::decode_as_fields( - &mut self.field_bytes(), - &extrinsic_metadata.variant.fields, - self.metadata.types(), - )?; + let mut fields = extrinsic_metadata + .variant + .fields + .iter() + .map(|f| scale_decode::Field::new(f.ty.id, f.name.as_deref())); + let decoded = + E::decode_as_fields(&mut self.field_bytes(), &mut fields, self.metadata.types())?; Ok(Some(decoded)) } else { Ok(None) diff --git a/subxt/src/events/events_type.rs b/subxt/src/events/events_type.rs index 75d38d0eb5..e487dfc940 100644 --- a/subxt/src/events/events_type.rs +++ b/subxt/src/events/events_type.rs @@ -337,10 +337,16 @@ impl EventDetails { let bytes = &mut self.field_bytes(); let event_metadata = self.event_metadata(); + let mut fields = event_metadata + .variant + .fields + .iter() + .map(|f| scale_decode::Field::new(f.ty.id, f.name.as_deref())); + use scale_decode::DecodeAsFields; let decoded = >::decode_as_fields( bytes, - &event_metadata.variant.fields, + &mut fields, self.metadata.types(), )?; @@ -352,11 +358,13 @@ impl EventDetails { pub fn as_event(&self) -> Result, Error> { let ev_metadata = self.event_metadata(); if ev_metadata.pallet.name() == E::PALLET && ev_metadata.variant.name == E::EVENT { - let decoded = E::decode_as_fields( - &mut self.field_bytes(), - &ev_metadata.variant.fields, - self.metadata.types(), - )?; + let mut fields = ev_metadata + .variant + .fields + .iter() + .map(|f| scale_decode::Field::new(f.ty.id, f.name.as_deref())); + let decoded = + E::decode_as_fields(&mut self.field_bytes(), &mut fields, self.metadata.types())?; Ok(Some(decoded)) } else { Ok(None) diff --git a/subxt/src/runtime_api/runtime_payload.rs b/subxt/src/runtime_api/runtime_payload.rs index fe21df1fec..ec19f283da 100644 --- a/subxt/src/runtime_api/runtime_payload.rs +++ b/subxt/src/runtime_api/runtime_payload.rs @@ -92,27 +92,12 @@ impl RuntimeApiPayload .runtime_api_trait_by_name_err(&self.trait_name)? .method_by_name(&self.method_name) .ok_or_else(|| MetadataError::RuntimeMethodNotFound((*self.method_name).to_owned()))?; - - // TODO [jsdw]: This isn't good. The options are: - // 1. Tweak the Metadata to store things in this way (not great, but - // it's what we did previously). - // 2. Tweak scale-encode's methods to accept iterators over - // { name: Option<&str>, type_id: u32 }, because they shouldn't - // need to allocate anyway. I'd like us to do this, and then we can - // remove allocations from this code and probably a couple of other - // places. - let fields: Vec<_> = api_method + let mut fields = api_method .inputs() - .map(|input| scale_info::Field { - name: Some(input.name.to_owned()), - ty: input.ty.into(), - type_name: None, - docs: Default::default(), - }) - .collect(); + .map(|input| scale_encode::Field::named(input.ty, &input.name)); self.args_data - .encode_as_fields_to(&fields, metadata.types(), out)?; + .encode_as_fields_to(&mut fields, metadata.types(), out)?; Ok(()) } diff --git a/subxt/src/tx/tx_payload.rs b/subxt/src/tx/tx_payload.rs index 7a2ceaf189..431538d79b 100644 --- a/subxt/src/tx/tx_payload.rs +++ b/subxt/src/tx/tx_payload.rs @@ -152,8 +152,13 @@ impl TxPayload for Payload { pallet_index.encode_to(out); call_index.encode_to(out); + let mut fields = call + .fields + .iter() + .map(|f| scale_encode::Field::new(f.ty.id, f.name.as_deref())); + self.call_data - .encode_as_fields_to(&call.fields, metadata.types(), out)?; + .encode_as_fields_to(&mut fields, metadata.types(), out)?; Ok(()) }