From 11e2f8f7d4db8ecb77d1c424e50bc0abae4a8be0 Mon Sep 17 00:00:00 2001 From: Sebastian Miasojed Date: Tue, 12 Sep 2023 22:38:24 +0200 Subject: [PATCH 1/6] Fix for Url conversion in contract info command --- crates/cargo-contract/src/cmd/info.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/crates/cargo-contract/src/cmd/info.rs b/crates/cargo-contract/src/cmd/info.rs index a5d5b393c..4821b7741 100644 --- a/crates/cargo-contract/src/cmd/info.rs +++ b/crates/cargo-contract/src/cmd/info.rs @@ -70,7 +70,8 @@ pub struct InfoCommand { impl InfoCommand { pub async fn run(&self) -> Result<(), ErrorVariant> { - let client = OnlineClient::::from_url(&self.url).await?; + let client = + OnlineClient::::from_url(url_to_string(&self.url)).await?; // All flag applied if self.all { @@ -142,3 +143,18 @@ impl InfoCommand { } } } + +// Converts a URL into a string representation without excluding the default port. +fn url_to_string(url: &url::Url) -> String { + match (url.port(), url.port_or_known_default()) { + (None, Some(port)) => { + format!( + "{}:{port}{}", + &url[..url::Position::AfterHost], + &url[url::Position::BeforePath..] + ) + .to_string() + } + _ => url.to_string(), + } +} From c6597d5df25e9c847ac83180843371cfe3ae22bf Mon Sep 17 00:00:00 2001 From: Sebastian Miasojed Date: Tue, 12 Sep 2023 22:51:39 +0200 Subject: [PATCH 2/6] code cleanup --- crates/cargo-contract/src/cmd/info.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/cargo-contract/src/cmd/info.rs b/crates/cargo-contract/src/cmd/info.rs index 4821b7741..0a0374f4d 100644 --- a/crates/cargo-contract/src/cmd/info.rs +++ b/crates/cargo-contract/src/cmd/info.rs @@ -144,8 +144,8 @@ impl InfoCommand { } } -// Converts a URL into a string representation without excluding the default port. -fn url_to_string(url: &url::Url) -> String { +// Converts a Url into a String representation without excluding the default port. +pub fn url_to_string(url: &url::Url) -> String { match (url.port(), url.port_or_known_default()) { (None, Some(port)) => { format!( From 02e31bc374928f6f2b542b2eed50e2e8a6d6328f Mon Sep 17 00:00:00 2001 From: Sebastian Miasojed Date: Tue, 12 Sep 2023 22:53:34 +0200 Subject: [PATCH 3/6] Changelog updated --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51debc367..14c868d15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add `verify` command - [#1306](https://github.com/paritytech/cargo-contract/pull/1306) - Add `--binary` flag for `info` command - [#1311](https://github.com/paritytech/cargo-contract/pull/1311/) - Add `--all` flag for `info` command - [#1319](https://github.com/paritytech/cargo-contract/pull/1319) +- Fix for a Url to String conversion in `info` command - [#1330](https://github.com/paritytech/cargo-contract/pull/1330) ## [4.0.0-alpha] From 409f6caf041ea7bd558dafaf9bf2c2f4b7a53a74 Mon Sep 17 00:00:00 2001 From: Sebastian Miasojed Date: Wed, 13 Sep 2023 22:07:05 +0200 Subject: [PATCH 4/6] Removed duplicated url_to_string function --- crates/cargo-contract/src/cmd/info.rs | 16 +---------- crates/extrinsics/src/call.rs | 5 ++-- crates/extrinsics/src/extrinsic_opts.rs | 12 -------- crates/extrinsics/src/instantiate.rs | 3 +- crates/extrinsics/src/lib.rs | 38 +++++++++++++++++++++++++ crates/extrinsics/src/remove.rs | 3 +- crates/extrinsics/src/upload.rs | 5 ++-- 7 files changed, 49 insertions(+), 33 deletions(-) diff --git a/crates/cargo-contract/src/cmd/info.rs b/crates/cargo-contract/src/cmd/info.rs index 0a0374f4d..9bdfa2d87 100644 --- a/crates/cargo-contract/src/cmd/info.rs +++ b/crates/cargo-contract/src/cmd/info.rs @@ -27,6 +27,7 @@ use contract_extrinsics::{ fetch_all_contracts, fetch_contract_info, fetch_wasm_code, + url_to_string, ErrorVariant, }; use std::{ @@ -143,18 +144,3 @@ impl InfoCommand { } } } - -// Converts a Url into a String representation without excluding the default port. -pub fn url_to_string(url: &url::Url) -> String { - match (url.port(), url.port_or_known_default()) { - (None, Some(port)) => { - format!( - "{}:{port}{}", - &url[..url::Position::AfterHost], - &url[url::Position::BeforePath..] - ) - .to_string() - } - _ => url.to_string(), - } -} diff --git a/crates/extrinsics/src/call.rs b/crates/extrinsics/src/call.rs index e29fbece3..04a43405f 100644 --- a/crates/extrinsics/src/call.rs +++ b/crates/extrinsics/src/call.rs @@ -21,6 +21,7 @@ use super::{ state, state_call, submit_extrinsic, + url_to_string, AccountId32, Balance, BalanceVariant, @@ -178,7 +179,7 @@ impl CallCommandBuilder { let signer = self.opts.extrinsic_opts.signer()?; - let url = self.opts.extrinsic_opts.url_to_string(); + let url = url_to_string(self.opts.extrinsic_opts.url()); let client = OnlineClient::from_url(url.clone()).await?; Ok(CallExec { contract: self.opts.contract.clone(), @@ -221,7 +222,7 @@ impl CallExec { /// Returns the dry run simulation result of type [`ContractExecResult`], which /// includes information about the simulated call, or an error in case of failure. pub async fn call_dry_run(&self) -> Result> { - let url = self.opts.url_to_string(); + let url = url_to_string(self.opts.url()); let token_metadata = TokenMetadata::query(&self.client).await?; let storage_deposit_limit = self .opts diff --git a/crates/extrinsics/src/extrinsic_opts.rs b/crates/extrinsics/src/extrinsic_opts.rs index 7bcb3f5a9..d9937bf9a 100644 --- a/crates/extrinsics/src/extrinsic_opts.rs +++ b/crates/extrinsics/src/extrinsic_opts.rs @@ -169,18 +169,6 @@ impl ExtrinsicOpts { Ok(keypair) } - /// Convert URL to String without omitting the default port - pub fn url_to_string(&self) -> String { - let mut res = self.url.to_string(); - match (self.url.port(), self.url.port_or_known_default()) { - (None, Some(port)) => { - res.insert_str(res.len() - 1, &format!(":{port}")); - res - } - _ => res, - } - } - /// Return the file path of the contract artifact. pub fn file(&self) -> Option<&PathBuf> { self.file.as_ref() diff --git a/crates/extrinsics/src/instantiate.rs b/crates/extrinsics/src/instantiate.rs index 178f9e087..72c720ead 100644 --- a/crates/extrinsics/src/instantiate.rs +++ b/crates/extrinsics/src/instantiate.rs @@ -20,6 +20,7 @@ use super::{ state, state_call, submit_extrinsic, + url_to_string, Balance, BalanceVariant, Client, @@ -165,7 +166,7 @@ impl InstantiateCommandBuilder { let transcoder = artifacts.contract_transcoder()?; let data = transcoder.encode(&self.opts.constructor, &self.opts.args)?; let signer = self.opts.extrinsic_opts.signer()?; - let url = self.opts.extrinsic_opts.url_to_string(); + let url = url_to_string(self.opts.extrinsic_opts.url()); let code = if let Some(code) = artifacts.code { Code::Upload(code.0) } else { diff --git a/crates/extrinsics/src/lib.rs b/crates/extrinsics/src/lib.rs index c8c3d3f56..c0e974d8b 100644 --- a/crates/extrinsics/src/lib.rs +++ b/crates/extrinsics/src/lib.rs @@ -427,6 +427,21 @@ pub async fn fetch_all_contracts( Ok(contracts) } +// Converts a Url into a String representation without excluding the default port. +pub fn url_to_string(url: &url::Url) -> String { + match (url.port(), url.port_or_known_default()) { + (None, Some(port)) => { + format!( + "{}:{port}{}", + &url[..url::Position::AfterHost], + &url[url::Position::BeforePath..] + ) + .to_string() + } + _ => url.to_string(), + } +} + /// Copy of `pallet_contracts_primitives::StorageDeposit` which implements `Serialize`, /// required for json output. #[derive(Eq, PartialEq, Ord, PartialOrd, Clone, serde::Serialize)] @@ -473,4 +488,27 @@ mod tests { ) .is_ok()) } + + #[test] + fn url_to_string_works() { + // with custom port + let url = url::Url::parse("ws://127.0.0.1:9944").unwrap(); + assert_eq!(url_to_string(&url), "ws://127.0.0.1:9944/"); + + // with default port + let url = url::Url::parse("wss://127.0.0.1:443").unwrap(); + assert_eq!(url_to_string(&url), "wss://127.0.0.1:443/"); + + // with default port and path + let url = url::Url::parse("wss://127.0.0.1:443/test/1").unwrap(); + assert_eq!(url_to_string(&url), "wss://127.0.0.1:443/test/1"); + + // with default port and domain + let url = url::Url::parse("wss://test.io:443").unwrap(); + assert_eq!(url_to_string(&url), "wss://test.io:443/"); + + // with default port, doamain and path + let url = url::Url::parse("wss://test.io/test/1").unwrap(); + assert_eq!(url_to_string(&url), "wss://test.io:443/test/1"); + } } diff --git a/crates/extrinsics/src/remove.rs b/crates/extrinsics/src/remove.rs index 47ebf14fb..02873ca55 100644 --- a/crates/extrinsics/src/remove.rs +++ b/crates/extrinsics/src/remove.rs @@ -22,6 +22,7 @@ use super::{ }, state, submit_extrinsic, + url_to_string, Client, ContractMessageTranscoder, DefaultConfig, @@ -118,7 +119,7 @@ impl RemoveCommandBuilder { artifacts_path.display() )), }?; - let url = self.opts.extrinsic_opts.url_to_string(); + let url = url_to_string(self.opts.extrinsic_opts.url()); let client = OnlineClient::from_url(url.clone()).await?; Ok(RemoveExec { diff --git a/crates/extrinsics/src/upload.rs b/crates/extrinsics/src/upload.rs index 70fb66cc1..a281173c0 100644 --- a/crates/extrinsics/src/upload.rs +++ b/crates/extrinsics/src/upload.rs @@ -25,6 +25,7 @@ use super::{ state, state_call, submit_extrinsic, + url_to_string, Balance, Client, CodeHash, @@ -105,7 +106,7 @@ impl UploadCommandBuilder { artifacts_path.display() ) })?; - let url = self.opts.extrinsic_opts.url_to_string(); + let url = url_to_string(self.opts.extrinsic_opts.url()); let client = OnlineClient::from_url(url.clone()).await?; Ok(UploadExec { opts: self.opts.extrinsic_opts.clone(), @@ -131,7 +132,7 @@ impl UploadExec { /// then sends the request using the provided URL. This operation does not modify /// the state of the blockchain. pub async fn upload_code_rpc(&self) -> Result> { - let url = self.opts.url_to_string(); + let url = url_to_string(self.opts.url()); let token_metadata = TokenMetadata::query(&self.client).await?; let storage_deposit_limit = self .opts From f19dd58aece25762ac345702f8c9fdf9fc42b5e2 Mon Sep 17 00:00:00 2001 From: Sebastian Miasojed Date: Wed, 13 Sep 2023 22:11:05 +0200 Subject: [PATCH 5/6] Typo fixed --- crates/extrinsics/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/extrinsics/src/lib.rs b/crates/extrinsics/src/lib.rs index c0e974d8b..ca91641a8 100644 --- a/crates/extrinsics/src/lib.rs +++ b/crates/extrinsics/src/lib.rs @@ -507,7 +507,7 @@ mod tests { let url = url::Url::parse("wss://test.io:443").unwrap(); assert_eq!(url_to_string(&url), "wss://test.io:443/"); - // with default port, doamain and path + // with default port, domain and path let url = url::Url::parse("wss://test.io/test/1").unwrap(); assert_eq!(url_to_string(&url), "wss://test.io:443/test/1"); } From decf1c5235225c91a3daef4bf91071f540cd672b Mon Sep 17 00:00:00 2001 From: Sebastian Miasojed Date: Thu, 14 Sep 2023 12:41:11 +0200 Subject: [PATCH 6/6] Changed url() method of ExtrinsicOpts to return String --- crates/extrinsics/src/call.rs | 7 +++---- crates/extrinsics/src/extrinsic_opts.rs | 5 +++-- crates/extrinsics/src/instantiate.rs | 5 ++--- crates/extrinsics/src/remove.rs | 5 ++--- crates/extrinsics/src/upload.rs | 7 +++---- 5 files changed, 13 insertions(+), 16 deletions(-) diff --git a/crates/extrinsics/src/call.rs b/crates/extrinsics/src/call.rs index 04a43405f..3b614883f 100644 --- a/crates/extrinsics/src/call.rs +++ b/crates/extrinsics/src/call.rs @@ -21,7 +21,6 @@ use super::{ state, state_call, submit_extrinsic, - url_to_string, AccountId32, Balance, BalanceVariant, @@ -179,8 +178,8 @@ impl CallCommandBuilder { let signer = self.opts.extrinsic_opts.signer()?; - let url = url_to_string(self.opts.extrinsic_opts.url()); - let client = OnlineClient::from_url(url.clone()).await?; + let url = self.opts.extrinsic_opts.url(); + let client = OnlineClient::from_url(url).await?; Ok(CallExec { contract: self.opts.contract.clone(), message: self.opts.message.clone(), @@ -222,7 +221,7 @@ impl CallExec { /// Returns the dry run simulation result of type [`ContractExecResult`], which /// includes information about the simulated call, or an error in case of failure. pub async fn call_dry_run(&self) -> Result> { - let url = url_to_string(self.opts.url()); + let url = self.opts.url(); let token_metadata = TokenMetadata::query(&self.client).await?; let storage_deposit_limit = self .opts diff --git a/crates/extrinsics/src/extrinsic_opts.rs b/crates/extrinsics/src/extrinsic_opts.rs index d9937bf9a..7f4096fc9 100644 --- a/crates/extrinsics/src/extrinsic_opts.rs +++ b/crates/extrinsics/src/extrinsic_opts.rs @@ -28,6 +28,7 @@ use anyhow::{ }; use crate::{ + url_to_string, Balance, BalanceVariant, ContractArtifacts, @@ -180,8 +181,8 @@ impl ExtrinsicOpts { } /// Return the URL of the substrate node. - pub fn url(&self) -> &Url { - &self.url + pub fn url(&self) -> String { + url_to_string(&self.url) } /// Return the secret URI of the signer. diff --git a/crates/extrinsics/src/instantiate.rs b/crates/extrinsics/src/instantiate.rs index 72c720ead..b0a92c73b 100644 --- a/crates/extrinsics/src/instantiate.rs +++ b/crates/extrinsics/src/instantiate.rs @@ -20,7 +20,6 @@ use super::{ state, state_call, submit_extrinsic, - url_to_string, Balance, BalanceVariant, Client, @@ -166,7 +165,7 @@ impl InstantiateCommandBuilder { let transcoder = artifacts.contract_transcoder()?; let data = transcoder.encode(&self.opts.constructor, &self.opts.args)?; let signer = self.opts.extrinsic_opts.signer()?; - let url = url_to_string(self.opts.extrinsic_opts.url()); + let url = self.opts.extrinsic_opts.url(); let code = if let Some(code) = artifacts.code { Code::Upload(code.0) } else { @@ -175,7 +174,7 @@ impl InstantiateCommandBuilder { }; let salt = self.opts.salt.clone().map(|s| s.0).unwrap_or_default(); - let client = OnlineClient::from_url(url.clone()).await?; + let client = OnlineClient::from_url(&url).await?; let token_metadata = TokenMetadata::query(&client).await?; diff --git a/crates/extrinsics/src/remove.rs b/crates/extrinsics/src/remove.rs index 02873ca55..46efd23cc 100644 --- a/crates/extrinsics/src/remove.rs +++ b/crates/extrinsics/src/remove.rs @@ -22,7 +22,6 @@ use super::{ }, state, submit_extrinsic, - url_to_string, Client, ContractMessageTranscoder, DefaultConfig, @@ -119,8 +118,8 @@ impl RemoveCommandBuilder { artifacts_path.display() )), }?; - let url = url_to_string(self.opts.extrinsic_opts.url()); - let client = OnlineClient::from_url(url.clone()).await?; + let url = self.opts.extrinsic_opts.url(); + let client = OnlineClient::from_url(url).await?; Ok(RemoveExec { final_code_hash, diff --git a/crates/extrinsics/src/upload.rs b/crates/extrinsics/src/upload.rs index a281173c0..55c0e9702 100644 --- a/crates/extrinsics/src/upload.rs +++ b/crates/extrinsics/src/upload.rs @@ -25,7 +25,6 @@ use super::{ state, state_call, submit_extrinsic, - url_to_string, Balance, Client, CodeHash, @@ -106,8 +105,8 @@ impl UploadCommandBuilder { artifacts_path.display() ) })?; - let url = url_to_string(self.opts.extrinsic_opts.url()); - let client = OnlineClient::from_url(url.clone()).await?; + let url = self.opts.extrinsic_opts.url(); + let client = OnlineClient::from_url(url).await?; Ok(UploadExec { opts: self.opts.extrinsic_opts.clone(), client, @@ -132,7 +131,7 @@ impl UploadExec { /// then sends the request using the provided URL. This operation does not modify /// the state of the blockchain. pub async fn upload_code_rpc(&self) -> Result> { - let url = url_to_string(self.opts.url()); + let url = self.opts.url(); let token_metadata = TokenMetadata::query(&self.client).await?; let storage_deposit_limit = self .opts