From 53ec07e961c7bc4900c700f920eeba011971e651 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Fri, 21 Oct 2022 10:59:59 +0100 Subject: [PATCH 01/17] WIP attempting to read event metadata marker --- crates/cargo-contract/src/cmd/metadata.rs | 25 ++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/crates/cargo-contract/src/cmd/metadata.rs b/crates/cargo-contract/src/cmd/metadata.rs index 0e4420329..ab2b82123 100644 --- a/crates/cargo-contract/src/cmd/metadata.rs +++ b/crates/cargo-contract/src/cmd/metadata.rs @@ -90,12 +90,32 @@ pub(crate) fn execute( let fname_bundle = format!("{}.contract", crate_metadata.contract_artifact_name); let out_path_bundle = target_directory.join(fname_bundle); + let wasm = fs::read(final_contract_wasm)?; + + let module: parity_wasm::elements::Module = parity_wasm::deserialize_buffer(&wasm)?; + let events = + module.import_section() + .map(|section| section.entries()) + .unwrap_or(&[]) + .iter() + .filter_map(|entry| { + println!("FIELD {}", entry.field()); + if entry.field().starts_with("__ink_event_metadata") { + Some(entry.field().clone()) + } else { + None + } + }); + for event in events { + println!("EVENT {}", event) + } + // build the extended contract project metadata let ExtendedMetadataResult { source, contract, user, - } = extended_metadata(crate_metadata, final_contract_wasm)?; + } = extended_metadata(crate_metadata, wasm)?; let generate_metadata = |manifest_path: &ManifestPath| -> Result<()> { let mut current_progress = 5; @@ -170,7 +190,7 @@ pub(crate) fn execute( /// Generate the extended contract project metadata fn extended_metadata( crate_metadata: &CrateMetadata, - final_contract_wasm: &Path, + wasm: Vec, ) -> Result { let contract_package = &crate_metadata.root_package; let ink_version = &crate_metadata.ink_version; @@ -191,7 +211,6 @@ fn extended_metadata( let source = { let lang = SourceLanguage::new(Language::Ink, ink_version.clone()); let compiler = SourceCompiler::new(Compiler::RustC, rust_version); - let wasm = fs::read(final_contract_wasm)?; let hash = blake2_hash(wasm.as_slice()); Source::new(Some(SourceWasm::new(wasm)), hash, lang, compiler) }; From 7efd87ee6e6904eb3e5f5f5c9ec03e889fa03073 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Fri, 21 Oct 2022 16:57:11 +0100 Subject: [PATCH 02/17] Introduce ink_event_metadata_externs to MetadataPackage --- crates/cargo-contract/src/cmd/metadata.rs | 43 ++++--- .../cargo-contract/src/workspace/manifest.rs | 59 +++++----- .../cargo-contract/src/workspace/metadata.rs | 106 +++++++++++------- crates/cargo-contract/src/workspace/mod.rs | 3 +- 4 files changed, 120 insertions(+), 91 deletions(-) diff --git a/crates/cargo-contract/src/cmd/metadata.rs b/crates/cargo-contract/src/cmd/metadata.rs index ab2b82123..e419d395c 100644 --- a/crates/cargo-contract/src/cmd/metadata.rs +++ b/crates/cargo-contract/src/cmd/metadata.rs @@ -56,6 +56,7 @@ use std::{ use url::Url; const METADATA_FILE: &str = "metadata.json"; +const INK_EVENT_METADATA_SECTION_PREFIX: &str = "__ink_event_metadata_"; /// Metadata generation result. #[derive(serde::Serialize)] @@ -90,32 +91,12 @@ pub(crate) fn execute( let fname_bundle = format!("{}.contract", crate_metadata.contract_artifact_name); let out_path_bundle = target_directory.join(fname_bundle); - let wasm = fs::read(final_contract_wasm)?; - - let module: parity_wasm::elements::Module = parity_wasm::deserialize_buffer(&wasm)?; - let events = - module.import_section() - .map(|section| section.entries()) - .unwrap_or(&[]) - .iter() - .filter_map(|entry| { - println!("FIELD {}", entry.field()); - if entry.field().starts_with("__ink_event_metadata") { - Some(entry.field().clone()) - } else { - None - } - }); - for event in events { - println!("EVENT {}", event) - } - // build the extended contract project metadata let ExtendedMetadataResult { source, contract, user, - } = extended_metadata(crate_metadata, wasm)?; + } = extended_metadata(crate_metadata, final_contract_wasm)?; let generate_metadata = |manifest_path: &ManifestPath| -> Result<()> { let mut current_progress = 5; @@ -165,6 +146,22 @@ pub(crate) fn execute( Ok(()) }; + let module: parity_wasm::elements::Module = + parity_wasm::deserialize_file(&crate_metadata.original_wasm)?; + let ink_event_metadata_externs = module + .custom_sections() + .filter_map(|section| { + if section + .name() + .starts_with(INK_EVENT_METADATA_SECTION_PREFIX) + { + Some(section.name().to_owned()) + } else { + None + } + }) + .collect::>(); + if unstable_options.original_manifest { generate_metadata(&crate_metadata.manifest_path)?; } else { @@ -177,6 +174,7 @@ pub(crate) fn execute( })? .with_metadata_gen_package( crate_metadata.manifest_path.absolute_directory()?, + ink_event_metadata_externs, )? .using_temp(generate_metadata)?; } @@ -190,7 +188,7 @@ pub(crate) fn execute( /// Generate the extended contract project metadata fn extended_metadata( crate_metadata: &CrateMetadata, - wasm: Vec, + final_contract_wasm: &Path, ) -> Result { let contract_package = &crate_metadata.root_package; let ink_version = &crate_metadata.ink_version; @@ -211,6 +209,7 @@ fn extended_metadata( let source = { let lang = SourceLanguage::new(Language::Ink, ink_version.clone()); let compiler = SourceCompiler::new(Compiler::RustC, rust_version); + let wasm = fs::read(final_contract_wasm)?; let hash = blake2_hash(wasm.as_slice()); Source::new(Some(SourceWasm::new(wasm)), hash, lang, compiler) }; diff --git a/crates/cargo-contract/src/workspace/manifest.rs b/crates/cargo-contract/src/workspace/manifest.rs index 3bc72514f..396615a73 100644 --- a/crates/cargo-contract/src/workspace/manifest.rs +++ b/crates/cargo-contract/src/workspace/manifest.rs @@ -20,7 +20,7 @@ use anyhow::{ }; use super::{ - metadata, + metadata::MetadataPackage, Profile, }; use crate::OptimizationPasses; @@ -124,7 +124,7 @@ pub struct Manifest { path: ManifestPath, toml: value::Table, /// True if a metadata package should be generated for this manifest - metadata_package: bool, + metadata_package: Option, } impl Manifest { @@ -138,7 +138,7 @@ impl Manifest { Ok(Manifest { path: manifest_path, toml, - metadata_package: false, + metadata_package: None, }) } @@ -251,7 +251,10 @@ impl Manifest { } /// Adds a metadata package to the manifest workspace for generating metadata - pub fn with_metadata_package(&mut self) -> Result<&mut Self> { + pub fn with_metadata_package( + &mut self, + ink_event_metadata_externs: Vec, + ) -> Result<&mut Self> { let workspace = self .toml .entry("workspace") @@ -280,7 +283,31 @@ impl Manifest { members.push(METADATA_PACKAGE_PATH.into()); } - self.metadata_package = true; + let contract_package_name = self + .toml + .get("package") + .ok_or_else(|| anyhow::anyhow!("package section not found"))? + .get("name") + .ok_or_else(|| anyhow::anyhow!("[package] name field not found"))? + .as_str() + .ok_or_else(|| anyhow::anyhow!("[package] name should be a string"))? + .to_owned(); + + let ink_crate = self + .toml + .get("dependencies") + .ok_or_else(|| anyhow::anyhow!("[dependencies] section not found"))? + .get("ink") + .ok_or_else(|| anyhow::anyhow!("ink dependency not found"))? + .as_table() + .ok_or_else(|| anyhow::anyhow!("ink dependency should be a table"))? + .clone(); + + self.metadata_package = Some(MetadataPackage::new( + contract_package_name, + ink_crate, + ink_event_metadata_externs, + )); Ok(self) } @@ -341,7 +368,7 @@ impl Manifest { .context(format!("Creating directory '{}'", dir.display()))?; } - if self.metadata_package { + if let Some(metadata_package) = &self.metadata_package { let dir = if let Some(manifest_dir) = manifest_path.directory() { manifest_dir.join(METADATA_PACKAGE_PATH) } else { @@ -351,25 +378,7 @@ impl Manifest { fs::create_dir_all(&dir) .context(format!("Creating directory '{}'", dir.display()))?; - let contract_package_name = self - .toml - .get("package") - .ok_or_else(|| anyhow::anyhow!("package section not found"))? - .get("name") - .ok_or_else(|| anyhow::anyhow!("[package] name field not found"))? - .as_str() - .ok_or_else(|| anyhow::anyhow!("[package] name should be a string"))?; - - let ink_crate = self - .toml - .get("dependencies") - .ok_or_else(|| anyhow::anyhow!("[dependencies] section not found"))? - .get("ink") - .ok_or_else(|| anyhow::anyhow!("ink dependency not found"))? - .as_table() - .ok_or_else(|| anyhow::anyhow!("ink dependency should be a table"))?; - - metadata::generate_package(dir, contract_package_name, ink_crate.clone())?; + metadata_package.generate(dir)?; } let updated_toml = toml::to_string(&self.toml)?; diff --git a/crates/cargo-contract/src/workspace/metadata.rs b/crates/cargo-contract/src/workspace/metadata.rs index bb97ada80..d91af29d0 100644 --- a/crates/cargo-contract/src/workspace/metadata.rs +++ b/crates/cargo-contract/src/workspace/metadata.rs @@ -21,53 +21,73 @@ use std::{ }; use toml::value; -/// Generates a cargo workspace package `metadata-gen` which will be invoked via `cargo run` to -/// generate contract metadata. -/// -/// # Note -/// -/// `ink!` dependencies are copied from the containing contract workspace to ensure the same -/// versions are utilized. -pub(super) fn generate_package>( - target_dir: P, - contract_package_name: &str, - mut ink_crate_dependency: value::Table, -) -> Result<()> { - let dir = target_dir.as_ref(); - tracing::debug!( - "Generating metadata package for {} in {}", - contract_package_name, - dir.display() - ); +/// Info for generating a metadata package. +pub struct MetadataPackage { + contract_package_name: String, + ink_crate: value::Table, + ink_event_metadata_externs: Vec, +} + +impl MetadataPackage { + /// Construct a new [`MetadataPackage`]. + pub fn new( + contract_package_name: String, + ink_crate: value::Table, + ink_event_metadata_externs: Vec, + ) -> Self { + Self { + ink_event_metadata_externs, + contract_package_name, + ink_crate, + } + } + + /// Generates a cargo workspace package `metadata-gen` which will be invoked via `cargo run` to + /// generate contract metadata. + /// + /// # Note + /// + /// `ink!` dependencies are copied from the containing contract workspace to ensure the same + /// versions are utilized. + pub fn generate>(&self, target_dir: P) -> Result<()> { + let dir = target_dir.as_ref(); + tracing::debug!( + "Generating metadata package for {} in {}", + self.contract_package_name, + dir.display() + ); - let cargo_toml = include_str!("../../templates/tools/generate-metadata/_Cargo.toml"); - let main_rs = include_str!("../../templates/tools/generate-metadata/main.rs"); + let cargo_toml = + include_str!("../../templates/tools/generate-metadata/_Cargo.toml"); + let main_rs = include_str!("../../templates/tools/generate-metadata/main.rs"); - let mut cargo_toml: value::Table = toml::from_str(cargo_toml)?; - let deps = cargo_toml - .get_mut("dependencies") - .expect("[dependencies] section specified in the template") - .as_table_mut() - .expect("[dependencies] is a table specified in the template"); + let mut cargo_toml: value::Table = toml::from_str(cargo_toml)?; + let deps = cargo_toml + .get_mut("dependencies") + .expect("[dependencies] section specified in the template") + .as_table_mut() + .expect("[dependencies] is a table specified in the template"); - // initialize contract dependency - let contract = deps - .get_mut("contract") - .expect("contract dependency specified in the template") - .as_table_mut() - .expect("contract dependency is a table specified in the template"); - contract.insert("package".into(), contract_package_name.into()); + // initialize contract dependency + let contract = deps + .get_mut("contract") + .expect("contract dependency specified in the template") + .as_table_mut() + .expect("contract dependency is a table specified in the template"); + contract.insert("package".into(), self.contract_package_name.clone().into()); - // make ink_metadata dependency use default features - ink_crate_dependency.remove("default-features"); - ink_crate_dependency.remove("features"); - ink_crate_dependency.remove("optional"); + // make ink_metadata dependency use default features + let mut ink_crate_dependency = self.ink_crate.clone(); + ink_crate_dependency.remove("default-features"); + ink_crate_dependency.remove("features"); + ink_crate_dependency.remove("optional"); - // add ink dependencies copied from contract manifest - deps.insert("ink".into(), ink_crate_dependency.into()); - let cargo_toml = toml::to_string(&cargo_toml)?; + // add ink dependencies copied from contract manifest + deps.insert("ink".into(), ink_crate_dependency.into()); + let cargo_toml = toml::to_string(&cargo_toml)?; - fs::write(dir.join("Cargo.toml"), cargo_toml)?; - fs::write(dir.join("main.rs"), main_rs)?; - Ok(()) + fs::write(dir.join("Cargo.toml"), cargo_toml)?; + fs::write(dir.join("main.rs"), main_rs)?; + Ok(()) + } } diff --git a/crates/cargo-contract/src/workspace/mod.rs b/crates/cargo-contract/src/workspace/mod.rs index 0695e3c72..9acb9ffea 100644 --- a/crates/cargo-contract/src/workspace/mod.rs +++ b/crates/cargo-contract/src/workspace/mod.rs @@ -152,9 +152,10 @@ impl Workspace { pub(super) fn with_metadata_gen_package( &mut self, package_path: PathBuf, + ink_event_metadata_externs: Vec, ) -> Result<&mut Self> { self.with_contract_manifest(&package_path, |manifest| { - manifest.with_metadata_package()?; + manifest.with_metadata_package(ink_event_metadata_externs)?; Ok(()) }) } From a239b4e06517ce19f1acf8e2e4a409c808f6e7ae Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Fri, 21 Oct 2022 17:23:07 +0100 Subject: [PATCH 03/17] Fix up ink crate rewriting --- .../cargo-contract/src/workspace/manifest.rs | 22 +++++++++---------- .../cargo-contract/src/workspace/metadata.rs | 6 +---- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/crates/cargo-contract/src/workspace/manifest.rs b/crates/cargo-contract/src/workspace/manifest.rs index 396615a73..b1fed0ee0 100644 --- a/crates/cargo-contract/src/workspace/manifest.rs +++ b/crates/cargo-contract/src/workspace/manifest.rs @@ -293,19 +293,8 @@ impl Manifest { .ok_or_else(|| anyhow::anyhow!("[package] name should be a string"))? .to_owned(); - let ink_crate = self - .toml - .get("dependencies") - .ok_or_else(|| anyhow::anyhow!("[dependencies] section not found"))? - .get("ink") - .ok_or_else(|| anyhow::anyhow!("ink dependency not found"))? - .as_table() - .ok_or_else(|| anyhow::anyhow!("ink dependency should be a table"))? - .clone(); - self.metadata_package = Some(MetadataPackage::new( contract_package_name, - ink_crate, ink_event_metadata_externs, )); Ok(self) @@ -378,7 +367,16 @@ impl Manifest { fs::create_dir_all(&dir) .context(format!("Creating directory '{}'", dir.display()))?; - metadata_package.generate(dir)?; + let ink_crate = self + .toml + .get("dependencies") + .ok_or_else(|| anyhow::anyhow!("[dependencies] section not found"))? + .get("ink") + .ok_or_else(|| anyhow::anyhow!("ink dependency not found"))? + .as_table() + .ok_or_else(|| anyhow::anyhow!("ink dependency should be a table"))?; + + metadata_package.generate(dir, ink_crate.clone())?; } let updated_toml = toml::to_string(&self.toml)?; diff --git a/crates/cargo-contract/src/workspace/metadata.rs b/crates/cargo-contract/src/workspace/metadata.rs index d91af29d0..7fb559eb6 100644 --- a/crates/cargo-contract/src/workspace/metadata.rs +++ b/crates/cargo-contract/src/workspace/metadata.rs @@ -24,7 +24,6 @@ use toml::value; /// Info for generating a metadata package. pub struct MetadataPackage { contract_package_name: String, - ink_crate: value::Table, ink_event_metadata_externs: Vec, } @@ -32,13 +31,11 @@ impl MetadataPackage { /// Construct a new [`MetadataPackage`]. pub fn new( contract_package_name: String, - ink_crate: value::Table, ink_event_metadata_externs: Vec, ) -> Self { Self { ink_event_metadata_externs, contract_package_name, - ink_crate, } } @@ -49,7 +46,7 @@ impl MetadataPackage { /// /// `ink!` dependencies are copied from the containing contract workspace to ensure the same /// versions are utilized. - pub fn generate>(&self, target_dir: P) -> Result<()> { + pub fn generate>(&self, target_dir: P, mut ink_crate_dependency: value::Table) -> Result<()> { let dir = target_dir.as_ref(); tracing::debug!( "Generating metadata package for {} in {}", @@ -77,7 +74,6 @@ impl MetadataPackage { contract.insert("package".into(), self.contract_package_name.clone().into()); // make ink_metadata dependency use default features - let mut ink_crate_dependency = self.ink_crate.clone(); ink_crate_dependency.remove("default-features"); ink_crate_dependency.remove("features"); ink_crate_dependency.remove("optional"); From 65b7ebae850ffc08e0970a2a61f9ec5f591004ec Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Fri, 21 Oct 2022 18:07:53 +0100 Subject: [PATCH 04/17] Generate the metadata-gen/main.rs calling the event metadata extern fns. --- Cargo.lock | 10 +++-- crates/cargo-contract/Cargo.toml | 2 + .../cargo-contract/src/workspace/metadata.rs | 38 ++++++++++++++++++- .../templates/tools/generate-metadata/main.rs | 14 ------- 4 files changed, 44 insertions(+), 20 deletions(-) delete mode 100644 crates/cargo-contract/templates/tools/generate-metadata/main.rs diff --git a/Cargo.lock b/Cargo.lock index d81ed52b9..4e0e88d16 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -486,6 +486,8 @@ dependencies = [ "parity-wasm 0.45.0", "predicates", "pretty_assertions", + "proc-macro2", + "quote", "regex", "rustc_version", "semver", @@ -2441,18 +2443,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.46" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94e2ef8dbfc347b10c094890f778ee2e36ca9bb4262e86dc99cd217e35f3470b" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.18" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ "proc-macro2", ] diff --git a/crates/cargo-contract/Cargo.toml b/crates/cargo-contract/Cargo.toml index fbf2444f4..579f92e11 100644 --- a/crates/cargo-contract/Cargo.toml +++ b/crates/cargo-contract/Cargo.toml @@ -41,6 +41,8 @@ tempfile = "3.3.0" url = { version = "2.3.1", features = ["serde"] } impl-serde = "0.4.0" wasm-opt = "0.110.1" +proc-macro2 = "1.0.47" +quote = "1.0.21" # dependencies for extrinsics (deploying and calling a contract) async-std = { version = "1.12.0", features = ["attributes", "tokio1"] } diff --git a/crates/cargo-contract/src/workspace/metadata.rs b/crates/cargo-contract/src/workspace/metadata.rs index 7fb559eb6..b800f2ab7 100644 --- a/crates/cargo-contract/src/workspace/metadata.rs +++ b/crates/cargo-contract/src/workspace/metadata.rs @@ -56,7 +56,7 @@ impl MetadataPackage { let cargo_toml = include_str!("../../templates/tools/generate-metadata/_Cargo.toml"); - let main_rs = include_str!("../../templates/tools/generate-metadata/main.rs"); + let main_rs = self.generate_main(); let mut cargo_toml: value::Table = toml::from_str(cargo_toml)?; let deps = cargo_toml @@ -83,7 +83,41 @@ impl MetadataPackage { let cargo_toml = toml::to_string(&cargo_toml)?; fs::write(dir.join("Cargo.toml"), cargo_toml)?; - fs::write(dir.join("main.rs"), main_rs)?; + fs::write(dir.join("main.rs"), main_rs.to_string())?; Ok(()) } + + /// Generate the `main.rs` file to be executed to generate the metadata. + fn generate_main(&self) -> proc_macro2::TokenStream { + let ink_event_metadata_fns = self.ink_event_metadata_externs + .iter() + .map(|event_metadata_fn| quote::format_ident!("{}", event_metadata_fn)) + .collect::>(); + + quote::quote!( + extern crate contract; + + extern "Rust" { + // Note: The ink! metadata codegen generates an implementation for this function, + // which is what we end up linking to here. + fn __ink_generate_metadata() -> ::ink::metadata::InkProject; + + // All `#[ink::event_definition]`s export a unique function to fetch their + // respective metadata, which we link to here. + #( fn #ink_event_metadata_fns () -> ::ink::metadata::EventSpec; )* + } + + fn main() -> Result<(), std::io::Error> { + let metadata = unsafe { __ink_generate_metadata() }; + + // gather metadata of all the event definitions linked in the contract binary. + #( let _event_metadata = unsafe { #ink_event_metadata_fns () }; )* + // todo: append to metadata + + let contents = serde_json::to_string_pretty(&metadata)?; + print!("{}", contents); + Ok(()) + } + ) + } } diff --git a/crates/cargo-contract/templates/tools/generate-metadata/main.rs b/crates/cargo-contract/templates/tools/generate-metadata/main.rs deleted file mode 100644 index e675b457e..000000000 --- a/crates/cargo-contract/templates/tools/generate-metadata/main.rs +++ /dev/null @@ -1,14 +0,0 @@ -extern crate contract; - -extern "Rust" { - // Note: The ink! metdata codegen generates an implementation for this function, - // which is what we end up linking to here. - fn __ink_generate_metadata() -> ink::metadata::InkProject; -} - -fn main() -> Result<(), std::io::Error> { - let metadata = unsafe { __ink_generate_metadata() }; - let contents = serde_json::to_string_pretty(&metadata)?; - print!("{}", contents); - Ok(()) -} From 4f221112be2497c23faa67eea32ea878235a060b Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 25 Oct 2022 15:53:39 +0100 Subject: [PATCH 05/17] Pass in event specs to __ink_generate_metadata --- .../cargo-contract/src/workspace/metadata.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/crates/cargo-contract/src/workspace/metadata.rs b/crates/cargo-contract/src/workspace/metadata.rs index b800f2ab7..f1a2337f7 100644 --- a/crates/cargo-contract/src/workspace/metadata.rs +++ b/crates/cargo-contract/src/workspace/metadata.rs @@ -100,7 +100,9 @@ impl MetadataPackage { extern "Rust" { // Note: The ink! metadata codegen generates an implementation for this function, // which is what we end up linking to here. - fn __ink_generate_metadata() -> ::ink::metadata::InkProject; + fn __ink_generate_metadata( + events: ::ink::prelude::vec::Vec<::ink::metadata::EventSpec> + ) -> ::ink::metadata::InkProject; // All `#[ink::event_definition]`s export a unique function to fetch their // respective metadata, which we link to here. @@ -108,11 +110,15 @@ impl MetadataPackage { } fn main() -> Result<(), std::io::Error> { - let metadata = unsafe { __ink_generate_metadata() }; - - // gather metadata of all the event definitions linked in the contract binary. - #( let _event_metadata = unsafe { #ink_event_metadata_fns () }; )* - // todo: append to metadata + let metadata = unsafe { + __ink_generate_metadata( + ::ink::prelude::vec![ + #( + #ink_event_metadata_fns () + ),* + ] + ) + }; let contents = serde_json::to_string_pretty(&metadata)?; print!("{}", contents); From 1e6ca1c5857c8fd2a6b34858c866d095efc6300d Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Mon, 31 Oct 2022 09:28:30 +0000 Subject: [PATCH 06/17] Fmt --- crates/cargo-contract/src/workspace/metadata.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/cargo-contract/src/workspace/metadata.rs b/crates/cargo-contract/src/workspace/metadata.rs index f1a2337f7..bf9eb4905 100644 --- a/crates/cargo-contract/src/workspace/metadata.rs +++ b/crates/cargo-contract/src/workspace/metadata.rs @@ -46,7 +46,11 @@ impl MetadataPackage { /// /// `ink!` dependencies are copied from the containing contract workspace to ensure the same /// versions are utilized. - pub fn generate>(&self, target_dir: P, mut ink_crate_dependency: value::Table) -> Result<()> { + pub fn generate>( + &self, + target_dir: P, + mut ink_crate_dependency: value::Table, + ) -> Result<()> { let dir = target_dir.as_ref(); tracing::debug!( "Generating metadata package for {} in {}", @@ -89,7 +93,8 @@ impl MetadataPackage { /// Generate the `main.rs` file to be executed to generate the metadata. fn generate_main(&self) -> proc_macro2::TokenStream { - let ink_event_metadata_fns = self.ink_event_metadata_externs + let ink_event_metadata_fns = self + .ink_event_metadata_externs .iter() .map(|event_metadata_fn| quote::format_ident!("{}", event_metadata_fn)) .collect::>(); From 3ea91e280ab8dd167c3b665c0623ae8ac1a5e6a2 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Wed, 2 Nov 2022 10:31:29 +0000 Subject: [PATCH 07/17] Read event definition ids from custom section --- crates/cargo-contract/src/cmd/metadata.rs | 22 +++---- .../cargo-contract/src/workspace/manifest.rs | 9 ++- .../cargo-contract/src/workspace/metadata.rs | 57 ++++++++++++------- crates/cargo-contract/src/workspace/mod.rs | 5 +- 4 files changed, 53 insertions(+), 40 deletions(-) diff --git a/crates/cargo-contract/src/cmd/metadata.rs b/crates/cargo-contract/src/cmd/metadata.rs index e552e0494..553b554f3 100644 --- a/crates/cargo-contract/src/cmd/metadata.rs +++ b/crates/cargo-contract/src/cmd/metadata.rs @@ -19,6 +19,7 @@ use crate::{ maybe_println, util, workspace::{ + EventDefinitionIds, ManifestPath, Workspace, }, @@ -59,7 +60,7 @@ use std::{ use url::Url; const METADATA_FILE: &str = "metadata.json"; -const INK_EVENT_METADATA_SECTION_PREFIX: &str = "__ink_event_metadata_"; +const INK_EVENT_DEFINITION_IDS_SECTION: &str = "__ink_event_definition_ids"; /// Metadata generation result. #[derive(serde::Serialize)] @@ -185,19 +186,12 @@ pub(crate) fn execute( let module: parity_wasm::elements::Module = parity_wasm::deserialize_file(&crate_metadata.original_wasm)?; - let ink_event_metadata_externs = module + let ink_event_defintion_ids_section = module .custom_sections() - .filter_map(|section| { - if section - .name() - .starts_with(INK_EVENT_METADATA_SECTION_PREFIX) - { - Some(section.name().to_owned()) - } else { - None - } - }) - .collect::>(); + .find(|s| s.name() == INK_EVENT_DEFINITION_IDS_SECTION) + .ok_or_else(|| anyhow::anyhow!("Expected a section named {}", INK_EVENT_DEFINITION_IDS_SECTION))?; + println!("{:?}", ink_event_defintion_ids_section.payload()); + let event_definition_ids = EventDefinitionIds::try_from(ink_event_defintion_ids_section.payload())?; if unstable_options.original_manifest { generate_metadata(&crate_metadata.manifest_path)?; @@ -211,7 +205,7 @@ pub(crate) fn execute( })? .with_metadata_gen_package( crate_metadata.manifest_path.absolute_directory()?, - ink_event_metadata_externs, + event_definition_ids, )? .using_temp(generate_metadata)?; } diff --git a/crates/cargo-contract/src/workspace/manifest.rs b/crates/cargo-contract/src/workspace/manifest.rs index b1fed0ee0..68b3d075c 100644 --- a/crates/cargo-contract/src/workspace/manifest.rs +++ b/crates/cargo-contract/src/workspace/manifest.rs @@ -20,7 +20,10 @@ use anyhow::{ }; use super::{ - metadata::MetadataPackage, + metadata::{ + EventDefinitionIds, + MetadataPackage + }, Profile, }; use crate::OptimizationPasses; @@ -253,7 +256,7 @@ impl Manifest { /// Adds a metadata package to the manifest workspace for generating metadata pub fn with_metadata_package( &mut self, - ink_event_metadata_externs: Vec, + event_definition_ids: EventDefinitionIds, ) -> Result<&mut Self> { let workspace = self .toml @@ -295,7 +298,7 @@ impl Manifest { self.metadata_package = Some(MetadataPackage::new( contract_package_name, - ink_event_metadata_externs, + event_definition_ids, )); Ok(self) } diff --git a/crates/cargo-contract/src/workspace/metadata.rs b/crates/cargo-contract/src/workspace/metadata.rs index bf9eb4905..244e198b0 100644 --- a/crates/cargo-contract/src/workspace/metadata.rs +++ b/crates/cargo-contract/src/workspace/metadata.rs @@ -24,17 +24,17 @@ use toml::value; /// Info for generating a metadata package. pub struct MetadataPackage { contract_package_name: String, - ink_event_metadata_externs: Vec, + event_definition_ids: EventDefinitionIds, } impl MetadataPackage { /// Construct a new [`MetadataPackage`]. pub fn new( contract_package_name: String, - ink_event_metadata_externs: Vec, + event_definition_ids: EventDefinitionIds, ) -> Self { Self { - ink_event_metadata_externs, + event_definition_ids, contract_package_name, } } @@ -93,11 +93,7 @@ impl MetadataPackage { /// Generate the `main.rs` file to be executed to generate the metadata. fn generate_main(&self) -> proc_macro2::TokenStream { - let ink_event_metadata_fns = self - .ink_event_metadata_externs - .iter() - .map(|event_metadata_fn| quote::format_ident!("{}", event_metadata_fn)) - .collect::>(); + let event_definition_ids = &self.event_definition_ids.ids; quote::quote!( extern crate contract; @@ -108,22 +104,19 @@ impl MetadataPackage { fn __ink_generate_metadata( events: ::ink::prelude::vec::Vec<::ink::metadata::EventSpec> ) -> ::ink::metadata::InkProject; - - // All `#[ink::event_definition]`s export a unique function to fetch their - // respective metadata, which we link to here. - #( fn #ink_event_metadata_fns () -> ::ink::metadata::EventSpec; )* } fn main() -> Result<(), std::io::Error> { - let metadata = unsafe { - __ink_generate_metadata( - ::ink::prelude::vec![ - #( - #ink_event_metadata_fns () - ),* - ] - ) - }; + // gather metadata for all `#[ink::event_definition]`s imported by the contract + let event_definitions = ::ink::prelude::vec![ + #( + <<::ink::reflect::EventDefinitionRegistry as + ::ink::reflect::EventDefinition<{ #event_definition_ids }>>::Type as + ::ink::metadata::EventMetadata>::event_spec() + ),* + ]; + + let metadata = unsafe { __ink_generate_metadata(event_definitions) }; let contents = serde_json::to_string_pretty(&metadata)?; print!("{}", contents); @@ -132,3 +125,25 @@ impl MetadataPackage { ) } } + +/// The identifiers of all event definitions imported into a contract. +/// +/// These are used to generate function calls to extract metadata from all the events which could +/// be emitted by a contract. +#[derive(Debug)] +pub struct EventDefinitionIds { + ids: Vec +} + +impl TryFrom<&[u8]> for EventDefinitionIds { + type Error = anyhow::Error; + + fn try_from(value: &[u8]) -> std::result::Result { + let mut cursor = 0; + let mut buf = [0u8; 16]; + let mut ids = Vec::new(); + buf.copy_from_slice(&value[cursor..cursor + 16]); + ids.push(u128::from_be_bytes(buf)); + Ok(Self { ids }) + } +} diff --git a/crates/cargo-contract/src/workspace/mod.rs b/crates/cargo-contract/src/workspace/mod.rs index 9acb9ffea..c8379e797 100644 --- a/crates/cargo-contract/src/workspace/mod.rs +++ b/crates/cargo-contract/src/workspace/mod.rs @@ -24,6 +24,7 @@ pub use self::{ Manifest, ManifestPath, }, + metadata::EventDefinitionIds, profile::Profile, }; @@ -152,10 +153,10 @@ impl Workspace { pub(super) fn with_metadata_gen_package( &mut self, package_path: PathBuf, - ink_event_metadata_externs: Vec, + ink_event_metadata_ids: EventDefinitionIds, ) -> Result<&mut Self> { self.with_contract_manifest(&package_path, |manifest| { - manifest.with_metadata_package(ink_event_metadata_externs)?; + manifest.with_metadata_package(ink_event_metadata_ids)?; Ok(()) }) } From 9f58f1816bbc9cc3c9c5dabf9f98ff11801d9d3c Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Wed, 2 Nov 2022 10:31:36 +0000 Subject: [PATCH 08/17] Revert "Read event definition ids from custom section" This reverts commit 3ea91e280ab8dd167c3b665c0623ae8ac1a5e6a2. --- crates/cargo-contract/src/cmd/metadata.rs | 22 ++++--- .../cargo-contract/src/workspace/manifest.rs | 9 +-- .../cargo-contract/src/workspace/metadata.rs | 57 +++++++------------ crates/cargo-contract/src/workspace/mod.rs | 5 +- 4 files changed, 40 insertions(+), 53 deletions(-) diff --git a/crates/cargo-contract/src/cmd/metadata.rs b/crates/cargo-contract/src/cmd/metadata.rs index 553b554f3..e552e0494 100644 --- a/crates/cargo-contract/src/cmd/metadata.rs +++ b/crates/cargo-contract/src/cmd/metadata.rs @@ -19,7 +19,6 @@ use crate::{ maybe_println, util, workspace::{ - EventDefinitionIds, ManifestPath, Workspace, }, @@ -60,7 +59,7 @@ use std::{ use url::Url; const METADATA_FILE: &str = "metadata.json"; -const INK_EVENT_DEFINITION_IDS_SECTION: &str = "__ink_event_definition_ids"; +const INK_EVENT_METADATA_SECTION_PREFIX: &str = "__ink_event_metadata_"; /// Metadata generation result. #[derive(serde::Serialize)] @@ -186,12 +185,19 @@ pub(crate) fn execute( let module: parity_wasm::elements::Module = parity_wasm::deserialize_file(&crate_metadata.original_wasm)?; - let ink_event_defintion_ids_section = module + let ink_event_metadata_externs = module .custom_sections() - .find(|s| s.name() == INK_EVENT_DEFINITION_IDS_SECTION) - .ok_or_else(|| anyhow::anyhow!("Expected a section named {}", INK_EVENT_DEFINITION_IDS_SECTION))?; - println!("{:?}", ink_event_defintion_ids_section.payload()); - let event_definition_ids = EventDefinitionIds::try_from(ink_event_defintion_ids_section.payload())?; + .filter_map(|section| { + if section + .name() + .starts_with(INK_EVENT_METADATA_SECTION_PREFIX) + { + Some(section.name().to_owned()) + } else { + None + } + }) + .collect::>(); if unstable_options.original_manifest { generate_metadata(&crate_metadata.manifest_path)?; @@ -205,7 +211,7 @@ pub(crate) fn execute( })? .with_metadata_gen_package( crate_metadata.manifest_path.absolute_directory()?, - event_definition_ids, + ink_event_metadata_externs, )? .using_temp(generate_metadata)?; } diff --git a/crates/cargo-contract/src/workspace/manifest.rs b/crates/cargo-contract/src/workspace/manifest.rs index 68b3d075c..b1fed0ee0 100644 --- a/crates/cargo-contract/src/workspace/manifest.rs +++ b/crates/cargo-contract/src/workspace/manifest.rs @@ -20,10 +20,7 @@ use anyhow::{ }; use super::{ - metadata::{ - EventDefinitionIds, - MetadataPackage - }, + metadata::MetadataPackage, Profile, }; use crate::OptimizationPasses; @@ -256,7 +253,7 @@ impl Manifest { /// Adds a metadata package to the manifest workspace for generating metadata pub fn with_metadata_package( &mut self, - event_definition_ids: EventDefinitionIds, + ink_event_metadata_externs: Vec, ) -> Result<&mut Self> { let workspace = self .toml @@ -298,7 +295,7 @@ impl Manifest { self.metadata_package = Some(MetadataPackage::new( contract_package_name, - event_definition_ids, + ink_event_metadata_externs, )); Ok(self) } diff --git a/crates/cargo-contract/src/workspace/metadata.rs b/crates/cargo-contract/src/workspace/metadata.rs index 244e198b0..bf9eb4905 100644 --- a/crates/cargo-contract/src/workspace/metadata.rs +++ b/crates/cargo-contract/src/workspace/metadata.rs @@ -24,17 +24,17 @@ use toml::value; /// Info for generating a metadata package. pub struct MetadataPackage { contract_package_name: String, - event_definition_ids: EventDefinitionIds, + ink_event_metadata_externs: Vec, } impl MetadataPackage { /// Construct a new [`MetadataPackage`]. pub fn new( contract_package_name: String, - event_definition_ids: EventDefinitionIds, + ink_event_metadata_externs: Vec, ) -> Self { Self { - event_definition_ids, + ink_event_metadata_externs, contract_package_name, } } @@ -93,7 +93,11 @@ impl MetadataPackage { /// Generate the `main.rs` file to be executed to generate the metadata. fn generate_main(&self) -> proc_macro2::TokenStream { - let event_definition_ids = &self.event_definition_ids.ids; + let ink_event_metadata_fns = self + .ink_event_metadata_externs + .iter() + .map(|event_metadata_fn| quote::format_ident!("{}", event_metadata_fn)) + .collect::>(); quote::quote!( extern crate contract; @@ -104,19 +108,22 @@ impl MetadataPackage { fn __ink_generate_metadata( events: ::ink::prelude::vec::Vec<::ink::metadata::EventSpec> ) -> ::ink::metadata::InkProject; + + // All `#[ink::event_definition]`s export a unique function to fetch their + // respective metadata, which we link to here. + #( fn #ink_event_metadata_fns () -> ::ink::metadata::EventSpec; )* } fn main() -> Result<(), std::io::Error> { - // gather metadata for all `#[ink::event_definition]`s imported by the contract - let event_definitions = ::ink::prelude::vec![ - #( - <<::ink::reflect::EventDefinitionRegistry as - ::ink::reflect::EventDefinition<{ #event_definition_ids }>>::Type as - ::ink::metadata::EventMetadata>::event_spec() - ),* - ]; - - let metadata = unsafe { __ink_generate_metadata(event_definitions) }; + let metadata = unsafe { + __ink_generate_metadata( + ::ink::prelude::vec![ + #( + #ink_event_metadata_fns () + ),* + ] + ) + }; let contents = serde_json::to_string_pretty(&metadata)?; print!("{}", contents); @@ -125,25 +132,3 @@ impl MetadataPackage { ) } } - -/// The identifiers of all event definitions imported into a contract. -/// -/// These are used to generate function calls to extract metadata from all the events which could -/// be emitted by a contract. -#[derive(Debug)] -pub struct EventDefinitionIds { - ids: Vec -} - -impl TryFrom<&[u8]> for EventDefinitionIds { - type Error = anyhow::Error; - - fn try_from(value: &[u8]) -> std::result::Result { - let mut cursor = 0; - let mut buf = [0u8; 16]; - let mut ids = Vec::new(); - buf.copy_from_slice(&value[cursor..cursor + 16]); - ids.push(u128::from_be_bytes(buf)); - Ok(Self { ids }) - } -} diff --git a/crates/cargo-contract/src/workspace/mod.rs b/crates/cargo-contract/src/workspace/mod.rs index c8379e797..9acb9ffea 100644 --- a/crates/cargo-contract/src/workspace/mod.rs +++ b/crates/cargo-contract/src/workspace/mod.rs @@ -24,7 +24,6 @@ pub use self::{ Manifest, ManifestPath, }, - metadata::EventDefinitionIds, profile::Profile, }; @@ -153,10 +152,10 @@ impl Workspace { pub(super) fn with_metadata_gen_package( &mut self, package_path: PathBuf, - ink_event_metadata_ids: EventDefinitionIds, + ink_event_metadata_externs: Vec, ) -> Result<&mut Self> { self.with_contract_manifest(&package_path, |manifest| { - manifest.with_metadata_package(ink_event_metadata_ids)?; + manifest.with_metadata_package(ink_event_metadata_externs)?; Ok(()) }) } From 1185d13e1265cabc051394dccdfdab02dedb379c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Nov 2022 13:04:11 +0000 Subject: [PATCH 09/17] Bump serde from 1.0.147 to 1.0.148 Bumps [serde](https://github.com/serde-rs/serde) from 1.0.147 to 1.0.148. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.147...v1.0.148) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 12 ++++++------ crates/cargo-contract/Cargo.toml | 2 +- crates/metadata/Cargo.toml | 2 +- crates/transcode/Cargo.toml | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 71cef4b23..5a8974ba7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3254,18 +3254,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.147" +version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" +checksum = "e53f64bb4ba0191d6d0676e1b141ca55047d83b74f5607e6d8eb88126c52c2dc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.147" +version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" +checksum = "a55492425aa53521babf6137309e7d34c20bbfbbfcfe2c7f3a047fd1f6b92c0c" dependencies = [ "proc-macro2", "quote", @@ -3881,9 +3881,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" +checksum = "4ae548ec36cf198c0ef7710d3c230987c2d6d7bd98ad6edc0274462724c585ce" dependencies = [ "proc-macro2", "quote", diff --git a/crates/cargo-contract/Cargo.toml b/crates/cargo-contract/Cargo.toml index 77d281db3..d72144bda 100644 --- a/crates/cargo-contract/Cargo.toml +++ b/crates/cargo-contract/Cargo.toml @@ -35,7 +35,7 @@ blake2 = "0.10.5" contract-metadata = { version = "2.0.0-beta", path = "../metadata" } transcode = { package = "contract-transcode", version = "2.0.0-beta", path = "../transcode" } semver = { version = "1.0.14", features = ["serde"] } -serde = { version = "1.0.147", default-features = false, features = ["derive"] } +serde = { version = "1.0.148", default-features = false, features = ["derive"] } serde_json = "1.0.89" tempfile = "3.3.0" url = { version = "2.3.1", features = ["serde"] } diff --git a/crates/metadata/Cargo.toml b/crates/metadata/Cargo.toml index edb6a6844..2028fb382 100644 --- a/crates/metadata/Cargo.toml +++ b/crates/metadata/Cargo.toml @@ -16,7 +16,7 @@ include = ["Cargo.toml", "*.rs", "LICENSE"] [dependencies] impl-serde = "0.4.0" semver = { version = "1.0.14", features = ["serde"] } -serde = { version = "1.0.147", default-features = false, features = ["derive"] } +serde = { version = "1.0.148", default-features = false, features = ["derive"] } serde_json = "1.0.89" url = { version = "2.3.1", features = ["serde"] } anyhow = "1.0.66" diff --git a/crates/transcode/Cargo.toml b/crates/transcode/Cargo.toml index e482c9446..5efda961c 100644 --- a/crates/transcode/Cargo.toml +++ b/crates/transcode/Cargo.toml @@ -31,7 +31,7 @@ nom = "7.1.1" nom-supreme = { version = "0.7.0", features = ["error"] } scale = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } scale-info = { version = "2.3.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.147", default-features = false, features = ["derive"] } +serde = { version = "1.0.148", default-features = false, features = ["derive"] } serde_json = "1.0.89" sp-core = "7.0.0" sp-runtime = "7.0.0" From c7eb0e00713b1fd13cd121469c74fc610e1dd46c Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Mon, 28 Nov 2022 16:37:57 +0000 Subject: [PATCH 10/17] transcode: update ink! deps to beta, remove env_logger (#843) --- Cargo.lock | 16 +--------------- crates/transcode/Cargo.toml | 5 ++--- crates/transcode/src/transcoder.rs | 2 -- 3 files changed, 3 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a8974ba7..ba662ba79 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -720,7 +720,6 @@ dependencies = [ "anyhow", "assert_matches", "contract-metadata", - "env_logger 0.10.0", "escape8259", "hex", "indexmap", @@ -1094,19 +1093,6 @@ dependencies = [ "termcolor", ] -[[package]] -name = "env_logger" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - [[package]] name = "environmental" version = "1.1.3" @@ -1710,7 +1696,7 @@ dependencies = [ "blake2", "derive_more", "either", - "env_logger 0.9.3", + "env_logger", "heck", "impl-serde", "ink_ir", diff --git a/crates/transcode/Cargo.toml b/crates/transcode/Cargo.toml index 5efda961c..16f086ddb 100644 --- a/crates/transcode/Cargo.toml +++ b/crates/transcode/Cargo.toml @@ -19,11 +19,10 @@ path = "src/lib.rs" [dependencies] anyhow = "1.0.66" contract-metadata = { version = "2.0.0-beta", path = "../metadata" } -env_logger = "0.10.0" escape8259 = "0.5.2" hex = "0.4.3" indexmap = "1.9.2" -ink_env = "4.0.0-alpha.3" +ink_env = "4.0.0-beta" ink_metadata = { package = "ink_metadata", version = "4.0.0-beta" } itertools = "0.10.5" tracing = "0.1.37" @@ -38,7 +37,7 @@ sp-runtime = "7.0.0" [dev-dependencies] assert_matches = "1.5.0" -ink = "4.0.0-alpha.3" +ink = "4.0.0-beta" [features] # This `std` feature is required for testing using an inline contract's metadata, because `ink!` annotates the metadata diff --git a/crates/transcode/src/transcoder.rs b/crates/transcode/src/transcoder.rs index d72074de3..18ec79d46 100644 --- a/crates/transcode/src/transcoder.rs +++ b/crates/transcode/src/transcoder.rs @@ -687,8 +687,6 @@ mod tests { #[test] fn transcode_account_id_custom_ss58_encoding() -> Result<()> { - env_logger::init(); - type AccountId = sp_runtime::AccountId32; #[allow(dead_code)] From 2d3df01168ee67d3cfb0a045ec60a2c5bbea4bc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Nov 2022 13:02:25 +0000 Subject: [PATCH 11/17] Bump clap from 4.0.27 to 4.0.29 Bumps [clap](https://github.com/clap-rs/clap) from 4.0.27 to 4.0.29. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/v4.0.27...v4.0.29) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 12 ++++++------ crates/cargo-contract/Cargo.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ba662ba79..9a7cfa577 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -617,9 +617,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.0.27" +version = "4.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0acbd8d28a0a60d7108d7ae850af6ba34cf2d1257fc646980e5f97ce14275966" +checksum = "4d63b9e9c07271b9957ad22c173bae2a4d9a81127680962039296abcd2f8251d" dependencies = [ "bitflags", "clap_derive", @@ -1881,9 +1881,9 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae5bc6e2eb41c9def29a3e0f1306382807764b9b53112030eff57435667352d" +checksum = "927609f78c2913a6f6ac3c27a4fe87f43e2a35367c0c4b0f8265e8f49a104330" dependencies = [ "hermit-abi 0.2.6", "io-lifetimes", @@ -2991,9 +2991,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.36.3" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b1fbb4dfc4eb1d390c02df47760bb19a84bb80b301ecc947ab5406394d8223e" +checksum = "cb93e85278e08bb5788653183213d3a60fc242b10cb9be96586f5a73dcb67c23" dependencies = [ "bitflags", "errno", diff --git a/crates/cargo-contract/Cargo.toml b/crates/cargo-contract/Cargo.toml index d72144bda..c9e5ed6a8 100644 --- a/crates/cargo-contract/Cargo.toml +++ b/crates/cargo-contract/Cargo.toml @@ -19,7 +19,7 @@ include = [ [dependencies] anyhow = "1.0.66" -clap = { version = "4.0.27", features = ["derive", "env"] } +clap = { version = "4.0.29", features = ["derive", "env"] } tracing = "0.1.37" tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } heck = "0.4.0" From f20fa4e569cbaaa8e3d4e44563a380a9df162fbd Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Thu, 1 Dec 2022 13:02:46 +0000 Subject: [PATCH 12/17] Cargo.lock --- Cargo.lock | 79 ++++++++++++++++++++++-------------------------------- 1 file changed, 32 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a7cfa577..3e74cadb2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -524,29 +524,19 @@ dependencies = [ "anyhow", "assert_cmd", "async-std", - "blake2", - "cargo_metadata", "clap", "colored", + "contract-build", "contract-metadata", "contract-transcode", "current_platform", - "dirs", - "heck", "hex", - "impl-serde", "jsonrpsee", "pallet-contracts-primitives", "parity-scale-codec", - "parity-wasm", "predicates", - "pretty_assertions", - "proc-macro2", - "quote", "regex", "rust_decimal", - "rustc_version", - "semver", "serde", "serde_json", "sp-core", @@ -554,15 +544,10 @@ dependencies = [ "substrate-build-script-utils", "subxt", "tempfile", - "toml", "tracing", "tracing-subscriber 0.3.16", "url", - "wabt", - "walkdir", - "wasm-opt", "which", - "zip", ] [[package]] @@ -700,6 +685,37 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "contract-build" +version = "2.0.0-beta" +dependencies = [ + "anyhow", + "blake2", + "cargo_metadata", + "clap", + "colored", + "contract-metadata", + "heck", + "hex", + "impl-serde", + "parity-scale-codec", + "parity-wasm", + "pretty_assertions", + "rustc_version", + "semver", + "serde", + "serde_json", + "tempfile", + "toml", + "tracing", + "url", + "wabt", + "walkdir", + "wasm-opt", + "which", + "zip", +] + [[package]] name = "contract-metadata" version = "2.0.0-beta" @@ -1001,26 +1017,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "doc-comment" version = "0.3.3" @@ -2823,17 +2819,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom 0.2.8", - "redox_syscall", - "thiserror", -] - [[package]] name = "ref-cast" version = "1.0.13" From 43473c6b64464de15c243349e309f504d11c4d74 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Thu, 1 Dec 2022 13:06:11 +0000 Subject: [PATCH 13/17] Restore quote and proc-macro2 deps after merge --- Cargo.lock | 2 ++ crates/build/Cargo.toml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 3e74cadb2..da25ab871 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -701,6 +701,8 @@ dependencies = [ "parity-scale-codec", "parity-wasm", "pretty_assertions", + "proc-macro2", + "quote", "rustc_version", "semver", "serde", diff --git a/crates/build/Cargo.toml b/crates/build/Cargo.toml index 20e4cb8f9..b41f82eeb 100644 --- a/crates/build/Cargo.toml +++ b/crates/build/Cargo.toml @@ -27,6 +27,8 @@ scale = { package = "parity-scale-codec", version = "3.0.0", features = ["derive toml = "0.5.9" tracing = "0.1.37" parity-wasm = "0.45.0" +proc-macro2 = "1" +quote = "1" semver = { version = "1.0.14", features = ["serde"] } serde = { version = "1", default-features = false, features = ["derive"] } serde_json = "1.0.86" From 1a707f006735a5e47101dc484f009595fca7c37a Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Mon, 13 Feb 2023 13:51:38 +0000 Subject: [PATCH 14/17] Format string --- crates/build/src/workspace/metadata.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/build/src/workspace/metadata.rs b/crates/build/src/workspace/metadata.rs index 01f6eca09..390482175 100644 --- a/crates/build/src/workspace/metadata.rs +++ b/crates/build/src/workspace/metadata.rs @@ -125,7 +125,7 @@ impl MetadataPackage { }; let contents = serde_json::to_string_pretty(&metadata)?; - print!("{}", contents); + print!("{contents}"); Ok(()) } ) From 76de333a199bd45c609c748c9cd71c4b6ae1fd3a Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Mon, 27 Mar 2023 09:50:42 +0100 Subject: [PATCH 15/17] Cargo.lock --- Cargo.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 39f143b14..11393b5ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1789,9 +1789,9 @@ dependencies = [ [[package]] name = "ink" -version = "4.0.1" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b4fc39f3bcab7e042becf5c9dbbebc179fff64924025753a5fafa016e8576d" +checksum = "0c0b81ae699fab87b67c4312430e234c1e5b99533aa830dab16cddc9da65cd7a" dependencies = [ "derive_more", "ink_env", @@ -1814,9 +1814,9 @@ dependencies = [ [[package]] name = "ink_codegen" -version = "4.0.1" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "283b022679ef75898db5c28b89388412d93f91cea4f0b1443426901cb391b079" +checksum = "0da21ea8189beef99f92fcea3f07018e3278a0e084b86705d3b5e58c3ee38645" dependencies = [ "blake2", "derive_more", @@ -1880,9 +1880,9 @@ dependencies = [ [[package]] name = "ink_ir" -version = "4.0.1" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "946b940d26e69ded558daafead0979f25f2e9d7e2cf86027f250c3942aa4d0f1" +checksum = "8aeb30e90744ebf9cce7300a1d013ab91e1b84ebc9887ddabd9b7688c6ac20c1" dependencies = [ "blake2", "either", @@ -1894,9 +1894,9 @@ dependencies = [ [[package]] name = "ink_macro" -version = "4.0.1" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6642450e6169cfaf81717b1d62b2abae48a6b41d3f70f885b6aeff7bb14ea96b" +checksum = "968f443cf4f177c2cc9d147e33336de19700c8f7e01a6ad5942d9a324e9d3a6c" dependencies = [ "ink_codegen", "ink_ir", @@ -1946,9 +1946,9 @@ dependencies = [ [[package]] name = "ink_storage" -version = "4.0.1" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2872a5ea4559433381b2d82b08b6acd33ce934b07a22ce951c6f00483680c950" +checksum = "f376d6fd2137ea2a42a9f08a83b29e309862a020a0841c0cb9a78c40f1e2e6e5" dependencies = [ "array-init", "cfg-if", From cf2516c01b1184d6d94e2ba9bfd653dd231f17b1 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Mon, 27 Mar 2023 17:29:46 +0100 Subject: [PATCH 16/17] Fix errors after merge --- crates/build/src/workspace/manifest.rs | 1 - crates/build/src/workspace/metadata.rs | 48 ++++++++++++++------------ 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/crates/build/src/workspace/manifest.rs b/crates/build/src/workspace/manifest.rs index 734b8f313..7cab6a817 100644 --- a/crates/build/src/workspace/manifest.rs +++ b/crates/build/src/workspace/manifest.rs @@ -403,7 +403,6 @@ impl Manifest { metadata_package.generate( dir, - contract_package_name, ink_crate.clone(), features, )?; diff --git a/crates/build/src/workspace/metadata.rs b/crates/build/src/workspace/metadata.rs index b311c41ac..e208d9229 100644 --- a/crates/build/src/workspace/metadata.rs +++ b/crates/build/src/workspace/metadata.rs @@ -52,7 +52,8 @@ impl MetadataPackage { pub fn generate>( &self, target_dir: P, - mut ink_crate_dependency: value::Table, + mut ink_crate_dependency: Table, + contract_features: &Table, ) -> Result<()> { let dir = target_dir.as_ref(); tracing::debug!( @@ -84,30 +85,30 @@ impl MetadataPackage { ink_crate_dependency.remove("features"); ink_crate_dependency.remove("optional"); - // add ink dependencies copied from contract manifest - deps.insert("ink".into(), ink_crate_dependency.into()); - - // add features from contract - let features = cargo_toml - .entry("features") - .or_insert(Value::Table(Default::default())) - .as_table_mut() - .ok_or_else(|| anyhow::anyhow!("features should be a table"))?; - - for (feature, _) in contract_features { - if feature != "default" && feature != "std" { - features.insert( - feature.to_string(), - Value::Array(vec![format!("contract/{feature}").into()]), - ); + // add ink dependencies copied from contract manifest + deps.insert("ink".into(), ink_crate_dependency.into()); + + // add features from contract + let features = cargo_toml + .entry("features") + .or_insert(Value::Table(Default::default())) + .as_table_mut() + .ok_or_else(|| anyhow::anyhow!("features should be a table"))?; + + for (feature, _) in contract_features { + if feature != "default" && feature != "std" { + features.insert( + feature.to_string(), + Value::Array(vec![format!("contract/{feature}").into()]), + ); + } } - } - let cargo_toml = toml::to_string(&cargo_toml)?; - fs::write(dir.join("Cargo.toml"), cargo_toml)?; - fs::write(dir.join("main.rs"), main_rs)?; - Ok(()) -} + let cargo_toml = toml::to_string(&cargo_toml)?; + fs::write(dir.join("Cargo.toml"), cargo_toml)?; + fs::write(dir.join("main.rs"), main_rs.to_string())?; + Ok(()) + } /// Generate the `main.rs` file to be executed to generate the metadata. fn generate_main(&self) -> proc_macro2::TokenStream { @@ -149,5 +150,6 @@ impl MetadataPackage { } ) } +} From b74df5b457b22cbf3f5dbc309240a1f601ff6057 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Mon, 27 Mar 2023 17:30:02 +0100 Subject: [PATCH 17/17] Fmt --- crates/build/src/workspace/manifest.rs | 6 +----- crates/build/src/workspace/metadata.rs | 2 -- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/crates/build/src/workspace/manifest.rs b/crates/build/src/workspace/manifest.rs index 7cab6a817..35f3e7dee 100644 --- a/crates/build/src/workspace/manifest.rs +++ b/crates/build/src/workspace/manifest.rs @@ -401,11 +401,7 @@ impl Manifest { .as_table() .ok_or_else(|| anyhow::anyhow!("[features] section should be a table"))?; - metadata_package.generate( - dir, - ink_crate.clone(), - features, - )?; + metadata_package.generate(dir, ink_crate.clone(), features)?; } let updated_toml = toml::to_string(&self.toml)?; diff --git a/crates/build/src/workspace/metadata.rs b/crates/build/src/workspace/metadata.rs index e208d9229..eb242c4a3 100644 --- a/crates/build/src/workspace/metadata.rs +++ b/crates/build/src/workspace/metadata.rs @@ -151,5 +151,3 @@ impl MetadataPackage { ) } } - -