From 67676bef3404111e9c847eca879a9cfdc85e5e46 Mon Sep 17 00:00:00 2001 From: Tadeo hepperle Date: Wed, 2 Aug 2023 18:59:10 +0200 Subject: [PATCH] fix the encoding nit --- examples/wasm-example/Cargo.lock | 88 ++++++++++----------- examples/wasm-example/src/routes/signing.rs | 4 +- examples/wasm-example/src/services.rs | 36 ++++----- 3 files changed, 60 insertions(+), 68 deletions(-) diff --git a/examples/wasm-example/Cargo.lock b/examples/wasm-example/Cargo.lock index 63aea8e290..701700e09e 100644 --- a/examples/wasm-example/Cargo.lock +++ b/examples/wasm-example/Cargo.lock @@ -113,7 +113,7 @@ checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -537,7 +537,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -559,7 +559,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core 0.20.3", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -762,7 +762,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -1704,7 +1704,7 @@ checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -2005,9 +2005,9 @@ checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "scale-bits" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd7aca73785181cc41f0bbe017263e682b585ca660540ba569133901d013ecf" +checksum = "036575c29af9b6e4866ffb7fa055dbf623fe7a9cc159b33786de6013a6969d89" dependencies = [ "parity-scale-codec", "scale-info", @@ -2016,24 +2016,24 @@ dependencies = [ [[package]] name = "scale-decode" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0459d00b0dbd2e765009924a78ef36b2ff7ba116292d732f00eb0ed8e465d15" +checksum = "7789f5728e4e954aaa20cadcc370b99096fb8645fca3c9333ace44bb18f30095" dependencies = [ + "derive_more", "parity-scale-codec", "primitive-types", "scale-bits", "scale-decode-derive", "scale-info", "smallvec", - "thiserror", ] [[package]] name = "scale-decode-derive" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4391f0dfbb6690f035f6d2a15d6a12f88cc5395c36bcc056db07ffa2a90870ec" +checksum = "27873eb6005868f8cc72dcfe109fae664cf51223d35387bc2f28be4c28d94c47" dependencies = [ "darling 0.14.4", "proc-macro-crate", @@ -2044,24 +2044,24 @@ dependencies = [ [[package]] name = "scale-encode" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0401b7cdae8b8aa33725f3611a051358d5b32887ecaa0fda5953a775b2d4d76" +checksum = "6d70cb4b29360105483fac1ed567ff95d65224a14dd275b6303ed0a654c78de5" dependencies = [ + "derive_more", "parity-scale-codec", "primitive-types", "scale-bits", "scale-encode-derive", "scale-info", "smallvec", - "thiserror", ] [[package]] name = "scale-encode-derive" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "316e0fb10ec0fee266822bd641bab5e332a4ab80ef8c5b5ff35e5401a394f5a6" +checksum = "995491f110efdc6bea96d6a746140e32bfceb4ea47510750a5467295a4707a25" dependencies = [ "darling 0.14.4", "proc-macro-crate", @@ -2098,12 +2098,13 @@ dependencies = [ [[package]] name = "scale-value" -version = "0.10.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2096d36e94ce9bf87d8addb752423b6b19730dc88edd7cc452bb2b90573f7a7" +checksum = "6538d1cc1af9c0baf401c57da8a6d4730ef582db0d330d2efa56ec946b5b0283" dependencies = [ "base58", "blake2", + "derive_more", "either", "frame-metadata 15.1.0", "parity-scale-codec", @@ -2112,7 +2113,6 @@ dependencies = [ "scale-encode", "scale-info", "serde", - "thiserror", "yap", ] @@ -2194,9 +2194,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.175" +version = "1.0.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d25439cd7397d044e2748a6fe2432b5e85db703d6d097bd014b3c0ad1ebff0b" +checksum = "0ea67f183f058fe88a4e3ec6e2788e003840893b91bac4559cabedd00863b3ed" dependencies = [ "serde_derive", ] @@ -2214,20 +2214,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.175" +version = "1.0.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b23f7ade6f110613c0d63858ddb8b94c1041f550eab58a16b371bdf2c9c80ab4" +checksum = "24e744d7782b686ab3b73267ef05697159cc0e5abbed3f47f9933165e5219036" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] name = "serde_json" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -2490,7 +2490,7 @@ checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" [[package]] name = "subxt" -version = "0.30.0" +version = "0.31.0" dependencies = [ "base58", "blake2", @@ -2521,7 +2521,7 @@ dependencies = [ [[package]] name = "subxt-codegen" -version = "0.30.0" +version = "0.31.0" dependencies = [ "frame-metadata 16.0.0", "heck", @@ -2532,14 +2532,14 @@ dependencies = [ "quote", "scale-info", "subxt-metadata", - "syn 2.0.27", + "syn 2.0.28", "thiserror", "tokio", ] [[package]] name = "subxt-lightclient" -version = "0.30.0" +version = "0.31.0" dependencies = [ "futures", "futures-timer", @@ -2563,17 +2563,17 @@ dependencies = [ [[package]] name = "subxt-macro" -version = "0.30.0" +version = "0.31.0" dependencies = [ "darling 0.20.3", "proc-macro-error", "subxt-codegen", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] name = "subxt-metadata" -version = "0.30.0" +version = "0.31.0" dependencies = [ "frame-metadata 16.0.0", "parity-scale-codec", @@ -2595,9 +2595,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.27" +version = "2.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" dependencies = [ "proc-macro2", "quote", @@ -2647,7 +2647,7 @@ checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -2700,7 +2700,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -2783,7 +2783,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -2895,7 +2895,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", "wasm-bindgen-shared", ] @@ -2929,7 +2929,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3136,9 +3136,9 @@ dependencies = [ [[package]] name = "yap" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2a7eb6d82a11e4d0b8e6bda8347169aff4ccd8235d039bba7c47482d977dcf7" +checksum = "ff4524214bc4629eba08d78ceb1d6507070cc0bcbbed23af74e19e6e924a24cf" [[package]] name = "yew" @@ -3226,5 +3226,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] diff --git a/examples/wasm-example/src/routes/signing.rs b/examples/wasm-example/src/routes/signing.rs index 44fe024a56..9fd8a9347a 100644 --- a/examples/wasm-example/src/routes/signing.rs +++ b/examples/wasm-example/src/routes/signing.rs @@ -147,7 +147,7 @@ impl Component for SigningExamplesComponent { } }; - let Ok(signature) = extension_signature_for_partial_extrinsic(&partial_extrinsic, &api, &account_id, account_source, account_address).await else { + let Ok(signature) = extension_signature_for_partial_extrinsic(partial_extrinsic.call_data(), &api, &account_id, account_source, account_address).await else { return Message::Error(anyhow!("Signing via extension failed")); }; @@ -193,7 +193,7 @@ impl Component for SigningExamplesComponent { match submit_wait_finalized_and_get_extrinsic_success_event( signed_extrinsic, ) - .await + .await { Ok(remark_event) => Message::ExtrinsicFinalized { remark_event }, Err(err) => Message::ExtrinsicFailed(err), diff --git a/examples/wasm-example/src/services.rs b/examples/wasm-example/src/services.rs index b1bd978527..b9490f1f8c 100644 --- a/examples/wasm-example/src/services.rs +++ b/examples/wasm-example/src/services.rs @@ -5,9 +5,8 @@ use serde::{Deserialize, Serialize}; use serde_json::json; use std::fmt::Write; use subxt::ext::codec::Encode; -use subxt::tx::PartialExtrinsic; -use subxt::{self, OnlineClient, PolkadotConfig}; use subxt::utils::AccountId32; +use subxt::{self, OnlineClient, PolkadotConfig}; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::JsFuture; use yew::{AttrValue, Callback}; @@ -113,41 +112,34 @@ pub async fn get_accounts() -> Result, anyhow::Error> { Ok(accounts) } +// represent byte slice as a hex string fn to_hex(bytes: impl AsRef<[u8]>) -> String { format!("0x{}", hex::encode(bytes.as_ref())) } -fn encode_to_hex(input: &E) -> String { - format!("0x{}", hex::encode(input.encode())) +// encode a value with scale encoding and then represent as a hex string +fn scale_encode_to_hex(input: &E) -> String { + to_hex(input.encode()) } -/// this is used because numeric types (e.g. u32) are encoded as little-endian via scale (e.g. 9430 -> d6240000) -/// while we need a big-endian representation for the json (e.g. 9430 -> 000024d6). -fn encode_to_hex_reverse(input: &E) -> String { - let mut bytes = input.encode(); - bytes.reverse(); - format!("0x{}", hex::encode(bytes)) -} - - /// communicates with JavaScript to obtain a signature for the `partial_extrinsic` via a browser extension (e.g. polkadot-js or Talisman) /// /// Some parameters are hard-coded here and not taken from the partial_extrinsic itself (mortality_checkpoint, era, tip). pub async fn extension_signature_for_partial_extrinsic( - partial_extrinsic: &PartialExtrinsic>, + call_data: &[u8], api: &OnlineClient, account_id: &AccountId32, account_source: String, account_address: String, ) -> Result, anyhow::Error> { - let spec_version = encode_to_hex_reverse(&api.runtime_version().spec_version); - let transaction_version = encode_to_hex_reverse(&api.runtime_version().transaction_version); - let mortality_checkpoint = encode_to_hex(&api.genesis_hash()); - let era = encode_to_hex(&subxt::config::extrinsic_params::Era::Immortal); - let genesis_hash = encode_to_hex(&api.genesis_hash()); - let method = to_hex(partial_extrinsic.call_data()); + let spec_version = to_hex(api.runtime_version().spec_version.to_be_bytes()); + let transaction_version = to_hex(api.runtime_version().transaction_version.to_be_bytes()); + let mortality_checkpoint = scale_encode_to_hex(&api.genesis_hash()); + let era = scale_encode_to_hex(&subxt::config::extrinsic_params::Era::Immortal); + let genesis_hash = scale_encode_to_hex(&api.genesis_hash()); + let method = to_hex(call_data); let nonce = api.tx().account_nonce(account_id).await?; - let nonce = encode_to_hex_reverse(&nonce); + let nonce = to_hex(nonce.to_be_bytes()); let signed_extensions: Vec = api .metadata() .extrinsic() @@ -155,7 +147,7 @@ pub async fn extension_signature_for_partial_extrinsic( .iter() .map(|e| e.identifier().to_string()) .collect(); - let tip = encode_to_hex(&subxt::config::polkadot::PlainTip::new(0)); + let tip = scale_encode_to_hex(&subxt::config::polkadot::PlainTip::new(0)); let payload = json!({ "specVersion": spec_version,