From 8983080f8e9f4c059fa07a70a11492e0e789baee Mon Sep 17 00:00:00 2001 From: deuszx Date: Tue, 1 Nov 2022 03:53:46 +0100 Subject: [PATCH 1/6] Log code hash if contract is already uploaded. --- Cargo.lock | 1 + .../src/cmd/extrinsics/upload.rs | 18 +++++++++++++++--- crates/metadata/Cargo.toml | 1 + crates/metadata/src/lib.rs | 17 ++++++++++++++++- crates/transcode/src/lib.rs | 17 +++++++++-------- 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d81ed52b9..b17f5291c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -641,6 +641,7 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" name = "contract-metadata" version = "2.0.0-alpha.4" dependencies = [ + "anyhow", "impl-serde 0.4.0", "pretty_assertions", "semver", diff --git a/crates/cargo-contract/src/cmd/extrinsics/upload.rs b/crates/cargo-contract/src/cmd/extrinsics/upload.rs index 6dcccf455..c0c10ba91 100644 --- a/crates/cargo-contract/src/cmd/extrinsics/upload.rs +++ b/crates/cargo-contract/src/cmd/extrinsics/upload.rs @@ -71,12 +71,18 @@ impl UploadCommand { let crate_metadata = CrateMetadata::from_manifest_path( self.extrinsic_opts.manifest_path.as_ref(), )?; - let transcoder = ContractMessageTranscoder::load(crate_metadata.metadata_path())?; + let contract_metadata = + contract_metadata::ContractMetadata::load(&crate_metadata.metadata_path())?; + let transcoder = ContractMessageTranscoder::from_metadata(contract_metadata) + .context(format!( + "Failed to deserialize ink project metadata from contract metadata {}", + crate_metadata.metadata_path().display() + ))?; let signer = super::pair_signer(self.extrinsic_opts.signer()?); let wasm_path = match &self.wasm_path { Some(wasm_path) => wasm_path.clone(), - None => crate_metadata.dest_wasm, + None => crate_metadata.dest_wasm.clone(), }; tracing::debug!("Contract code path: {}", wasm_path.display()); @@ -126,7 +132,13 @@ impl UploadCommand { } Ok(()) } else { - Err("This contract has already been uploaded".into()) + let code_hash = contract_metadata::ContractMetadata::load( + &crate_metadata.metadata_path(), + )?.source.hash; + Err(format!( + "This contract has already been uploaded with code hash: {:?}", + code_hash + ).as_str().into()) } }) } diff --git a/crates/metadata/Cargo.toml b/crates/metadata/Cargo.toml index 2942b2ec3..98f434ad3 100644 --- a/crates/metadata/Cargo.toml +++ b/crates/metadata/Cargo.toml @@ -19,6 +19,7 @@ semver = { version = "1.0.14", features = ["serde"] } serde = { version = "1.0.146", default-features = false, features = ["derive"] } serde_json = "1.0.87" url = { version = "2.3.1", features = ["serde"] } +anyhow = "1.0.66" [dev-dependencies] pretty_assertions = "1.3.0" diff --git a/crates/metadata/src/lib.rs b/crates/metadata/src/lib.rs index 4735dabaf..49f42d46e 100644 --- a/crates/metadata/src/lib.rs +++ b/crates/metadata/src/lib.rs @@ -58,6 +58,7 @@ mod byte_str; +use anyhow::{Result, Context}; use semver::Version; use serde::{ de, @@ -75,7 +76,7 @@ use std::{ Formatter, Result as DisplayResult, }, - str::FromStr, + str::FromStr, path::Path, fs::File, }; use url::Url; @@ -113,6 +114,20 @@ impl ContractMetadata { pub fn remove_source_wasm_attribute(&mut self) { self.source.wasm = None; } + + /// Reads the file and tries to parse it as instance of `ContractMetadata`. + pub fn load

(metadata_path: &P) -> Result + where + P: AsRef, + { + let path = metadata_path.as_ref(); + let file = File::open(path) + .context(format!("Failed to open metadata file {}", path.display()))?; + serde_json::from_reader(file).context(format!( + "Failed to deserialize metadata file {}", + path.display() + )) + } } /// Representation of the Wasm code hash. diff --git a/crates/transcode/src/lib.rs b/crates/transcode/src/lib.rs index b0b9626c2..debedf89f 100644 --- a/crates/transcode/src/lib.rs +++ b/crates/transcode/src/lib.rs @@ -137,7 +137,6 @@ use scale_info::{ }; use std::{ fmt::Debug, - fs::File, path::Path, }; @@ -166,13 +165,8 @@ impl ContractMessageTranscoder { P: AsRef, { let path = metadata_path.as_ref(); - let file = File::open(path) - .context(format!("Failed to open metadata file {}", path.display()))?; - let metadata: contract_metadata::ContractMetadata = serde_json::from_reader(file) - .context(format!( - "Failed to deserialize metadata file {}", - path.display() - ))?; + let metadata: contract_metadata::ContractMetadata = + contract_metadata::ContractMetadata::load(&metadata_path)?; let ink_metadata = serde_json::from_value(serde_json::Value::Object( metadata.abi, )) @@ -184,6 +178,13 @@ impl ContractMessageTranscoder { Ok(Self::new(ink_metadata)) } + /// Constructs an instance of `Self` out of a contract metadata. + /// + /// Returns error if can't deserialize metadata's ABI. + pub fn from_metadata(metadata: contract_metadata::ContractMetadata) -> Result { + Ok(Self::new(serde_json::from_value(serde_json::Value::Object(metadata.abi))?)) + } + pub fn encode(&self, name: &str, args: I) -> Result> where I: IntoIterator, From e0d3e795be6f2b6fedc6ee173b263db2f35b8127 Mon Sep 17 00:00:00 2001 From: deuszx Date: Tue, 1 Nov 2022 08:28:38 +0100 Subject: [PATCH 2/6] Reimplement from_metadata as TryFrom --- .../cargo-contract/src/cmd/extrinsics/upload.rs | 2 +- crates/transcode/src/lib.rs | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/crates/cargo-contract/src/cmd/extrinsics/upload.rs b/crates/cargo-contract/src/cmd/extrinsics/upload.rs index c0c10ba91..061dd947a 100644 --- a/crates/cargo-contract/src/cmd/extrinsics/upload.rs +++ b/crates/cargo-contract/src/cmd/extrinsics/upload.rs @@ -73,7 +73,7 @@ impl UploadCommand { )?; let contract_metadata = contract_metadata::ContractMetadata::load(&crate_metadata.metadata_path())?; - let transcoder = ContractMessageTranscoder::from_metadata(contract_metadata) + let transcoder = ContractMessageTranscoder::try_from(contract_metadata) .context(format!( "Failed to deserialize ink project metadata from contract metadata {}", crate_metadata.metadata_path().display() diff --git a/crates/transcode/src/lib.rs b/crates/transcode/src/lib.rs index debedf89f..170de5e1b 100644 --- a/crates/transcode/src/lib.rs +++ b/crates/transcode/src/lib.rs @@ -178,13 +178,6 @@ impl ContractMessageTranscoder { Ok(Self::new(ink_metadata)) } - /// Constructs an instance of `Self` out of a contract metadata. - /// - /// Returns error if can't deserialize metadata's ABI. - pub fn from_metadata(metadata: contract_metadata::ContractMetadata) -> Result { - Ok(Self::new(serde_json::from_value(serde_json::Value::Object(metadata.abi))?)) - } - pub fn encode(&self, name: &str, args: I) -> Result> where I: IntoIterator, @@ -345,6 +338,14 @@ impl ContractMessageTranscoder { } } +impl TryFrom for ContractMessageTranscoder { + type Error = anyhow::Error; + + fn try_from(metadata: contract_metadata::ContractMetadata) -> Result { + Ok(Self::new(serde_json::from_value(serde_json::Value::Object(metadata.abi))?)) + } +} + #[derive(Debug)] pub enum CompositeTypeFields { Named(Vec), From 5731420b651153f1b074c63b35edf4c9feb038b5 Mon Sep 17 00:00:00 2001 From: deuszx Date: Tue, 1 Nov 2022 08:29:11 +0100 Subject: [PATCH 3/6] Copy instance of code hash rather than loading the whole metadata from file. --- crates/cargo-contract/src/cmd/extrinsics/upload.rs | 6 ++---- crates/metadata/src/lib.rs | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/crates/cargo-contract/src/cmd/extrinsics/upload.rs b/crates/cargo-contract/src/cmd/extrinsics/upload.rs index 061dd947a..77ecdf71c 100644 --- a/crates/cargo-contract/src/cmd/extrinsics/upload.rs +++ b/crates/cargo-contract/src/cmd/extrinsics/upload.rs @@ -73,6 +73,7 @@ impl UploadCommand { )?; let contract_metadata = contract_metadata::ContractMetadata::load(&crate_metadata.metadata_path())?; + let code_hash = contract_metadata.source.hash; let transcoder = ContractMessageTranscoder::try_from(contract_metadata) .context(format!( "Failed to deserialize ink project metadata from contract metadata {}", @@ -82,7 +83,7 @@ impl UploadCommand { let wasm_path = match &self.wasm_path { Some(wasm_path) => wasm_path.clone(), - None => crate_metadata.dest_wasm.clone(), + None => crate_metadata.dest_wasm, }; tracing::debug!("Contract code path: {}", wasm_path.display()); @@ -132,9 +133,6 @@ impl UploadCommand { } Ok(()) } else { - let code_hash = contract_metadata::ContractMetadata::load( - &crate_metadata.metadata_path(), - )?.source.hash; Err(format!( "This contract has already been uploaded with code hash: {:?}", code_hash diff --git a/crates/metadata/src/lib.rs b/crates/metadata/src/lib.rs index 49f42d46e..49976be98 100644 --- a/crates/metadata/src/lib.rs +++ b/crates/metadata/src/lib.rs @@ -131,7 +131,7 @@ impl ContractMetadata { } /// Representation of the Wasm code hash. -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize)] pub struct CodeHash( #[serde( serialize_with = "byte_str::serialize_as_byte_str", From 3c794c85b87b00632c3290dad0f2d09cb76dd1e8 Mon Sep 17 00:00:00 2001 From: deuszx <95355183+deuszx@users.noreply.github.com> Date: Tue, 1 Nov 2022 18:35:45 +0100 Subject: [PATCH 4/6] Update crates/cargo-contract/src/cmd/extrinsics/upload.rs Co-authored-by: Andrew Jones --- crates/cargo-contract/src/cmd/extrinsics/upload.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/crates/cargo-contract/src/cmd/extrinsics/upload.rs b/crates/cargo-contract/src/cmd/extrinsics/upload.rs index 77ecdf71c..e424f4b97 100644 --- a/crates/cargo-contract/src/cmd/extrinsics/upload.rs +++ b/crates/cargo-contract/src/cmd/extrinsics/upload.rs @@ -133,10 +133,7 @@ impl UploadCommand { } Ok(()) } else { - Err(format!( - "This contract has already been uploaded with code hash: {:?}", - code_hash - ).as_str().into()) + Err(anyhow::anyhow!("This contract has already been uploaded with code hash: {:?}", code_hash)) } }) } From 1af4fef93d8ca5ce3612d81086a426bb125d4a43 Mon Sep 17 00:00:00 2001 From: deuszx Date: Tue, 1 Nov 2022 08:55:18 +0100 Subject: [PATCH 5/6] Fix compilation. --- crates/cargo-contract/src/cmd/extrinsics/upload.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cargo-contract/src/cmd/extrinsics/upload.rs b/crates/cargo-contract/src/cmd/extrinsics/upload.rs index e424f4b97..205aa083f 100644 --- a/crates/cargo-contract/src/cmd/extrinsics/upload.rs +++ b/crates/cargo-contract/src/cmd/extrinsics/upload.rs @@ -133,7 +133,7 @@ impl UploadCommand { } Ok(()) } else { - Err(anyhow::anyhow!("This contract has already been uploaded with code hash: {:?}", code_hash)) + Err(anyhow::anyhow!("This contract has already been uploaded with code hash: {:?}", code_hash).into()) } }) } From 360d2a008890351ac2d86fed13f89615bc3d3e2d Mon Sep 17 00:00:00 2001 From: deuszx Date: Tue, 1 Nov 2022 09:02:59 +0100 Subject: [PATCH 6/6] Format code. --- crates/cargo-contract/src/cmd/extrinsics/upload.rs | 10 +++++++--- crates/metadata/src/lib.rs | 9 +++++++-- crates/transcode/src/lib.rs | 8 ++++++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/crates/cargo-contract/src/cmd/extrinsics/upload.rs b/crates/cargo-contract/src/cmd/extrinsics/upload.rs index 205aa083f..7087c9cbd 100644 --- a/crates/cargo-contract/src/cmd/extrinsics/upload.rs +++ b/crates/cargo-contract/src/cmd/extrinsics/upload.rs @@ -74,8 +74,8 @@ impl UploadCommand { let contract_metadata = contract_metadata::ContractMetadata::load(&crate_metadata.metadata_path())?; let code_hash = contract_metadata.source.hash; - let transcoder = ContractMessageTranscoder::try_from(contract_metadata) - .context(format!( + let transcoder = + ContractMessageTranscoder::try_from(contract_metadata).context(format!( "Failed to deserialize ink project metadata from contract metadata {}", crate_metadata.metadata_path().display() ))?; @@ -133,7 +133,11 @@ impl UploadCommand { } Ok(()) } else { - Err(anyhow::anyhow!("This contract has already been uploaded with code hash: {:?}", code_hash).into()) + Err(anyhow::anyhow!( + "This contract has already been uploaded with code hash: {:?}", + code_hash + ) + .into()) } }) } diff --git a/crates/metadata/src/lib.rs b/crates/metadata/src/lib.rs index 49976be98..9943f0c7d 100644 --- a/crates/metadata/src/lib.rs +++ b/crates/metadata/src/lib.rs @@ -58,7 +58,10 @@ mod byte_str; -use anyhow::{Result, Context}; +use anyhow::{ + Context, + Result, +}; use semver::Version; use serde::{ de, @@ -76,7 +79,9 @@ use std::{ Formatter, Result as DisplayResult, }, - str::FromStr, path::Path, fs::File, + fs::File, + path::Path, + str::FromStr, }; use url::Url; diff --git a/crates/transcode/src/lib.rs b/crates/transcode/src/lib.rs index 170de5e1b..85909504a 100644 --- a/crates/transcode/src/lib.rs +++ b/crates/transcode/src/lib.rs @@ -341,8 +341,12 @@ impl ContractMessageTranscoder { impl TryFrom for ContractMessageTranscoder { type Error = anyhow::Error; - fn try_from(metadata: contract_metadata::ContractMetadata) -> Result { - Ok(Self::new(serde_json::from_value(serde_json::Value::Object(metadata.abi))?)) + fn try_from( + metadata: contract_metadata::ContractMetadata, + ) -> Result { + Ok(Self::new(serde_json::from_value( + serde_json::Value::Object(metadata.abi), + )?)) } }