From 1cdf5edc79603f08305ba3306d626da7a5bdfa62 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Wed, 17 Jul 2024 12:45:49 +0300 Subject: [PATCH 01/29] cli report code - needs to work for multi .wasm contracts --- framework/meta-lib/src/lib.rs | 6 +- framework/meta/src/cli/cli_args_standalone.rs | 18 ++++- framework/meta/src/cli/cli_standalone_main.rs | 5 ++ framework/meta/src/cmd.rs | 1 + framework/meta/src/cmd/code_report.rs | 16 ++++ .../meta/src/cmd/code_report/code_report.rs | 81 +++++++++++++++++++ .../src/cmd/code_report/render_code_report.rs | 32 ++++++++ framework/meta/src/cmd/test_coverage.rs | 6 +- framework/meta/src/cmd/test_coverage/run.rs | 8 +- 9 files changed, 160 insertions(+), 13 deletions(-) create mode 100644 framework/meta/src/cmd/code_report.rs create mode 100644 framework/meta/src/cmd/code_report/code_report.rs create mode 100644 framework/meta/src/cmd/code_report/render_code_report.rs diff --git a/framework/meta-lib/src/lib.rs b/framework/meta-lib/src/lib.rs index e33c2cfb7b..61125711ca 100644 --- a/framework/meta-lib/src/lib.rs +++ b/framework/meta-lib/src/lib.rs @@ -1,14 +1,14 @@ pub mod abi_json; pub mod cargo_toml_contents; pub mod cli; -mod code_report_json; +pub mod code_report_json; pub mod contract; pub mod ei; pub mod ei_check_json; pub mod esdt_attr_file_json; -mod mxsc_file_json; +pub mod mxsc_file_json; pub mod print_util; -mod report_info_json; +pub mod report_info_json; pub mod tools; pub mod version; pub mod version_history; diff --git a/framework/meta/src/cli/cli_args_standalone.rs b/framework/meta/src/cli/cli_args_standalone.rs index e66c83deb4..463faf68a0 100644 --- a/framework/meta/src/cli/cli_args_standalone.rs +++ b/framework/meta/src/cli/cli_args_standalone.rs @@ -65,6 +65,9 @@ pub enum StandaloneCliAction { #[command(name = "test-coverage", about = "Run test coverage and output report")] TestCoverage(TestCoverageArgs), + #[command(name = "code-report", about = "Generate code report")] + CodeReportGen(CodeReportArgs), + #[command( about = "Generates a scenario test initialized with real data fetched from the blockchain." )] @@ -115,7 +118,7 @@ pub struct TestArgs { } #[derive(Default, Clone, PartialEq, Eq, Debug, ValueEnum)] -pub enum TestCoverageOutputFormat { +pub enum OutputFormat { /// Markdown pretty-print summary #[default] Markdown, @@ -132,13 +135,24 @@ pub struct TestCoverageArgs { /// Output format #[arg(short, long, verbatim_doc_comment)] - pub format: Option, + pub format: Option, /// Ignore files by path patterns #[arg(short = 'i', long = "ignore-filename-regex", verbatim_doc_comment)] pub ignore_filename_regex: Vec, } +#[derive(Default, Clone, PartialEq, Eq, Debug, Args)] +pub struct CodeReportArgs { + /// Output file path + #[arg(short, long, verbatim_doc_comment)] + pub path: Option, + + /// Output format + #[arg(short, long, verbatim_doc_comment)] + pub format: Option, +} + #[derive(Default, Clone, PartialEq, Eq, Debug, Args)] pub struct AllArgs { #[command(subcommand)] diff --git a/framework/meta/src/cli/cli_standalone_main.rs b/framework/meta/src/cli/cli_standalone_main.rs index 6c8c6a67b0..a33bc659d2 100644 --- a/framework/meta/src/cli/cli_standalone_main.rs +++ b/framework/meta/src/cli/cli_standalone_main.rs @@ -3,6 +3,7 @@ use crate::cmd::retrieve_address::retrieve_address; use clap::Parser; use crate::cmd::all::call_all_meta; +use crate::cmd::code_report::code_report; use crate::cmd::info::call_info; use crate::cmd::install::install; use crate::cmd::local_deps::local_deps; @@ -10,6 +11,7 @@ use crate::cmd::scen_test_gen::test_gen_tool; use crate::cmd::template::{create_contract, print_template_names}; use crate::cmd::test::test; use crate::cmd::test_coverage::test_coverage; + use crate::cmd::upgrade::upgrade_sc; /// Entry point in the program when calling it as a standalone tool. @@ -35,6 +37,9 @@ pub async fn cli_main_standalone() { Some(StandaloneCliAction::TestCoverage(args)) => { test_coverage(args); }, + Some(StandaloneCliAction::CodeReportGen(args)) => { + code_report(args); + }, Some(StandaloneCliAction::Account(args)) => { retrieve_address(args).await; }, diff --git a/framework/meta/src/cmd.rs b/framework/meta/src/cmd.rs index a588f90162..2a3ebe65cd 100644 --- a/framework/meta/src/cmd.rs +++ b/framework/meta/src/cmd.rs @@ -1,4 +1,5 @@ pub mod all; +pub mod code_report; pub mod info; pub mod install; pub mod local_deps; diff --git a/framework/meta/src/cmd/code_report.rs b/framework/meta/src/cmd/code_report.rs new file mode 100644 index 0000000000..c059b176bc --- /dev/null +++ b/framework/meta/src/cmd/code_report.rs @@ -0,0 +1,16 @@ +pub mod code_report; +pub mod render_code_report; + +use code_report::run_code_report; + +use crate::cli::CodeReportArgs; + +pub fn code_report(args: &CodeReportArgs) { + let path = if let Some(some_path) = &args.path { + some_path.as_str() + } else { + "./" + }; + + run_code_report(path); +} diff --git a/framework/meta/src/cmd/code_report/code_report.rs b/framework/meta/src/cmd/code_report/code_report.rs new file mode 100644 index 0000000000..8a6151bd6e --- /dev/null +++ b/framework/meta/src/cmd/code_report/code_report.rs @@ -0,0 +1,81 @@ +use std::{fs::File, path::PathBuf, process::Command}; + +use crate::folder_structure::RelevantDirectories; + +use multiversx_sc_meta_lib::{ + self, code_report_json::CodeReportJson, mxsc_file_json::MxscFileJson, +}; + +use super::render_code_report::render_report; + +pub fn run_code_report( + path: &str, + // output_path: &str, + // output_format: &OutputFormat, +) { + let directors = RelevantDirectories::find_all(path, &["".to_owned()]); + + let reports = extract_report(directors); + let mut output = String::new(); + render_report(&mut output, &reports); + + println!("{output}"); +} + +fn build_contract(path: &PathBuf) { + Command::new("sc-meta") + .arg("all") + .arg("build") + .arg("--path") + .arg(path) + .output() + .expect(&format!( + "Failed to build the contract for path: {}", + path.display() + )); +} + +fn clean_contract(path: &PathBuf) { + Command::new("sc-meta") + .arg("all") + .arg("clean") + .arg("--path") + .arg(path) + .output() + .expect(&format!( + "Failed to clean the contract for path: {}", + path.display() + )); +} + +fn extract_report(directors: RelevantDirectories) -> Vec { + let mut reports: Vec = Vec::new(); + + for director in directors.iter() { + build_contract(&director.path); + + // find only one wasm file + + let contract_name = director.path.to_str().unwrap().split("/").last().unwrap(); + println!(">> {contract_name}"); + + let mxsc_path = format!( + "{}/output/{contract_name}.mxsc.json", + director.path.display() + ); + let mxsc_file = File::open(mxsc_path); + + match mxsc_file { + Ok(f) => { + let data: MxscFileJson = serde_json::from_reader(f).unwrap(); + + reports.push(data.report.code_report); + + clean_contract(&director.path); + }, + Err(_) => continue, + } + } + + reports +} diff --git a/framework/meta/src/cmd/code_report/render_code_report.rs b/framework/meta/src/cmd/code_report/render_code_report.rs new file mode 100644 index 0000000000..6b06d7c465 --- /dev/null +++ b/framework/meta/src/cmd/code_report/render_code_report.rs @@ -0,0 +1,32 @@ +use std::fmt::Write; + +use multiversx_sc_meta_lib::code_report_json::CodeReportJson; + +fn writeln_output_str>(output: &mut String, input: S) { + output.write_str(&format!("{}\n", input.as_ref())).ok(); +} + +pub fn render_report(output: &mut String, reports: &Vec) { + render_header(output); + render_reports(output, reports); +} + +fn render_header(output: &mut String) { + writeln_output_str(output, "| Path                                                         |                                     size |                  has-allocator |                     has-format |"); + writeln_output_str(output, "| :-- | --: | --: | --: |"); +} + +fn render_reports(output: &mut String, reports: &Vec) { + for report in reports { + writeln_output_str( + output, + format!( + "| - {} | {} | {} | {} |", + report.path.split("/").last().expect("no output path"), + report.size, + report.has_allocator, + report.has_panic + ), + ); + } +} diff --git a/framework/meta/src/cmd/test_coverage.rs b/framework/meta/src/cmd/test_coverage.rs index 363fcc9372..0ece2454fb 100644 --- a/framework/meta/src/cmd/test_coverage.rs +++ b/framework/meta/src/cmd/test_coverage.rs @@ -6,7 +6,7 @@ mod run; mod util; use crate::{ - cli::{TestCoverageArgs, TestCoverageOutputFormat}, + cli::{OutputFormat, TestCoverageArgs}, cmd::test_coverage::{cargo::get_workspace_root, run::run_test_coverage}, }; use std::process; @@ -16,9 +16,7 @@ pub fn test_coverage(args: &TestCoverageArgs) { if let Err(err) = run_test_coverage( &root_path, &args.output, - args.format - .as_ref() - .unwrap_or(&TestCoverageOutputFormat::default()), + args.format.as_ref().unwrap_or(&OutputFormat::default()), &args.ignore_filename_regex, ) { eprintln!("{}", err); diff --git a/framework/meta/src/cmd/test_coverage/run.rs b/framework/meta/src/cmd/test_coverage/run.rs index edb165824b..687d404009 100644 --- a/framework/meta/src/cmd/test_coverage/run.rs +++ b/framework/meta/src/cmd/test_coverage/run.rs @@ -1,7 +1,7 @@ use std::fs; use crate::{ - cli::TestCoverageOutputFormat, + cli::OutputFormat, cmd::test_coverage::{ cargo::{get_instrumented_test_binaries_paths, run_instrumented_tests}, error::TestCoverageError, @@ -16,7 +16,7 @@ use crate::{ pub fn run_test_coverage( root_path: &str, output_path: &str, - output_format: &TestCoverageOutputFormat, + output_format: &OutputFormat, ignore_filename_regex: &[String], ) -> Result<(), TestCoverageError> { ensure_dependencies_in_path()?; @@ -43,10 +43,10 @@ pub fn run_test_coverage( let mut output = String::new(); match output_format { - TestCoverageOutputFormat::Markdown => { + OutputFormat::Markdown => { render_coverage(&mut output, &coverage, root_path); }, - TestCoverageOutputFormat::Json => { + OutputFormat::Json => { output = serde_json::to_string_pretty(&coverage).unwrap(); }, }; From c9ea2aebb20078c041d86bcfa6150a1533840e04 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Wed, 17 Jul 2024 18:42:50 +0300 Subject: [PATCH 02/29] cli report code - multi .wasm report fix --- .../meta/src/cmd/code_report/code_report.rs | 57 +++++++++++-------- .../src/cmd/code_report/render_code_report.rs | 4 +- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/framework/meta/src/cmd/code_report/code_report.rs b/framework/meta/src/cmd/code_report/code_report.rs index 8a6151bd6e..57ac6f857e 100644 --- a/framework/meta/src/cmd/code_report/code_report.rs +++ b/framework/meta/src/cmd/code_report/code_report.rs @@ -1,4 +1,8 @@ -use std::{fs::File, path::PathBuf, process::Command}; +use std::{ + fs::{read_dir, File}, + path::PathBuf, + process::Command, +}; use crate::folder_structure::RelevantDirectories; @@ -29,10 +33,7 @@ fn build_contract(path: &PathBuf) { .arg("--path") .arg(path) .output() - .expect(&format!( - "Failed to build the contract for path: {}", - path.display() - )); + .unwrap_or_else(|_| panic!("Failed to build the contract for path: {}", path.display())); } fn clean_contract(path: &PathBuf) { @@ -42,10 +43,7 @@ fn clean_contract(path: &PathBuf) { .arg("--path") .arg(path) .output() - .expect(&format!( - "Failed to clean the contract for path: {}", - path.display() - )); + .unwrap_or_else(|_| panic!("Failed to clean the contract for path: {}", path.display())); } fn extract_report(directors: RelevantDirectories) -> Vec { @@ -54,28 +52,37 @@ fn extract_report(directors: RelevantDirectories) -> Vec { for director in directors.iter() { build_contract(&director.path); - // find only one wasm file + let output_path: PathBuf = director.path.join("output"); - let contract_name = director.path.to_str().unwrap().split("/").last().unwrap(); - println!(">> {contract_name}"); + extract_reports(&output_path, &mut reports); - let mxsc_path = format!( - "{}/output/{contract_name}.mxsc.json", - director.path.display() - ); - let mxsc_file = File::open(mxsc_path); + clean_contract(&director.path); + } - match mxsc_file { - Ok(f) => { - let data: MxscFileJson = serde_json::from_reader(f).unwrap(); + reports +} - reports.push(data.report.code_report); +fn find_mxsc_files(path: &PathBuf) -> Vec { + if !path.is_dir() { + return vec![]; + } - clean_contract(&director.path); - }, - Err(_) => continue, + let mut mxsc_files = Vec::new(); + for entry in read_dir(path).unwrap() { + let file_path = entry.unwrap().path(); + if file_path.to_str().unwrap().ends_with(".mxsc.json") { + mxsc_files.push(file_path); } } - reports + mxsc_files +} + +fn extract_reports(path: &PathBuf, reports: &mut Vec) { + for mxsc_path in find_mxsc_files(path) { + let mxsc_file = + File::open(mxsc_path).unwrap_or_else(|_| panic!("Failed to open mxsc file")); + let data: MxscFileJson = serde_json::from_reader(mxsc_file).unwrap(); + reports.push(data.report.code_report); + } } diff --git a/framework/meta/src/cmd/code_report/render_code_report.rs b/framework/meta/src/cmd/code_report/render_code_report.rs index 6b06d7c465..e69466337b 100644 --- a/framework/meta/src/cmd/code_report/render_code_report.rs +++ b/framework/meta/src/cmd/code_report/render_code_report.rs @@ -21,8 +21,8 @@ fn render_reports(output: &mut String, reports: &Vec) { writeln_output_str( output, format!( - "| - {} | {} | {} | {} |", - report.path.split("/").last().expect("no output path"), + "| {} | {} | {} | {} |", + report.path.split('/').last().expect("no output path"), report.size, report.has_allocator, report.has_panic From 356ac5ee2c81519916f6c9aebdca5f340efa75ea Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Wed, 17 Jul 2024 20:25:54 +0300 Subject: [PATCH 03/29] cli report code - generate markdown --- framework/meta/src/cli/cli_args_standalone.rs | 7 ++- framework/meta/src/cmd/code_report.rs | 8 ++- .../meta/src/cmd/code_report/code_report.rs | 61 +++++++++++-------- 3 files changed, 48 insertions(+), 28 deletions(-) diff --git a/framework/meta/src/cli/cli_args_standalone.rs b/framework/meta/src/cli/cli_args_standalone.rs index 463faf68a0..bff415423e 100644 --- a/framework/meta/src/cli/cli_args_standalone.rs +++ b/framework/meta/src/cli/cli_args_standalone.rs @@ -144,10 +144,15 @@ pub struct TestCoverageArgs { #[derive(Default, Clone, PartialEq, Eq, Debug, Args)] pub struct CodeReportArgs { - /// Output file path + /// Target directory where to generate code report. + /// Will be current directory if not specified. #[arg(short, long, verbatim_doc_comment)] pub path: Option, + /// Output file path + #[arg(short, long, verbatim_doc_comment)] + pub output: String, + /// Output format #[arg(short, long, verbatim_doc_comment)] pub format: Option, diff --git a/framework/meta/src/cmd/code_report.rs b/framework/meta/src/cmd/code_report.rs index c059b176bc..1a879d4604 100644 --- a/framework/meta/src/cmd/code_report.rs +++ b/framework/meta/src/cmd/code_report.rs @@ -3,7 +3,7 @@ pub mod render_code_report; use code_report::run_code_report; -use crate::cli::CodeReportArgs; +use crate::cli::{CodeReportArgs, OutputFormat}; pub fn code_report(args: &CodeReportArgs) { let path = if let Some(some_path) = &args.path { @@ -12,5 +12,9 @@ pub fn code_report(args: &CodeReportArgs) { "./" }; - run_code_report(path); + run_code_report( + path, + &args.output, + args.format.as_ref().unwrap_or(&OutputFormat::default()), + ); } diff --git a/framework/meta/src/cmd/code_report/code_report.rs b/framework/meta/src/cmd/code_report/code_report.rs index 57ac6f857e..801c40d7f2 100644 --- a/framework/meta/src/cmd/code_report/code_report.rs +++ b/framework/meta/src/cmd/code_report/code_report.rs @@ -1,10 +1,10 @@ use std::{ - fs::{read_dir, File}, + fs::{self, read_dir, File}, path::PathBuf, process::Command, }; -use crate::folder_structure::RelevantDirectories; +use crate::{cli::OutputFormat, folder_structure::RelevantDirectories}; use multiversx_sc_meta_lib::{ self, code_report_json::CodeReportJson, mxsc_file_json::MxscFileJson, @@ -12,18 +12,45 @@ use multiversx_sc_meta_lib::{ use super::render_code_report::render_report; -pub fn run_code_report( - path: &str, - // output_path: &str, - // output_format: &OutputFormat, -) { +pub fn run_code_report(path: &str, output_path: &str, output_format: &OutputFormat) { let directors = RelevantDirectories::find_all(path, &["".to_owned()]); let reports = extract_report(directors); let mut output = String::new(); - render_report(&mut output, &reports); - println!("{output}"); + match output_format { + OutputFormat::Markdown => { + render_report(&mut output, &reports); + }, + OutputFormat::Json => { + for report in reports { + output.insert_str( + output.len(), + &serde_json::to_string_pretty(&report).unwrap(), + ); + } + }, + }; + + let Ok(_) = fs::write(output_path, output) else { + return; + }; +} + +fn extract_report(directors: RelevantDirectories) -> Vec { + let mut reports: Vec = Vec::new(); + + for director in directors.iter() { + build_contract(&director.path); + + let output_path: PathBuf = director.path.join("output"); + + extract_reports(&output_path, &mut reports); + + clean_contract(&director.path); + } + + reports } fn build_contract(path: &PathBuf) { @@ -46,22 +73,6 @@ fn clean_contract(path: &PathBuf) { .unwrap_or_else(|_| panic!("Failed to clean the contract for path: {}", path.display())); } -fn extract_report(directors: RelevantDirectories) -> Vec { - let mut reports: Vec = Vec::new(); - - for director in directors.iter() { - build_contract(&director.path); - - let output_path: PathBuf = director.path.join("output"); - - extract_reports(&output_path, &mut reports); - - clean_contract(&director.path); - } - - reports -} - fn find_mxsc_files(path: &PathBuf) -> Vec { if !path.is_dir() { return vec![]; From 5e8956ec7c3a7e4817a1724f3327352e2918465f Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Fri, 19 Jul 2024 23:24:46 +0300 Subject: [PATCH 04/29] cli code report - compare .md files --- contracts/benchmarks/report.json | 1 + framework/meta/src/cli/cli_args_standalone.rs | 6 +- framework/meta/src/cmd/code_report.rs | 5 +- .../meta/src/cmd/code_report/code_report.rs | 11 +- .../src/cmd/code_report/render_code_report.rs | 161 +++++++++++++++++- out.md | 94 ++++++++++ sdk/core/src/gateway/gateway_proxy.rs | 2 +- 7 files changed, 265 insertions(+), 15 deletions(-) create mode 100644 contracts/benchmarks/report.json create mode 100644 out.md diff --git a/contracts/benchmarks/report.json b/contracts/benchmarks/report.json new file mode 100644 index 0000000000..bb94c6b60a --- /dev/null +++ b/contracts/benchmarks/report.json @@ -0,0 +1 @@ +[{"path":"../output/send-tx-repeat.wasm","size":901,"hasAllocator":false,"hasPanic":"none"},{"path":"../output/large-storage.wasm","size":2164,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/map-repeat.wasm","size":7234,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/queue-repeat.wasm","size":5853,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/set-repeat.wasm","size":7013,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/single-value-repeat.wasm","size":4440,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/linked-list-repeat.wasm","size":6681,"hasAllocator":true,"hasPanic":"without message"},{"path":"../output/vec-repeat.wasm","size":5231,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/str-repeat.wasm","size":2389,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/str-repeat-mb-builder-cached.wasm","size":1139,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/str-repeat-mb-builder-basic.wasm","size":759,"hasAllocator":false,"hasPanic":"none"}] \ No newline at end of file diff --git a/framework/meta/src/cli/cli_args_standalone.rs b/framework/meta/src/cli/cli_args_standalone.rs index bff415423e..453b136432 100644 --- a/framework/meta/src/cli/cli_args_standalone.rs +++ b/framework/meta/src/cli/cli_args_standalone.rs @@ -151,11 +151,15 @@ pub struct CodeReportArgs { /// Output file path #[arg(short, long, verbatim_doc_comment)] - pub output: String, + pub output: Option, /// Output format #[arg(short, long, verbatim_doc_comment)] pub format: Option, + + /// Compare + #[arg(short, long, verbatim_doc_comment)] + pub compare: Option, } #[derive(Default, Clone, PartialEq, Eq, Debug, Args)] diff --git a/framework/meta/src/cmd/code_report.rs b/framework/meta/src/cmd/code_report.rs index 1a879d4604..a10efc78dc 100644 --- a/framework/meta/src/cmd/code_report.rs +++ b/framework/meta/src/cmd/code_report.rs @@ -6,7 +6,7 @@ use code_report::run_code_report; use crate::cli::{CodeReportArgs, OutputFormat}; pub fn code_report(args: &CodeReportArgs) { - let path = if let Some(some_path) = &args.path { + let path: &str = if let Some(some_path) = &args.path { some_path.as_str() } else { "./" @@ -14,7 +14,8 @@ pub fn code_report(args: &CodeReportArgs) { run_code_report( path, - &args.output, + args.output.as_ref().unwrap_or(&"./report.md".to_string()), args.format.as_ref().unwrap_or(&OutputFormat::default()), + &args.compare.clone().unwrap_or(String::new()), ); } diff --git a/framework/meta/src/cmd/code_report/code_report.rs b/framework/meta/src/cmd/code_report/code_report.rs index 801c40d7f2..3c2fce2c6b 100644 --- a/framework/meta/src/cmd/code_report/code_report.rs +++ b/framework/meta/src/cmd/code_report/code_report.rs @@ -12,7 +12,7 @@ use multiversx_sc_meta_lib::{ use super::render_code_report::render_report; -pub fn run_code_report(path: &str, output_path: &str, output_format: &OutputFormat) { +pub fn run_code_report(path: &str, output_path: &str, output_format: &OutputFormat, compare: &str) { let directors = RelevantDirectories::find_all(path, &["".to_owned()]); let reports = extract_report(directors); @@ -20,15 +20,10 @@ pub fn run_code_report(path: &str, output_path: &str, output_format: &OutputForm match output_format { OutputFormat::Markdown => { - render_report(&mut output, &reports); + render_report(&mut output, &reports, compare); }, OutputFormat::Json => { - for report in reports { - output.insert_str( - output.len(), - &serde_json::to_string_pretty(&report).unwrap(), - ); - } + output = serde_json::to_string(&reports).unwrap(); }, }; diff --git a/framework/meta/src/cmd/code_report/render_code_report.rs b/framework/meta/src/cmd/code_report/render_code_report.rs index e69466337b..46bd1a52fc 100644 --- a/framework/meta/src/cmd/code_report/render_code_report.rs +++ b/framework/meta/src/cmd/code_report/render_code_report.rs @@ -1,4 +1,8 @@ -use std::fmt::Write; +use std::{ + fmt::Write, + fs::File, + io::{BufRead, BufReader}, +}; use multiversx_sc_meta_lib::code_report_json::CodeReportJson; @@ -6,9 +10,14 @@ fn writeln_output_str>(output: &mut String, input: S) { output.write_str(&format!("{}\n", input.as_ref())).ok(); } -pub fn render_report(output: &mut String, reports: &Vec) { +pub fn render_report(output: &mut String, reports: &Vec, compared_path_file: &str) { render_header(output); - render_reports(output, reports); + + if compared_path_file.is_empty() { + render_reports(output, reports); + } else { + render_and_compare(output, reports, compared_path_file); + } } fn render_header(output: &mut String) { @@ -30,3 +39,149 @@ fn render_reports(output: &mut String, reports: &Vec) { ); } } + +fn render_and_compare( + output: &mut String, + reports: &Vec, + compared_path_file: &str, +) { + let compared_file = File::open(compared_path_file).unwrap_or_else(|_| { + panic!( + "Failed to open compared file at path: {}", + compared_path_file + ) + }); + + let mut compared_reports = Vec::new(); + if compared_path_file.ends_with("md") { + compared_reports = parse_into_code_report_json(compared_file); + } else { + } + + for report in reports.iter() { + let path: String = report + .path + .split('/') + .last() + .expect("no output path") + .to_owned(); + if compared_reports.is_empty() { + writeln_output_str( + output, + format!( + "| {} | {} | {} | {} |", + path, report.size, report.has_allocator, report.has_panic + ), + ); + continue; + } + + if let Some(compared_report) = find_report_by_path(&compared_reports, &path) { + print_compared_output(output, report, compared_report); + } + } +} + +fn parse_into_code_report_json(compared_file: File) -> Vec { + let reader = BufReader::new(compared_file); + + let mut lines = reader.lines().skip(2); + + let mut compared_reports: Vec = Vec::new(); + + while let Some(line) = lines.next() { + match line { + Ok(l) => { + let columns: Vec = l + .split('|') + .map(|s| s.trim().to_string()) + .filter(|s| !s.is_empty()) + .collect(); + + if columns.len() == 4 { + compared_reports.push(CodeReportJson { + path: columns[0].to_owned(), + size: columns[1].parse::().unwrap(), + has_allocator: columns[2].parse::().unwrap(), + has_panic: columns[3].to_owned(), + }) + } + }, + Err(_) => return compared_reports, + } + } + + compared_reports +} + +fn find_report_by_path<'a>( + reports: &'a Vec, + contract_path: &'a String, +) -> Option<&'a CodeReportJson> { + for report in reports { + if report.path == *contract_path { + return Some(report); + } + } + + None +} + +fn print_compared_output( + output: &mut String, + report: &CodeReportJson, + compared_report: &CodeReportJson, +) { + let mut size_report; + if report.size == compared_report.size { + size_report = format!("{}", report.size); + } else { + size_report = format!("{} :arrow-right: {}", compared_report.size, report.size); + if report.size > compared_report.size { + size_report = format!("{size_report} :red-circle:"); + } else if report.size < compared_report.size { + size_report = format!("{size_report} :green-circle:"); + } + } + + let mut has_allocator_report; + if report.has_allocator == compared_report.has_allocator { + has_allocator_report = format!("{}", report.has_allocator); + } else { + has_allocator_report = format!( + "{} :arrow-right: {}", + compared_report.has_allocator, report.has_allocator + ); + + if !report.has_allocator { + has_allocator_report = format!("{has_allocator_report} :green-circle:"); + } else { + has_allocator_report = format!("{has_allocator_report} :red-circle:"); + } + } + + let mut has_panic_report; + if report.has_panic == compared_report.has_panic { + has_panic_report = format!("{}", report.has_allocator); + } else { + has_panic_report = format!( + "{} :arrow-right: {}", + compared_report.has_panic, report.has_panic + ); + + if report.has_panic == "none" { + has_panic_report = format!("{has_panic_report} :green-circle:"); + } + } + + writeln_output_str( + output, + format!( + "| {} | {} | {} | {} |", + report.path.split('/').last().expect("no output path"), + size_report, + has_allocator_report, + has_panic_report + ), + ); +} diff --git a/out.md b/out.md new file mode 100644 index 0000000000..ad609f4877 --- /dev/null +++ b/out.md @@ -0,0 +1,94 @@ +| Path                                                         |                                     size |                  has-allocator |                     has-format | +| :-- | --: | --: | --: | +| token-release.wasm | 7776 | false | without message | +| adder.wasm | 696 | false | none | +| order-book-pair.wasm | 13780 | false | without message | +| order-book-factory.wasm | 3771 | false | without message | +| nft-storage-prepay.wasm | 2295 | false | none | +| multisig.wasm | 14145 | false | without message | +| multisig-full.wasm | 15672 | false | without message | +| multisig-view.wasm | 6248 | false | without message | +| bonding-curve-contract.wasm | 14735 | false | without message | +| seed-nft-minter.wasm | 15118 | false | without message | +| rewards-distribution.wasm | 10220 | false | without message | +| crypto-bubbles.wasm | 2347 | false | none | +| kitty-auction.wasm | 10065 | false | without message | +| kitty-genetic-alg.wasm | 3147 | false | without message | +| kitty-ownership.wasm | 12731 | false | without message | +| nft-subscription.wasm | 8793 | false | without message | +| proxy-pause.wasm | 4627 | false | without message | +| lottery-esdt.wasm | 10989 | false | without message | +| esdt-transfer-with-fee.wasm | 7779 | false | without message | +| check-pause.wasm | 1228 | false | none | +| factorial.wasm | 576 | false | none | +| digital-cash.wasm | 10047 | false | without message | +| crypto-zombies.wasm | 10304 | false | without message | +| nft-minter.wasm | 10028 | false | without message | +| empty.wasm | 241 | false | none | +| fractional-nfts.wasm | 8447 | false | without message | +| crowdfunding-esdt.wasm | 3988 | false | none | +| ping-pong-egld.wasm | 6032 | false | without message | +| send-tx-repeat.wasm | 901 | false | none | +| large-storage.wasm | 2164 | false | without message | +| map-repeat.wasm | 7234 | false | without message | +| queue-repeat.wasm | 5853 | false | without message | +| set-repeat.wasm | 7013 | false | without message | +| single-value-repeat.wasm | 4440 | false | without message | +| linked-list-repeat.wasm | 6681 | true | without message | +| vec-repeat.wasm | 5231 | false | without message | +| str-repeat.wasm | 2389 | false | without message | +| str-repeat-mb-builder-cached.wasm | 1139 | false | without message | +| str-repeat-mb-builder-basic.wasm | 759 | false | none | +| big-float-features.wasm | 6468 | false | without message | +| erc20.wasm | 2133 | false | none | +| erc721.wasm | 2578 | false | none | +| lottery-erc20.wasm | 12814 | false | without message | +| erc1155-marketplace.wasm | 11172 | false | without message | +| crowdfunding-erc20.wasm | 5331 | false | without message | +| erc1155-user-mock.wasm | 1360 | false | without message | +| erc1155.wasm | 12197 | false | without message | +| scenario-tester.wasm | 1114 | false | none | +| managed-map-features.wasm | 1315 | false | none | +| use-module-view.wasm | 733 | false | none | +| use-module.wasm | 33452 | false | without message | +| rust-snippets-generator-test.wasm | 4979 | false | without message | +| basic-features.wasm | 65181 | false | without message | +| basic-features-storage-bytes.wasm | 538 | false | none | +| payable-features.wasm | 4396 | false | without message | +| promises-features.wasm | 12926 | false | without message | +| vault-promises.wasm | 8523 | false | without message | +| vault-upgrade.wasm | 700 | false | none | +| vault.wasm | 7826 | false | without message | +| first-contract.wasm | 3086 | false | without message | +| second-contract.wasm | 1355 | false | none | +| forwarder-legacy.wasm | 32330 | false | without message | +| proxy-test-second.wasm | 2105 | false | without message | +| recursive-caller.wasm | 5466 | false | without message | +| forwarder-queue-promises.wasm | 13096 | false | without message | +| forwarder-queue.wasm | 12181 | false | without message | +| forwarder.wasm | 32687 | false | without message | +| builtin-func-features.wasm | 1101 | false | none | +| local-esdt-and-nft.wasm | 12071 | false | without message | +| forwarder-raw.wasm | 15309 | false | without message | +| forwarder-raw-init-sync-call.wasm | 3332 | false | none | +| forwarder-raw-init-async-call.wasm | 3062 | false | none | +| parent.wasm | 1678 | false | none | +| child.wasm | 4057 | false | without message | +| transfer-role-features.wasm | 8775 | false | without message | +| proxy-test-first.wasm | 6031 | false | without message | +| exchange-features.wasm | 1577 | false | none | +| alloc-features.wasm | 16748 | false | without message | +| alloc-mem-leaking.wasm | 16857 | false | without message | +| alloc-mem-fail.wasm | 16682 | true | without message | +| abi-tester.wasm | 7182 | true | without message | +| abi-tester-ev.wasm | 757 | false | none | +| panic-message-features.wasm | 12875 | false | with message | +| formatted-message-features.wasm | 3470 | false | without message | +| multi-contract-features.wasm | 678 | false | none | +| multi-contract-alt-impl.wasm | 360 | false | none | +| multi-contract-example-feature.wasm | 677 | false | none | +| multi-contract-features-view.wasm | 1115 | false | none | +| rust-testing-framework-tester.wasm | 8602 | false | without message | +| esdt-system-sc-mock.wasm | 3799 | false | none | +| multiversx-wegld-swap-sc.wasm | 3557 | false | without message | +| multiversx-price-aggregator-sc.wasm | 19327 | false | without message | diff --git a/sdk/core/src/gateway/gateway_proxy.rs b/sdk/core/src/gateway/gateway_proxy.rs index 47925cd79f..fb3ec42436 100644 --- a/sdk/core/src/gateway/gateway_proxy.rs +++ b/sdk/core/src/gateway/gateway_proxy.rs @@ -18,4 +18,4 @@ impl GatewayProxy { pub(crate) fn get_endpoint(&self, endpoint: &str) -> String { format!("{}/{}", self.proxy_url, endpoint) } -} +} //http://api-multiversx.com/ From 02a8a64f84553f1c3055c09104c9f699ca74c450 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Fri, 19 Jul 2024 23:42:26 +0300 Subject: [PATCH 05/29] cli code report - cargo clippy --- framework/meta/src/cmd/code_report.rs | 6 +-- .../{code_report.rs => generate_report.rs} | 0 .../src/cmd/code_report/render_code_report.rs | 48 +++++++++---------- 3 files changed, 25 insertions(+), 29 deletions(-) rename framework/meta/src/cmd/code_report/{code_report.rs => generate_report.rs} (100%) diff --git a/framework/meta/src/cmd/code_report.rs b/framework/meta/src/cmd/code_report.rs index a10efc78dc..26b0a15a34 100644 --- a/framework/meta/src/cmd/code_report.rs +++ b/framework/meta/src/cmd/code_report.rs @@ -1,7 +1,7 @@ -pub mod code_report; +pub mod generate_report; pub mod render_code_report; -use code_report::run_code_report; +use generate_report::run_code_report; use crate::cli::{CodeReportArgs, OutputFormat}; @@ -16,6 +16,6 @@ pub fn code_report(args: &CodeReportArgs) { path, args.output.as_ref().unwrap_or(&"./report.md".to_string()), args.format.as_ref().unwrap_or(&OutputFormat::default()), - &args.compare.clone().unwrap_or(String::new()), + &args.compare.clone().unwrap_or_default(), ); } diff --git a/framework/meta/src/cmd/code_report/code_report.rs b/framework/meta/src/cmd/code_report/generate_report.rs similarity index 100% rename from framework/meta/src/cmd/code_report/code_report.rs rename to framework/meta/src/cmd/code_report/generate_report.rs diff --git a/framework/meta/src/cmd/code_report/render_code_report.rs b/framework/meta/src/cmd/code_report/render_code_report.rs index 46bd1a52fc..6d5c2763cd 100644 --- a/framework/meta/src/cmd/code_report/render_code_report.rs +++ b/framework/meta/src/cmd/code_report/render_code_report.rs @@ -40,11 +40,7 @@ fn render_reports(output: &mut String, reports: &Vec) { } } -fn render_and_compare( - output: &mut String, - reports: &Vec, - compared_path_file: &str, -) { +fn render_and_compare(output: &mut String, reports: &[CodeReportJson], compared_path_file: &str) { let compared_file = File::open(compared_path_file).unwrap_or_else(|_| { panic!( "Failed to open compared file at path: {}", @@ -85,11 +81,11 @@ fn render_and_compare( fn parse_into_code_report_json(compared_file: File) -> Vec { let reader = BufReader::new(compared_file); - let mut lines = reader.lines().skip(2); + let lines = reader.lines().skip(2); let mut compared_reports: Vec = Vec::new(); - while let Some(line) = lines.next() { + for line in lines { match line { Ok(l) => { let columns: Vec = l @@ -115,16 +111,10 @@ fn parse_into_code_report_json(compared_file: File) -> Vec { } fn find_report_by_path<'a>( - reports: &'a Vec, + reports: &'a [CodeReportJson], contract_path: &'a String, ) -> Option<&'a CodeReportJson> { - for report in reports { - if report.path == *contract_path { - return Some(report); - } - } - - None + reports.iter().find(|&report| report.path == *contract_path) } fn print_compared_output( @@ -132,17 +122,23 @@ fn print_compared_output( report: &CodeReportJson, compared_report: &CodeReportJson, ) { - let mut size_report; - if report.size == compared_report.size { - size_report = format!("{}", report.size); - } else { - size_report = format!("{} :arrow-right: {}", compared_report.size, report.size); - if report.size > compared_report.size { - size_report = format!("{size_report} :red-circle:"); - } else if report.size < compared_report.size { - size_report = format!("{size_report} :green-circle:"); - } - } + let size_report = match report.size.cmp(&compared_report.size) { + std::cmp::Ordering::Greater => { + format!( + "{} :arrow-right: {} :red-circle:", + compared_report.size, report.size + ) + }, + std::cmp::Ordering::Less => { + format!( + "{} :arrow-right: {} :green-circle:", + compared_report.size, report.size + ) + }, + std::cmp::Ordering::Equal => { + format!("{}", report.size) + }, + }; let mut has_allocator_report; if report.has_allocator == compared_report.has_allocator { From b0a2d1165addc944be1d9162403e9130f3b65875 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Sat, 20 Jul 2024 18:25:24 +0300 Subject: [PATCH 06/29] cli code report - impl changes, integrate in a structure --- contracts/benchmarks/report.json | 1 - framework/meta/src/cli/cli_args_standalone.rs | 6 +- framework/meta/src/cmd/code_report.rs | 5 +- framework/meta/src/cmd/code_report/compare.rs | 87 ++++++ .../src/cmd/code_report/generate_report.rs | 22 +- .../src/cmd/code_report/render_code_report.rs | 261 +++++++----------- out.md | 94 ------- 7 files changed, 211 insertions(+), 265 deletions(-) delete mode 100644 contracts/benchmarks/report.json create mode 100644 framework/meta/src/cmd/code_report/compare.rs delete mode 100644 out.md diff --git a/contracts/benchmarks/report.json b/contracts/benchmarks/report.json deleted file mode 100644 index bb94c6b60a..0000000000 --- a/contracts/benchmarks/report.json +++ /dev/null @@ -1 +0,0 @@ -[{"path":"../output/send-tx-repeat.wasm","size":901,"hasAllocator":false,"hasPanic":"none"},{"path":"../output/large-storage.wasm","size":2164,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/map-repeat.wasm","size":7234,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/queue-repeat.wasm","size":5853,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/set-repeat.wasm","size":7013,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/single-value-repeat.wasm","size":4440,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/linked-list-repeat.wasm","size":6681,"hasAllocator":true,"hasPanic":"without message"},{"path":"../output/vec-repeat.wasm","size":5231,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/str-repeat.wasm","size":2389,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/str-repeat-mb-builder-cached.wasm","size":1139,"hasAllocator":false,"hasPanic":"without message"},{"path":"../output/str-repeat-mb-builder-basic.wasm","size":759,"hasAllocator":false,"hasPanic":"none"}] \ No newline at end of file diff --git a/framework/meta/src/cli/cli_args_standalone.rs b/framework/meta/src/cli/cli_args_standalone.rs index 453b136432..9bb5aad9fc 100644 --- a/framework/meta/src/cli/cli_args_standalone.rs +++ b/framework/meta/src/cli/cli_args_standalone.rs @@ -151,15 +151,15 @@ pub struct CodeReportArgs { /// Output file path #[arg(short, long, verbatim_doc_comment)] - pub output: Option, + pub output: PathBuf, /// Output format #[arg(short, long, verbatim_doc_comment)] pub format: Option, - /// Compare + /// Compare two reports. Output available only for Markdown format #[arg(short, long, verbatim_doc_comment)] - pub compare: Option, + pub compare: Option, } #[derive(Default, Clone, PartialEq, Eq, Debug, Args)] diff --git a/framework/meta/src/cmd/code_report.rs b/framework/meta/src/cmd/code_report.rs index 26b0a15a34..f3c8ff8cbe 100644 --- a/framework/meta/src/cmd/code_report.rs +++ b/framework/meta/src/cmd/code_report.rs @@ -1,3 +1,4 @@ +pub mod compare; pub mod generate_report; pub mod render_code_report; @@ -14,8 +15,8 @@ pub fn code_report(args: &CodeReportArgs) { run_code_report( path, - args.output.as_ref().unwrap_or(&"./report.md".to_string()), + args.output.to_str().unwrap(), args.format.as_ref().unwrap_or(&OutputFormat::default()), - &args.compare.clone().unwrap_or_default(), + args.compare.clone().unwrap_or_default().to_str().unwrap(), ); } diff --git a/framework/meta/src/cmd/code_report/compare.rs b/framework/meta/src/cmd/code_report/compare.rs new file mode 100644 index 0000000000..98a72676cf --- /dev/null +++ b/framework/meta/src/cmd/code_report/compare.rs @@ -0,0 +1,87 @@ +use std::io::BufRead; + +use multiversx_sc_meta_lib::code_report_json::CodeReportJson; + +pub(crate) fn parse_into_code_report_json( + compared_file_reader: &mut dyn BufRead, +) -> Vec { + let lines = compared_file_reader.lines().skip(2); + + let mut compared_reports: Vec = Vec::new(); + + for line in lines { + match line { + Ok(l) => { + let columns: Vec = l + .split('|') + .map(|s| s.trim().to_string()) + .filter(|s| !s.is_empty()) + .collect(); + + if columns.len() == 4 { + compared_reports.push(CodeReportJson { + path: columns[0] + .split('/') + .last() + .unwrap_or_else(|| &columns[0]) + .to_owned(), + size: columns[1].parse::().unwrap(), + has_allocator: columns[2].parse::().unwrap(), + has_panic: columns[3].to_owned(), + }) + } + }, + Err(_) => return compared_reports, + } + } + + compared_reports +} + +pub(crate) fn size_status_after_comparing(size: usize, compared_size: usize) -> String { + match size.cmp(&compared_size) { + std::cmp::Ordering::Greater => { + format!("{} :arrow-right: {} :red-circle:", compared_size, size) + }, + std::cmp::Ordering::Less => { + format!("{} :arrow-right: {} :green-circle:", compared_size, size) + }, + std::cmp::Ordering::Equal => { + format!("{}", size) + }, + } +} + +pub(crate) fn allocator_status_after_comparing( + has_allocator: bool, + compared_has_allocator: bool, +) -> String { + if compared_has_allocator == has_allocator { + return format!("{}", has_allocator); + } + + let allocator_status = format!("{} :arrow-right: {}", compared_has_allocator, has_allocator); + + if !has_allocator { + format!("{allocator_status} :green-circle:") + } else { + format!("{allocator_status} :red-circle:") + } +} + +pub(crate) fn panic_status_after_comparing( + has_panic: &String, + compared_has_panic: &String, +) -> String { + if has_panic == compared_has_panic { + return has_panic.to_string(); + } + + let panic_status = format!("{} :arrow-right: {}", compared_has_panic, has_panic); + + if has_panic == "none" { + return format!("{panic_status} :green-circle:"); + } + + panic_status +} diff --git a/framework/meta/src/cmd/code_report/generate_report.rs b/framework/meta/src/cmd/code_report/generate_report.rs index 3c2fce2c6b..d921a21327 100644 --- a/framework/meta/src/cmd/code_report/generate_report.rs +++ b/framework/meta/src/cmd/code_report/generate_report.rs @@ -1,5 +1,6 @@ use std::{ - fs::{self, read_dir, File}, + fs::{read_dir, File}, + io::Write, path::PathBuf, process::Command, }; @@ -10,26 +11,25 @@ use multiversx_sc_meta_lib::{ self, code_report_json::CodeReportJson, mxsc_file_json::MxscFileJson, }; -use super::render_code_report::render_report; +use super::render_code_report::CodeReportRender; pub fn run_code_report(path: &str, output_path: &str, output_format: &OutputFormat, compare: &str) { let directors = RelevantDirectories::find_all(path, &["".to_owned()]); let reports = extract_report(directors); - let mut output = String::new(); + + let mut file = create_file(output_path); match output_format { OutputFormat::Markdown => { - render_report(&mut output, &reports, compare); + let mut render_code_report = CodeReportRender::new(&mut file, compare, &reports); + render_code_report.render_report(); }, OutputFormat::Json => { - output = serde_json::to_string(&reports).unwrap(); + let json_output = serde_json::to_string(&reports).unwrap(); + file.write_all(json_output.as_bytes()).unwrap(); }, }; - - let Ok(_) = fs::write(output_path, output) else { - return; - }; } fn extract_report(directors: RelevantDirectories) -> Vec { @@ -92,3 +92,7 @@ fn extract_reports(path: &PathBuf, reports: &mut Vec) { reports.push(data.report.code_report); } } + +fn create_file(file_path: &str) -> File { + File::create(file_path).expect("could not write report file") +} diff --git a/framework/meta/src/cmd/code_report/render_code_report.rs b/framework/meta/src/cmd/code_report/render_code_report.rs index 6d5c2763cd..a34c1be3d0 100644 --- a/framework/meta/src/cmd/code_report/render_code_report.rs +++ b/framework/meta/src/cmd/code_report/render_code_report.rs @@ -1,183 +1,132 @@ -use std::{ - fmt::Write, - fs::File, - io::{BufRead, BufReader}, -}; - -use multiversx_sc_meta_lib::code_report_json::CodeReportJson; +use core::panic; +use std::{fmt::Display, fs::File, io::BufReader}; -fn writeln_output_str>(output: &mut String, input: S) { - output.write_str(&format!("{}\n", input.as_ref())).ok(); +pub struct CodeReportRender<'a> { + pub file: Option<&'a mut dyn std::io::Write>, + pub compared_path_file: &'a str, + pub reports: &'a [CodeReportJson], } -pub fn render_report(output: &mut String, reports: &Vec, compared_path_file: &str) { - render_header(output); +use multiversx_sc_meta_lib::code_report_json::CodeReportJson; - if compared_path_file.is_empty() { - render_reports(output, reports); - } else { - render_and_compare(output, reports, compared_path_file); +use super::compare::{ + allocator_status_after_comparing, panic_status_after_comparing, parse_into_code_report_json, + size_status_after_comparing, +}; + +impl<'a> CodeReportRender<'a> { + pub fn new( + file: &'a mut dyn std::io::Write, + compared_path_file: &'a str, + reports: &'a [CodeReportJson], + ) -> Self { + Self { + file: Some(file), + compared_path_file, + reports, + } } -} -fn render_header(output: &mut String) { - writeln_output_str(output, "| Path                                                         |                                     size |                  has-allocator |                     has-format |"); - writeln_output_str(output, "| :-- | --: | --: | --: |"); -} + pub fn render_report(&mut self) { + self.render_header(); -fn render_reports(output: &mut String, reports: &Vec) { - for report in reports { - writeln_output_str( - output, - format!( - "| {} | {} | {} | {} |", - report.path.split('/').last().expect("no output path"), - report.size, - report.has_allocator, - report.has_panic - ), - ); + if self.compared_path_file.is_empty() { + self.render_reports(); + } else { + self.render_reports_and_compare(); + } } -} -fn render_and_compare(output: &mut String, reports: &[CodeReportJson], compared_path_file: &str) { - let compared_file = File::open(compared_path_file).unwrap_or_else(|_| { - panic!( - "Failed to open compared file at path: {}", - compared_path_file - ) - }); - - let mut compared_reports = Vec::new(); - if compared_path_file.ends_with("md") { - compared_reports = parse_into_code_report_json(compared_file); - } else { + fn writeln(&mut self, s: impl Display) { + let file = self.file.as_mut().unwrap(); + file.write_all(s.to_string().as_bytes()).unwrap(); + file.write_all(b"\n").unwrap(); } - for report in reports.iter() { - let path: String = report - .path - .split('/') - .last() - .expect("no output path") - .to_owned(); - if compared_reports.is_empty() { - writeln_output_str( - output, - format!( - "| {} | {} | {} | {} |", - path, report.size, report.has_allocator, report.has_panic - ), - ); - continue; - } + fn write_report_for_contract( + &mut self, + path: &String, + size: &String, + has_allocator: &String, + has_panic: &String, + ) { + self.writeln(format!( + "| {} | {} | {} | {} |", + path.split('/').last().unwrap_or_else(|| path), + size, + has_allocator, + has_panic + )); + } - if let Some(compared_report) = find_report_by_path(&compared_reports, &path) { - print_compared_output(output, report, compared_report); + fn render_header(&mut self) { + if !self.compared_path_file.is_empty() { + self.writeln(format!( + "Contract comparison with {}", + self.compared_path_file + )) } + + self.writeln("| Path                                                         |                                     size |                  has-allocator |                     has-format |"); + self.writeln("| :-- | --: | --: | --: |"); } -} -fn parse_into_code_report_json(compared_file: File) -> Vec { - let reader = BufReader::new(compared_file); - - let lines = reader.lines().skip(2); - - let mut compared_reports: Vec = Vec::new(); - - for line in lines { - match line { - Ok(l) => { - let columns: Vec = l - .split('|') - .map(|s| s.trim().to_string()) - .filter(|s| !s.is_empty()) - .collect(); - - if columns.len() == 4 { - compared_reports.push(CodeReportJson { - path: columns[0].to_owned(), - size: columns[1].parse::().unwrap(), - has_allocator: columns[2].parse::().unwrap(), - has_panic: columns[3].to_owned(), - }) - } - }, - Err(_) => return compared_reports, + fn render_reports(&mut self) { + for report in self.reports { + self.write_report_for_contract( + &report.path, + &report.size.to_string(), + &report.has_allocator.to_string(), + &report.has_panic, + ); } } - compared_reports -} - -fn find_report_by_path<'a>( - reports: &'a [CodeReportJson], - contract_path: &'a String, -) -> Option<&'a CodeReportJson> { - reports.iter().find(|&report| report.path == *contract_path) -} - -fn print_compared_output( - output: &mut String, - report: &CodeReportJson, - compared_report: &CodeReportJson, -) { - let size_report = match report.size.cmp(&compared_report.size) { - std::cmp::Ordering::Greater => { - format!( - "{} :arrow-right: {} :red-circle:", - compared_report.size, report.size - ) - }, - std::cmp::Ordering::Less => { - format!( - "{} :arrow-right: {} :green-circle:", - compared_report.size, report.size + fn render_reports_and_compare(&mut self) { + let compared_file = File::open(self.compared_path_file).unwrap_or_else(|_| { + panic!( + "Failed to open compared file at path: {}", + self.compared_path_file ) - }, - std::cmp::Ordering::Equal => { - format!("{}", report.size) - }, - }; - - let mut has_allocator_report; - if report.has_allocator == compared_report.has_allocator { - has_allocator_report = format!("{}", report.has_allocator); - } else { - has_allocator_report = format!( - "{} :arrow-right: {}", - compared_report.has_allocator, report.has_allocator - ); + }); + let mut compared_file_reader = BufReader::new(compared_file); - if !report.has_allocator { - has_allocator_report = format!("{has_allocator_report} :green-circle:"); + let compared_reports = if self.compared_path_file.ends_with("md") { + // this is only one time compare. Decide weather to exist or not + parse_into_code_report_json(&mut compared_file_reader) } else { - has_allocator_report = format!("{has_allocator_report} :red-circle:"); + serde_json::from_reader(compared_file_reader) + .unwrap_or_else(|_| panic!("Cannot deserialize into code report structure.")) + }; + + for report in self.reports.iter() { + if let Some(compared_report) = compared_reports.iter().find(|cr| { + cr.path + == report + .path + .split('/') + .last() + .unwrap_or_else(|| &report.path) + }) { + self.print_compared_output(report, compared_report); + } } } - let mut has_panic_report; - if report.has_panic == compared_report.has_panic { - has_panic_report = format!("{}", report.has_allocator); - } else { - has_panic_report = format!( - "{} :arrow-right: {}", - compared_report.has_panic, report.has_panic - ); + fn print_compared_output(&mut self, report: &CodeReportJson, compared_report: &CodeReportJson) { + let size_report = size_status_after_comparing(report.size, compared_report.size); - if report.has_panic == "none" { - has_panic_report = format!("{has_panic_report} :green-circle:"); - } - } + let has_allocator_report = + allocator_status_after_comparing(report.has_allocator, compared_report.has_allocator); - writeln_output_str( - output, - format!( - "| {} | {} | {} | {} |", - report.path.split('/').last().expect("no output path"), - size_report, - has_allocator_report, - has_panic_report - ), - ); + let has_panic_report = + panic_status_after_comparing(&report.has_panic, &compared_report.has_panic); + + self.write_report_for_contract( + &report.path, + &size_report, + &has_allocator_report, + &has_panic_report, + ); + } } diff --git a/out.md b/out.md deleted file mode 100644 index ad609f4877..0000000000 --- a/out.md +++ /dev/null @@ -1,94 +0,0 @@ -| Path                                                         |                                     size |                  has-allocator |                     has-format | -| :-- | --: | --: | --: | -| token-release.wasm | 7776 | false | without message | -| adder.wasm | 696 | false | none | -| order-book-pair.wasm | 13780 | false | without message | -| order-book-factory.wasm | 3771 | false | without message | -| nft-storage-prepay.wasm | 2295 | false | none | -| multisig.wasm | 14145 | false | without message | -| multisig-full.wasm | 15672 | false | without message | -| multisig-view.wasm | 6248 | false | without message | -| bonding-curve-contract.wasm | 14735 | false | without message | -| seed-nft-minter.wasm | 15118 | false | without message | -| rewards-distribution.wasm | 10220 | false | without message | -| crypto-bubbles.wasm | 2347 | false | none | -| kitty-auction.wasm | 10065 | false | without message | -| kitty-genetic-alg.wasm | 3147 | false | without message | -| kitty-ownership.wasm | 12731 | false | without message | -| nft-subscription.wasm | 8793 | false | without message | -| proxy-pause.wasm | 4627 | false | without message | -| lottery-esdt.wasm | 10989 | false | without message | -| esdt-transfer-with-fee.wasm | 7779 | false | without message | -| check-pause.wasm | 1228 | false | none | -| factorial.wasm | 576 | false | none | -| digital-cash.wasm | 10047 | false | without message | -| crypto-zombies.wasm | 10304 | false | without message | -| nft-minter.wasm | 10028 | false | without message | -| empty.wasm | 241 | false | none | -| fractional-nfts.wasm | 8447 | false | without message | -| crowdfunding-esdt.wasm | 3988 | false | none | -| ping-pong-egld.wasm | 6032 | false | without message | -| send-tx-repeat.wasm | 901 | false | none | -| large-storage.wasm | 2164 | false | without message | -| map-repeat.wasm | 7234 | false | without message | -| queue-repeat.wasm | 5853 | false | without message | -| set-repeat.wasm | 7013 | false | without message | -| single-value-repeat.wasm | 4440 | false | without message | -| linked-list-repeat.wasm | 6681 | true | without message | -| vec-repeat.wasm | 5231 | false | without message | -| str-repeat.wasm | 2389 | false | without message | -| str-repeat-mb-builder-cached.wasm | 1139 | false | without message | -| str-repeat-mb-builder-basic.wasm | 759 | false | none | -| big-float-features.wasm | 6468 | false | without message | -| erc20.wasm | 2133 | false | none | -| erc721.wasm | 2578 | false | none | -| lottery-erc20.wasm | 12814 | false | without message | -| erc1155-marketplace.wasm | 11172 | false | without message | -| crowdfunding-erc20.wasm | 5331 | false | without message | -| erc1155-user-mock.wasm | 1360 | false | without message | -| erc1155.wasm | 12197 | false | without message | -| scenario-tester.wasm | 1114 | false | none | -| managed-map-features.wasm | 1315 | false | none | -| use-module-view.wasm | 733 | false | none | -| use-module.wasm | 33452 | false | without message | -| rust-snippets-generator-test.wasm | 4979 | false | without message | -| basic-features.wasm | 65181 | false | without message | -| basic-features-storage-bytes.wasm | 538 | false | none | -| payable-features.wasm | 4396 | false | without message | -| promises-features.wasm | 12926 | false | without message | -| vault-promises.wasm | 8523 | false | without message | -| vault-upgrade.wasm | 700 | false | none | -| vault.wasm | 7826 | false | without message | -| first-contract.wasm | 3086 | false | without message | -| second-contract.wasm | 1355 | false | none | -| forwarder-legacy.wasm | 32330 | false | without message | -| proxy-test-second.wasm | 2105 | false | without message | -| recursive-caller.wasm | 5466 | false | without message | -| forwarder-queue-promises.wasm | 13096 | false | without message | -| forwarder-queue.wasm | 12181 | false | without message | -| forwarder.wasm | 32687 | false | without message | -| builtin-func-features.wasm | 1101 | false | none | -| local-esdt-and-nft.wasm | 12071 | false | without message | -| forwarder-raw.wasm | 15309 | false | without message | -| forwarder-raw-init-sync-call.wasm | 3332 | false | none | -| forwarder-raw-init-async-call.wasm | 3062 | false | none | -| parent.wasm | 1678 | false | none | -| child.wasm | 4057 | false | without message | -| transfer-role-features.wasm | 8775 | false | without message | -| proxy-test-first.wasm | 6031 | false | without message | -| exchange-features.wasm | 1577 | false | none | -| alloc-features.wasm | 16748 | false | without message | -| alloc-mem-leaking.wasm | 16857 | false | without message | -| alloc-mem-fail.wasm | 16682 | true | without message | -| abi-tester.wasm | 7182 | true | without message | -| abi-tester-ev.wasm | 757 | false | none | -| panic-message-features.wasm | 12875 | false | with message | -| formatted-message-features.wasm | 3470 | false | without message | -| multi-contract-features.wasm | 678 | false | none | -| multi-contract-alt-impl.wasm | 360 | false | none | -| multi-contract-example-feature.wasm | 677 | false | none | -| multi-contract-features-view.wasm | 1115 | false | none | -| rust-testing-framework-tester.wasm | 8602 | false | without message | -| esdt-system-sc-mock.wasm | 3799 | false | none | -| multiversx-wegld-swap-sc.wasm | 3557 | false | without message | -| multiversx-price-aggregator-sc.wasm | 19327 | false | without message | From 8cd1aebb0a820922c2cb9e9357be10915cd5432a Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Sat, 20 Jul 2024 18:31:48 +0300 Subject: [PATCH 07/29] cli code report - cleanup --- sdk/core/src/gateway/gateway_proxy.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/core/src/gateway/gateway_proxy.rs b/sdk/core/src/gateway/gateway_proxy.rs index fb3ec42436..47925cd79f 100644 --- a/sdk/core/src/gateway/gateway_proxy.rs +++ b/sdk/core/src/gateway/gateway_proxy.rs @@ -18,4 +18,4 @@ impl GatewayProxy { pub(crate) fn get_endpoint(&self, endpoint: &str) -> String { format!("{}/{}", self.proxy_url, endpoint) } -} //http://api-multiversx.com/ +} From 88dd0be67d98415ea3a3465f490b0d6d6b37297c Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Sat, 20 Jul 2024 18:43:38 +0300 Subject: [PATCH 08/29] cli code report - fix commented line --- framework/meta/src/cmd/code_report/render_code_report.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/meta/src/cmd/code_report/render_code_report.rs b/framework/meta/src/cmd/code_report/render_code_report.rs index a34c1be3d0..e15ebe42ad 100644 --- a/framework/meta/src/cmd/code_report/render_code_report.rs +++ b/framework/meta/src/cmd/code_report/render_code_report.rs @@ -92,7 +92,7 @@ impl<'a> CodeReportRender<'a> { let mut compared_file_reader = BufReader::new(compared_file); let compared_reports = if self.compared_path_file.ends_with("md") { - // this is only one time compare. Decide weather to exist or not + // TODO this is only one time compared. Decide whether to exist or not parse_into_code_report_json(&mut compared_file_reader) } else { serde_json::from_reader(compared_file_reader) From 3ea894fde6059b5273c7f3f874807c57de82a987 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Fri, 26 Jul 2024 12:40:24 +0300 Subject: [PATCH 09/29] code report - sanitize paths --- framework/meta/src/cmd/code_report/compare.rs | 6 +----- .../meta/src/cmd/code_report/generate_report.rs | 14 ++++++++++++++ .../meta/src/cmd/code_report/render_code_report.rs | 10 ++-------- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/framework/meta/src/cmd/code_report/compare.rs b/framework/meta/src/cmd/code_report/compare.rs index 98a72676cf..c21aae953e 100644 --- a/framework/meta/src/cmd/code_report/compare.rs +++ b/framework/meta/src/cmd/code_report/compare.rs @@ -20,11 +20,7 @@ pub(crate) fn parse_into_code_report_json( if columns.len() == 4 { compared_reports.push(CodeReportJson { - path: columns[0] - .split('/') - .last() - .unwrap_or_else(|| &columns[0]) - .to_owned(), + path: columns[0].to_owned(), size: columns[1].parse::().unwrap(), has_allocator: columns[2].parse::().unwrap(), has_panic: columns[3].to_owned(), diff --git a/framework/meta/src/cmd/code_report/generate_report.rs b/framework/meta/src/cmd/code_report/generate_report.rs index d921a21327..c92ae712ab 100644 --- a/framework/meta/src/cmd/code_report/generate_report.rs +++ b/framework/meta/src/cmd/code_report/generate_report.rs @@ -42,6 +42,8 @@ fn extract_report(directors: RelevantDirectories) -> Vec { extract_reports(&output_path, &mut reports); + sanitize_output_path_from_report(&mut reports); + clean_contract(&director.path); } @@ -96,3 +98,15 @@ fn extract_reports(path: &PathBuf, reports: &mut Vec) { fn create_file(file_path: &str) -> File { File::create(file_path).expect("could not write report file") } + +fn sanitize_output_path_from_report(reports: &mut Vec) { + for report in reports { + let new_path = report + .path + .split('/') + .last() + .unwrap_or_else(|| &report.path); + + report.path = new_path.to_owned(); + } +} diff --git a/framework/meta/src/cmd/code_report/render_code_report.rs b/framework/meta/src/cmd/code_report/render_code_report.rs index e15ebe42ad..7b87a29493 100644 --- a/framework/meta/src/cmd/code_report/render_code_report.rs +++ b/framework/meta/src/cmd/code_report/render_code_report.rs @@ -100,14 +100,8 @@ impl<'a> CodeReportRender<'a> { }; for report in self.reports.iter() { - if let Some(compared_report) = compared_reports.iter().find(|cr| { - cr.path - == report - .path - .split('/') - .last() - .unwrap_or_else(|| &report.path) - }) { + if let Some(compared_report) = compared_reports.iter().find(|cr| cr.path == report.path) + { self.print_compared_output(report, compared_report); } } From 4577bbe64b4fd0ae29f54c3400d0b22076c5d890 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Fri, 26 Jul 2024 12:55:02 +0300 Subject: [PATCH 10/29] code report - test github actions --- .github/workflows/actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index dc0bcc8596..686ab495dd 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -14,7 +14,7 @@ permissions: jobs: contracts: name: Contracts - uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@v3.1.0 + uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@dcb4ee50efcb83709d5af181232f4380d931eeae with: rust-toolchain: stable path-to-sc-meta: framework/meta From 6a74ae22de4f75e3048427f51b2cc691570cd777 Mon Sep 17 00:00:00 2001 From: Laurentiu Ciobanu Date: Fri, 26 Jul 2024 10:34:20 +0000 Subject: [PATCH 11/29] update sc-actions version --- .github/workflows/actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index 686ab495dd..33cce9444b 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -14,7 +14,7 @@ permissions: jobs: contracts: name: Contracts - uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@dcb4ee50efcb83709d5af181232f4380d931eeae + uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@f9483a0648e49620f3145a806924ff716c2445fb with: rust-toolchain: stable path-to-sc-meta: framework/meta From 42fcac512e2481a12e124b898ef4d95f18bd241f Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Mon, 29 Jul 2024 19:54:25 +0300 Subject: [PATCH 12/29] cli code report - compare impl changed --- .github/workflows/actions.yml | 2 +- framework/meta/src/cli/cli_args_standalone.rs | 5 +- framework/meta/src/cmd/code_report.rs | 6 +- framework/meta/src/cmd/code_report/compare.rs | 4 +- .../src/cmd/code_report/generate_report.rs | 44 +- .../src/cmd/code_report/render_code_report.rs | 7 - to_compared_report.json | 2555 +++++++++++++++++ 7 files changed, 2598 insertions(+), 25 deletions(-) create mode 100644 to_compared_report.json diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index 33cce9444b..c0917d3746 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -14,7 +14,7 @@ permissions: jobs: contracts: name: Contracts - uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@f9483a0648e49620f3145a806924ff716c2445fb + uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@3ccc32c6283f3e7106b324b742d10aae28827c15 with: rust-toolchain: stable path-to-sc-meta: framework/meta diff --git a/framework/meta/src/cli/cli_args_standalone.rs b/framework/meta/src/cli/cli_args_standalone.rs index 9bb5aad9fc..1cdde75cdd 100644 --- a/framework/meta/src/cli/cli_args_standalone.rs +++ b/framework/meta/src/cli/cli_args_standalone.rs @@ -157,9 +157,10 @@ pub struct CodeReportArgs { #[arg(short, long, verbatim_doc_comment)] pub format: Option, - /// Compare two reports. Output available only for Markdown format + /// Compares 2 reports in JSON format and the output is printed in Markdown format. + /// If one argument with JSON format is given then it compares with itself. #[arg(short, long, verbatim_doc_comment)] - pub compare: Option, + pub compare: Vec, } #[derive(Default, Clone, PartialEq, Eq, Debug, Args)] diff --git a/framework/meta/src/cmd/code_report.rs b/framework/meta/src/cmd/code_report.rs index f3c8ff8cbe..8e34fd37bd 100644 --- a/framework/meta/src/cmd/code_report.rs +++ b/framework/meta/src/cmd/code_report.rs @@ -17,6 +17,10 @@ pub fn code_report(args: &CodeReportArgs) { path, args.output.to_str().unwrap(), args.format.as_ref().unwrap_or(&OutputFormat::default()), - args.compare.clone().unwrap_or_default().to_str().unwrap(), + args.compare + .clone() + .into_iter() + .map(|path| path.to_string_lossy().into_owned()) + .collect(), ); } diff --git a/framework/meta/src/cmd/code_report/compare.rs b/framework/meta/src/cmd/code_report/compare.rs index c21aae953e..06b6ea9a4b 100644 --- a/framework/meta/src/cmd/code_report/compare.rs +++ b/framework/meta/src/cmd/code_report/compare.rs @@ -37,10 +37,10 @@ pub(crate) fn parse_into_code_report_json( pub(crate) fn size_status_after_comparing(size: usize, compared_size: usize) -> String { match size.cmp(&compared_size) { std::cmp::Ordering::Greater => { - format!("{} :arrow-right: {} :red-circle:", compared_size, size) + format!("{} :arrow_right: {} :red_circle:", compared_size, size) }, std::cmp::Ordering::Less => { - format!("{} :arrow-right: {} :green-circle:", compared_size, size) + format!("{} :arrow_right: {} :green_circle:", compared_size, size) }, std::cmp::Ordering::Equal => { format!("{}", size) diff --git a/framework/meta/src/cmd/code_report/generate_report.rs b/framework/meta/src/cmd/code_report/generate_report.rs index c92ae712ab..bb7baccde6 100644 --- a/framework/meta/src/cmd/code_report/generate_report.rs +++ b/framework/meta/src/cmd/code_report/generate_report.rs @@ -1,6 +1,6 @@ use std::{ fs::{read_dir, File}, - io::Write, + io::{BufReader, Write}, path::PathBuf, process::Command, }; @@ -13,16 +13,31 @@ use multiversx_sc_meta_lib::{ use super::render_code_report::CodeReportRender; -pub fn run_code_report(path: &str, output_path: &str, output_format: &OutputFormat, compare: &str) { - let directors = RelevantDirectories::find_all(path, &["".to_owned()]); +pub fn run_code_report( + path: &str, + output_path: &str, + output_format: &OutputFormat, + compare: Vec, +) { + let reports = if compare.is_empty() { + generate_new_report(path) + } else { + let file = File::open(&compare[0]).expect("file not found"); + let reader = BufReader::new(file); + + serde_json::from_reader(reader).expect("Cannot deserialize") + }; - let reports = extract_report(directors); + let mut compared_to = String::new(); + if compare.len() == 2 { + compare[1].clone_into(&mut compared_to); + } let mut file = create_file(output_path); match output_format { OutputFormat::Markdown => { - let mut render_code_report = CodeReportRender::new(&mut file, compare, &reports); + let mut render_code_report = CodeReportRender::new(&mut file, &compared_to, &reports); render_code_report.render_report(); }, OutputFormat::Json => { @@ -32,6 +47,12 @@ pub fn run_code_report(path: &str, output_path: &str, output_format: &OutputForm }; } +fn generate_new_report(path: &str) -> Vec { + let directors = RelevantDirectories::find_all(path, &["".to_owned()]); + + extract_report(directors) +} + fn extract_report(directors: RelevantDirectories) -> Vec { let mut reports: Vec = Vec::new(); @@ -99,14 +120,13 @@ fn create_file(file_path: &str) -> File { File::create(file_path).expect("could not write report file") } -fn sanitize_output_path_from_report(reports: &mut Vec) { - for report in reports { - let new_path = report +fn sanitize_output_path_from_report(reports: &mut [CodeReportJson]) { + reports.iter_mut().for_each(|report| { + report.path = report .path .split('/') .last() - .unwrap_or_else(|| &report.path); - - report.path = new_path.to_owned(); - } + .unwrap_or(&report.path) + .to_string(); + }) } diff --git a/framework/meta/src/cmd/code_report/render_code_report.rs b/framework/meta/src/cmd/code_report/render_code_report.rs index 7b87a29493..6f4a66618c 100644 --- a/framework/meta/src/cmd/code_report/render_code_report.rs +++ b/framework/meta/src/cmd/code_report/render_code_report.rs @@ -60,13 +60,6 @@ impl<'a> CodeReportRender<'a> { } fn render_header(&mut self) { - if !self.compared_path_file.is_empty() { - self.writeln(format!( - "Contract comparison with {}", - self.compared_path_file - )) - } - self.writeln("| Path                                                         |                                     size |                  has-allocator |                     has-format |"); self.writeln("| :-- | --: | --: | --: |"); } diff --git a/to_compared_report.json b/to_compared_report.json new file mode 100644 index 0000000000..8f66650dff --- /dev/null +++ b/to_compared_report.json @@ -0,0 +1,2555 @@ +{ + "features": [ + "size", + "has-allocator", + "has-format" + ], + "folders": [ + { + "root_path": "mx-sdk-rs/contracts/benchmarks", + "projects": [ + { + "project_path": "large-storage", + "wasm_reports": [ + { + "wasm_name": "large-storage.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "2160" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "send-tx-repeat", + "wasm_reports": [ + { + "wasm_name": "send-tx-repeat.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "899" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "str-repeat", + "wasm_reports": [ + { + "wasm_name": "str-repeat.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "2326" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "str-repeat-mb-builder-basic.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "754" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "str-repeat-mb-builder-cached.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "1134" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + } + ] + }, + { + "root_path": "mx-sdk-rs/contracts/benchmarks/mappers", + "projects": [ + { + "project_path": "linked-list-repeat", + "wasm_reports": [ + { + "wasm_name": "linked-list-repeat.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "6473" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "map-repeat", + "wasm_reports": [ + { + "wasm_name": "map-repeat.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "7178" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "queue-repeat", + "wasm_reports": [ + { + "wasm_name": "queue-repeat.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "5789" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "set-repeat", + "wasm_reports": [ + { + "wasm_name": "set-repeat.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "6943" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "single-value-repeat", + "wasm_reports": [ + { + "wasm_name": "single-value-repeat.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "4435" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "vec-repeat", + "wasm_reports": [ + { + "wasm_name": "vec-repeat.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "5223" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + } + ] + }, + { + "root_path": "mx-sdk-rs/contracts/core", + "projects": [ + { + "project_path": "price-aggregator", + "wasm_reports": [ + { + "wasm_name": "multiversx-price-aggregator-sc.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "19314" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "wegld-swap", + "wasm_reports": [ + { + "wasm_name": "multiversx-wegld-swap-sc.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "3550" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + } + ] + }, + { + "root_path": "mx-sdk-rs/contracts/examples", + "projects": [ + { + "project_path": "adder", + "wasm_reports": [ + { + "wasm_name": "adder.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "696" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "bonding-curve-contract", + "wasm_reports": [ + { + "wasm_name": "bonding-curve-contract.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "14725" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "check-pause", + "wasm_reports": [ + { + "wasm_name": "check-pause.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "1228" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "crowdfunding-esdt", + "wasm_reports": [ + { + "wasm_name": "crowdfunding-esdt.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "3984" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "crypto-bubbles", + "wasm_reports": [ + { + "wasm_name": "crypto-bubbles.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "2345" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "crypto-zombies", + "wasm_reports": [ + { + "wasm_name": "crypto-zombies.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "10296" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "digital-cash", + "wasm_reports": [ + { + "wasm_name": "digital-cash.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "10039" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "empty", + "wasm_reports": [ + { + "wasm_name": "empty.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "241" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "esdt-transfer-with-fee", + "wasm_reports": [ + { + "wasm_name": "esdt-transfer-with-fee.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "7764" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "factorial", + "wasm_reports": [ + { + "wasm_name": "factorial.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "576" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "fractional-nfts", + "wasm_reports": [ + { + "wasm_name": "fractional-nfts.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "8440" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "lottery-esdt", + "wasm_reports": [ + { + "wasm_name": "lottery-esdt.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "10978" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "multisig", + "wasm_reports": [ + { + "wasm_name": "multisig.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "14223" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "multisig-full.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "15812" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "multisig-view.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "6241" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "nft-minter", + "wasm_reports": [ + { + "wasm_name": "nft-minter.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "10018" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "nft-storage-prepay", + "wasm_reports": [ + { + "wasm_name": "nft-storage-prepay.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "2290" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "nft-subscription", + "wasm_reports": [ + { + "wasm_name": "nft-subscription.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "8782" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "ping-pong-egld", + "wasm_reports": [ + { + "wasm_name": "ping-pong-egld.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "6021" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "proxy-pause", + "wasm_reports": [ + { + "wasm_name": "proxy-pause.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "4616" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "rewards-distribution", + "wasm_reports": [ + { + "wasm_name": "rewards-distribution.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "10227" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "seed-nft-minter", + "wasm_reports": [ + { + "wasm_name": "seed-nft-minter.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "15106" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "token-release", + "wasm_reports": [ + { + "wasm_name": "token-release.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "7767" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + } + ] + }, + { + "root_path": "mx-sdk-rs/contracts/examples/crypto-kitties", + "projects": [ + { + "project_path": "kitty-auction", + "wasm_reports": [ + { + "wasm_name": "kitty-auction.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "10054" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "kitty-genetic-alg", + "wasm_reports": [ + { + "wasm_name": "kitty-genetic-alg.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "3143" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "kitty-ownership", + "wasm_reports": [ + { + "wasm_name": "kitty-ownership.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "12723" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + } + ] + }, + { + "root_path": "mx-sdk-rs/contracts/examples/order-book", + "projects": [ + { + "project_path": "factory", + "wasm_reports": [ + { + "wasm_name": "order-book-factory.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "3760" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "pair", + "wasm_reports": [ + { + "wasm_name": "order-book-pair.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "13778" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + } + ] + }, + { + "root_path": "mx-sdk-rs/contracts/feature-tests", + "projects": [ + { + "project_path": "abi-tester", + "wasm_reports": [ + { + "wasm_name": "abi-tester.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "7128" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "abi-tester-ev.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "757" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "alloc-features", + "wasm_reports": [ + { + "wasm_name": "alloc-features.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "16468" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "alloc-mem-fail.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "16421" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "alloc-mem-leaking.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "16580" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "basic-features", + "wasm_reports": [ + { + "wasm_name": "basic-features.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "64827" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "basic-features-storage-bytes.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "538" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "big-float-features", + "wasm_reports": [ + { + "wasm_name": "big-float-features.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "6463" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "esdt-system-sc-mock", + "wasm_reports": [ + { + "wasm_name": "esdt-system-sc-mock.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "3794" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "exchange-features", + "wasm_reports": [ + { + "wasm_name": "exchange-features.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "1575" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "formatted-message-features", + "wasm_reports": [ + { + "wasm_name": "formatted-message-features.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "3462" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "managed-map-features", + "wasm_reports": [ + { + "wasm_name": "managed-map-features.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "1315" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "multi-contract-features", + "wasm_reports": [ + { + "wasm_name": "multi-contract-alt-impl.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "360" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "multi-contract-example-feature.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "677" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "multi-contract-features.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "678" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "multi-contract-features-view.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "1115" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "panic-message-features", + "wasm_reports": [ + { + "wasm_name": "panic-message-features.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "12613" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "True" + ] + } + ] + } + ] + }, + { + "project_path": "payable-features", + "wasm_reports": [ + { + "wasm_name": "payable-features.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "4368" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "rust-snippets-generator-test", + "wasm_reports": [ + { + "wasm_name": "rust-snippets-generator-test.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "4971" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "rust-testing-framework-tester", + "wasm_reports": [ + { + "wasm_name": "rust-testing-framework-tester.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "8596" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "scenario-tester", + "wasm_reports": [ + { + "wasm_name": "scenario-tester.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "1114" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "use-module", + "wasm_reports": [ + { + "wasm_name": "use-module.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "33392" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "True" + ] + } + ] + }, + { + "wasm_name": "use-module-view.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "733" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + } + ] + }, + { + "root_path": "mx-sdk-rs/contracts/feature-tests/composability", + "projects": [ + { + "project_path": "builtin-func-features", + "wasm_reports": [ + { + "wasm_name": "builtin-func-features.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "1099" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "forwarder", + "wasm_reports": [ + { + "wasm_name": "forwarder.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "32628" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "forwarder-legacy", + "wasm_reports": [ + { + "wasm_name": "forwarder-legacy.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "32296" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "forwarder-queue", + "wasm_reports": [ + { + "wasm_name": "forwarder-queue.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "12091" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "forwarder-queue-promises.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "13004" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "forwarder-raw", + "wasm_reports": [ + { + "wasm_name": "forwarder-raw.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "15261" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "forwarder-raw-init-async-call.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "3058" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "forwarder-raw-init-sync-call.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "3328" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "local-esdt-and-nft", + "wasm_reports": [ + { + "wasm_name": "local-esdt-and-nft.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "12016" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "promises-features", + "wasm_reports": [ + { + "wasm_name": "promises-features.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "12885" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "proxy-test-first", + "wasm_reports": [ + { + "wasm_name": "proxy-test-first.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "6024" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "proxy-test-second", + "wasm_reports": [ + { + "wasm_name": "proxy-test-second.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "2112" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "recursive-caller", + "wasm_reports": [ + { + "wasm_name": "recursive-caller.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "5459" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "transfer-role-features", + "wasm_reports": [ + { + "wasm_name": "transfer-role-features.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "8758" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "vault", + "wasm_reports": [ + { + "wasm_name": "vault.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "7821" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "vault-promises.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "8514" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + }, + { + "wasm_name": "vault-upgrade.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "697" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + } + ] + }, + { + "root_path": "mx-sdk-rs/contracts/feature-tests/composability/esdt-contract-pair", + "projects": [ + { + "project_path": "first-contract", + "wasm_reports": [ + { + "wasm_name": "first-contract.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "3083" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "second-contract", + "wasm_reports": [ + { + "wasm_name": "second-contract.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "1355" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + } + ] + }, + { + "root_path": "mx-sdk-rs/contracts/feature-tests/composability/execute-on-dest-esdt-issue-callback", + "projects": [ + { + "project_path": "child", + "wasm_reports": [ + { + "wasm_name": "child.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "4051" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "parent", + "wasm_reports": [ + { + "wasm_name": "parent.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "1673" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + } + ] + }, + { + "root_path": "mx-sdk-rs/contracts/feature-tests/erc-style-contracts", + "projects": [ + { + "project_path": "crowdfunding-erc20", + "wasm_reports": [ + { + "wasm_name": "crowdfunding-erc20.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "5323" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "erc1155", + "wasm_reports": [ + { + "wasm_name": "erc1155.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "12180" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "erc1155-marketplace", + "wasm_reports": [ + { + "wasm_name": "erc1155-marketplace.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "11144" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "erc1155-user-mock", + "wasm_reports": [ + { + "wasm_name": "erc1155-user-mock.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "1358" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "erc20", + "wasm_reports": [ + { + "wasm_name": "erc20.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "2130" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "erc721", + "wasm_reports": [ + { + "wasm_name": "erc721.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "2573" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + }, + { + "project_path": "lottery-erc20", + "wasm_reports": [ + { + "wasm_name": "lottery-erc20.wasm", + "extracted_features": [ + { + "feature_name": "size", + "results": [ + "12764" + ] + }, + { + "feature_name": "has-allocator", + "results": [ + "False" + ] + }, + { + "feature_name": "has-format", + "results": [ + "False" + ] + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file From 3c1b1b9a3824a17348ed8acfdbc97cb7a8427758 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Mon, 5 Aug 2024 16:10:19 +0300 Subject: [PATCH 13/29] code report cli - cleanup --- .../src/cmd/code_report/render_code_report.rs | 8 +- to_compared_report.json | 2555 ----------------- 2 files changed, 6 insertions(+), 2557 deletions(-) delete mode 100644 to_compared_report.json diff --git a/framework/meta/src/cmd/code_report/render_code_report.rs b/framework/meta/src/cmd/code_report/render_code_report.rs index 6f4a66618c..b176aa374a 100644 --- a/framework/meta/src/cmd/code_report/render_code_report.rs +++ b/framework/meta/src/cmd/code_report/render_code_report.rs @@ -88,8 +88,12 @@ impl<'a> CodeReportRender<'a> { // TODO this is only one time compared. Decide whether to exist or not parse_into_code_report_json(&mut compared_file_reader) } else { - serde_json::from_reader(compared_file_reader) - .unwrap_or_else(|_| panic!("Cannot deserialize into code report structure.")) + serde_json::from_reader(compared_file_reader).unwrap_or_else(|_| { + self.render_reports(); + self.writeln(":warning: Could not compare the 2 versions because the deserialization process into the code report structure failed. :warning:"); + + Vec::new() + }) }; for report in self.reports.iter() { diff --git a/to_compared_report.json b/to_compared_report.json deleted file mode 100644 index 8f66650dff..0000000000 --- a/to_compared_report.json +++ /dev/null @@ -1,2555 +0,0 @@ -{ - "features": [ - "size", - "has-allocator", - "has-format" - ], - "folders": [ - { - "root_path": "mx-sdk-rs/contracts/benchmarks", - "projects": [ - { - "project_path": "large-storage", - "wasm_reports": [ - { - "wasm_name": "large-storage.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "2160" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "send-tx-repeat", - "wasm_reports": [ - { - "wasm_name": "send-tx-repeat.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "899" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "str-repeat", - "wasm_reports": [ - { - "wasm_name": "str-repeat.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "2326" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "str-repeat-mb-builder-basic.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "754" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "str-repeat-mb-builder-cached.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "1134" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - } - ] - }, - { - "root_path": "mx-sdk-rs/contracts/benchmarks/mappers", - "projects": [ - { - "project_path": "linked-list-repeat", - "wasm_reports": [ - { - "wasm_name": "linked-list-repeat.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "6473" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "map-repeat", - "wasm_reports": [ - { - "wasm_name": "map-repeat.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "7178" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "queue-repeat", - "wasm_reports": [ - { - "wasm_name": "queue-repeat.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "5789" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "set-repeat", - "wasm_reports": [ - { - "wasm_name": "set-repeat.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "6943" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "single-value-repeat", - "wasm_reports": [ - { - "wasm_name": "single-value-repeat.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "4435" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "vec-repeat", - "wasm_reports": [ - { - "wasm_name": "vec-repeat.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "5223" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - } - ] - }, - { - "root_path": "mx-sdk-rs/contracts/core", - "projects": [ - { - "project_path": "price-aggregator", - "wasm_reports": [ - { - "wasm_name": "multiversx-price-aggregator-sc.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "19314" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "wegld-swap", - "wasm_reports": [ - { - "wasm_name": "multiversx-wegld-swap-sc.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "3550" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - } - ] - }, - { - "root_path": "mx-sdk-rs/contracts/examples", - "projects": [ - { - "project_path": "adder", - "wasm_reports": [ - { - "wasm_name": "adder.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "696" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "bonding-curve-contract", - "wasm_reports": [ - { - "wasm_name": "bonding-curve-contract.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "14725" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "check-pause", - "wasm_reports": [ - { - "wasm_name": "check-pause.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "1228" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "crowdfunding-esdt", - "wasm_reports": [ - { - "wasm_name": "crowdfunding-esdt.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "3984" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "crypto-bubbles", - "wasm_reports": [ - { - "wasm_name": "crypto-bubbles.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "2345" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "crypto-zombies", - "wasm_reports": [ - { - "wasm_name": "crypto-zombies.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "10296" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "digital-cash", - "wasm_reports": [ - { - "wasm_name": "digital-cash.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "10039" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "empty", - "wasm_reports": [ - { - "wasm_name": "empty.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "241" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "esdt-transfer-with-fee", - "wasm_reports": [ - { - "wasm_name": "esdt-transfer-with-fee.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "7764" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "factorial", - "wasm_reports": [ - { - "wasm_name": "factorial.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "576" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "fractional-nfts", - "wasm_reports": [ - { - "wasm_name": "fractional-nfts.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "8440" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "lottery-esdt", - "wasm_reports": [ - { - "wasm_name": "lottery-esdt.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "10978" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "multisig", - "wasm_reports": [ - { - "wasm_name": "multisig.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "14223" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "multisig-full.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "15812" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "multisig-view.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "6241" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "nft-minter", - "wasm_reports": [ - { - "wasm_name": "nft-minter.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "10018" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "nft-storage-prepay", - "wasm_reports": [ - { - "wasm_name": "nft-storage-prepay.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "2290" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "nft-subscription", - "wasm_reports": [ - { - "wasm_name": "nft-subscription.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "8782" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "ping-pong-egld", - "wasm_reports": [ - { - "wasm_name": "ping-pong-egld.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "6021" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "proxy-pause", - "wasm_reports": [ - { - "wasm_name": "proxy-pause.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "4616" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "rewards-distribution", - "wasm_reports": [ - { - "wasm_name": "rewards-distribution.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "10227" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "seed-nft-minter", - "wasm_reports": [ - { - "wasm_name": "seed-nft-minter.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "15106" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "token-release", - "wasm_reports": [ - { - "wasm_name": "token-release.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "7767" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - } - ] - }, - { - "root_path": "mx-sdk-rs/contracts/examples/crypto-kitties", - "projects": [ - { - "project_path": "kitty-auction", - "wasm_reports": [ - { - "wasm_name": "kitty-auction.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "10054" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "kitty-genetic-alg", - "wasm_reports": [ - { - "wasm_name": "kitty-genetic-alg.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "3143" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "kitty-ownership", - "wasm_reports": [ - { - "wasm_name": "kitty-ownership.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "12723" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - } - ] - }, - { - "root_path": "mx-sdk-rs/contracts/examples/order-book", - "projects": [ - { - "project_path": "factory", - "wasm_reports": [ - { - "wasm_name": "order-book-factory.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "3760" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "pair", - "wasm_reports": [ - { - "wasm_name": "order-book-pair.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "13778" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - } - ] - }, - { - "root_path": "mx-sdk-rs/contracts/feature-tests", - "projects": [ - { - "project_path": "abi-tester", - "wasm_reports": [ - { - "wasm_name": "abi-tester.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "7128" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "abi-tester-ev.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "757" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "alloc-features", - "wasm_reports": [ - { - "wasm_name": "alloc-features.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "16468" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "alloc-mem-fail.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "16421" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "alloc-mem-leaking.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "16580" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "basic-features", - "wasm_reports": [ - { - "wasm_name": "basic-features.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "64827" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "basic-features-storage-bytes.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "538" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "big-float-features", - "wasm_reports": [ - { - "wasm_name": "big-float-features.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "6463" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "esdt-system-sc-mock", - "wasm_reports": [ - { - "wasm_name": "esdt-system-sc-mock.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "3794" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "exchange-features", - "wasm_reports": [ - { - "wasm_name": "exchange-features.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "1575" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "formatted-message-features", - "wasm_reports": [ - { - "wasm_name": "formatted-message-features.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "3462" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "managed-map-features", - "wasm_reports": [ - { - "wasm_name": "managed-map-features.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "1315" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "multi-contract-features", - "wasm_reports": [ - { - "wasm_name": "multi-contract-alt-impl.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "360" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "multi-contract-example-feature.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "677" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "multi-contract-features.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "678" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "multi-contract-features-view.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "1115" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "panic-message-features", - "wasm_reports": [ - { - "wasm_name": "panic-message-features.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "12613" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "True" - ] - } - ] - } - ] - }, - { - "project_path": "payable-features", - "wasm_reports": [ - { - "wasm_name": "payable-features.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "4368" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "rust-snippets-generator-test", - "wasm_reports": [ - { - "wasm_name": "rust-snippets-generator-test.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "4971" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "rust-testing-framework-tester", - "wasm_reports": [ - { - "wasm_name": "rust-testing-framework-tester.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "8596" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "scenario-tester", - "wasm_reports": [ - { - "wasm_name": "scenario-tester.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "1114" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "use-module", - "wasm_reports": [ - { - "wasm_name": "use-module.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "33392" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "True" - ] - } - ] - }, - { - "wasm_name": "use-module-view.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "733" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - } - ] - }, - { - "root_path": "mx-sdk-rs/contracts/feature-tests/composability", - "projects": [ - { - "project_path": "builtin-func-features", - "wasm_reports": [ - { - "wasm_name": "builtin-func-features.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "1099" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "forwarder", - "wasm_reports": [ - { - "wasm_name": "forwarder.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "32628" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "forwarder-legacy", - "wasm_reports": [ - { - "wasm_name": "forwarder-legacy.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "32296" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "forwarder-queue", - "wasm_reports": [ - { - "wasm_name": "forwarder-queue.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "12091" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "forwarder-queue-promises.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "13004" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "forwarder-raw", - "wasm_reports": [ - { - "wasm_name": "forwarder-raw.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "15261" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "forwarder-raw-init-async-call.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "3058" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "forwarder-raw-init-sync-call.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "3328" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "local-esdt-and-nft", - "wasm_reports": [ - { - "wasm_name": "local-esdt-and-nft.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "12016" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "promises-features", - "wasm_reports": [ - { - "wasm_name": "promises-features.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "12885" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "proxy-test-first", - "wasm_reports": [ - { - "wasm_name": "proxy-test-first.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "6024" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "proxy-test-second", - "wasm_reports": [ - { - "wasm_name": "proxy-test-second.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "2112" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "recursive-caller", - "wasm_reports": [ - { - "wasm_name": "recursive-caller.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "5459" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "transfer-role-features", - "wasm_reports": [ - { - "wasm_name": "transfer-role-features.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "8758" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "vault", - "wasm_reports": [ - { - "wasm_name": "vault.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "7821" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "vault-promises.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "8514" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - }, - { - "wasm_name": "vault-upgrade.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "697" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - } - ] - }, - { - "root_path": "mx-sdk-rs/contracts/feature-tests/composability/esdt-contract-pair", - "projects": [ - { - "project_path": "first-contract", - "wasm_reports": [ - { - "wasm_name": "first-contract.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "3083" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "second-contract", - "wasm_reports": [ - { - "wasm_name": "second-contract.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "1355" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - } - ] - }, - { - "root_path": "mx-sdk-rs/contracts/feature-tests/composability/execute-on-dest-esdt-issue-callback", - "projects": [ - { - "project_path": "child", - "wasm_reports": [ - { - "wasm_name": "child.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "4051" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "parent", - "wasm_reports": [ - { - "wasm_name": "parent.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "1673" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - } - ] - }, - { - "root_path": "mx-sdk-rs/contracts/feature-tests/erc-style-contracts", - "projects": [ - { - "project_path": "crowdfunding-erc20", - "wasm_reports": [ - { - "wasm_name": "crowdfunding-erc20.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "5323" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "erc1155", - "wasm_reports": [ - { - "wasm_name": "erc1155.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "12180" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "erc1155-marketplace", - "wasm_reports": [ - { - "wasm_name": "erc1155-marketplace.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "11144" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "erc1155-user-mock", - "wasm_reports": [ - { - "wasm_name": "erc1155-user-mock.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "1358" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "erc20", - "wasm_reports": [ - { - "wasm_name": "erc20.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "2130" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "erc721", - "wasm_reports": [ - { - "wasm_name": "erc721.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "2573" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - }, - { - "project_path": "lottery-erc20", - "wasm_reports": [ - { - "wasm_name": "lottery-erc20.wasm", - "extracted_features": [ - { - "feature_name": "size", - "results": [ - "12764" - ] - }, - { - "feature_name": "has-allocator", - "results": [ - "False" - ] - }, - { - "feature_name": "has-format", - "results": [ - "False" - ] - } - ] - } - ] - } - ] - } - ] -} \ No newline at end of file From 7bd2b5774775b57eddd6776a508abded630bbfba Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Mon, 5 Aug 2024 17:17:18 +0300 Subject: [PATCH 14/29] cli code report - format error --- framework/meta/src/cmd/code_report/render_code_report.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/meta/src/cmd/code_report/render_code_report.rs b/framework/meta/src/cmd/code_report/render_code_report.rs index b176aa374a..54b0a5d9c9 100644 --- a/framework/meta/src/cmd/code_report/render_code_report.rs +++ b/framework/meta/src/cmd/code_report/render_code_report.rs @@ -90,7 +90,7 @@ impl<'a> CodeReportRender<'a> { } else { serde_json::from_reader(compared_file_reader).unwrap_or_else(|_| { self.render_reports(); - self.writeln(":warning: Could not compare the 2 versions because the deserialization process into the code report structure failed. :warning:"); + self.writeln("\n:warning: Could not compare the 2 versions because the deserialization process into the code report structure failed. :warning:"); Vec::new() }) From 826b7ce35afc45d3b9d24df95b13df248734b511 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Mon, 5 Aug 2024 17:44:46 +0300 Subject: [PATCH 15/29] cli code report - change action version --- .github/workflows/actions.yml | 2 +- reported.md | 96 +++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 reported.md diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index c0917d3746..159dcd514b 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -14,7 +14,7 @@ permissions: jobs: contracts: name: Contracts - uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@3ccc32c6283f3e7106b324b742d10aae28827c15 + uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@c50a21fcb5a9d85f01990402db58979085d920b1 with: rust-toolchain: stable path-to-sc-meta: framework/meta diff --git a/reported.md b/reported.md new file mode 100644 index 0000000000..f397b5b8e2 --- /dev/null +++ b/reported.md @@ -0,0 +1,96 @@ +| Path                                                         |                                     size |                  has-allocator |                     has-format | +| :-- | --: | --: | --: | +| token-release.wasm | 7776 | false | without message | +| adder.wasm | 696 | false | none | +| order-book-pair.wasm | 13786 | false | without message | +| order-book-factory.wasm | 3771 | false | without message | +| nft-storage-prepay.wasm | 2295 | false | none | +| multisig.wasm | 14145 | false | without message | +| multisig-full.wasm | 15672 | false | without message | +| multisig-view.wasm | 6248 | false | without message | +| bonding-curve-contract.wasm | 14735 | false | without message | +| seed-nft-minter.wasm | 15118 | false | without message | +| rewards-distribution.wasm | 10220 | false | without message | +| crypto-bubbles.wasm | 2347 | false | none | +| kitty-auction.wasm | 10065 | false | without message | +| kitty-genetic-alg.wasm | 3147 | false | without message | +| kitty-ownership.wasm | 12731 | false | without message | +| nft-subscription.wasm | 8793 | false | without message | +| proxy-pause.wasm | 4627 | false | without message | +| lottery-esdt.wasm | 10989 | false | without message | +| esdt-transfer-with-fee.wasm | 7779 | false | without message | +| check-pause.wasm | 1228 | false | none | +| factorial.wasm | 576 | false | none | +| digital-cash.wasm | 10047 | false | without message | +| crypto-zombies.wasm | 10304 | false | without message | +| nft-minter.wasm | 10028 | false | without message | +| empty.wasm | 241 | false | none | +| fractional-nfts.wasm | 8447 | false | without message | +| crowdfunding-esdt.wasm | 3988 | false | none | +| ping-pong-egld.wasm | 6032 | false | without message | +| send-tx-repeat.wasm | 901 | false | none | +| large-storage.wasm | 2164 | false | without message | +| map-repeat.wasm | 7234 | false | without message | +| queue-repeat.wasm | 5853 | false | without message | +| set-repeat.wasm | 7013 | false | without message | +| single-value-repeat.wasm | 4440 | false | without message | +| linked-list-repeat.wasm | 6681 | true | without message | +| vec-repeat.wasm | 5231 | false | without message | +| str-repeat.wasm | 2389 | false | without message | +| str-repeat-mb-builder-cached.wasm | 1139 | false | without message | +| str-repeat-mb-builder-basic.wasm | 759 | false | none | +| big-float-features.wasm | 6468 | false | without message | +| erc20.wasm | 2133 | false | none | +| erc721.wasm | 2578 | false | none | +| lottery-erc20.wasm | 12814 | false | without message | +| erc1155-marketplace.wasm | 11172 | false | without message | +| crowdfunding-erc20.wasm | 5331 | false | without message | +| erc1155-user-mock.wasm | 1360 | false | without message | +| erc1155.wasm | 12197 | false | without message | +| scenario-tester.wasm | 1114 | false | none | +| managed-map-features.wasm | 1315 | false | none | +| use-module-view.wasm | 733 | false | none | +| use-module.wasm | 33452 | false | without message | +| rust-snippets-generator-test.wasm | 4979 | false | without message | +| basic-features.wasm | 65181 | false | without message | +| basic-features-storage-bytes.wasm | 538 | false | none | +| payable-features.wasm | 4396 | false | without message | +| promises-features.wasm | 12926 | false | without message | +| vault-promises.wasm | 8523 | false | without message | +| vault-upgrade.wasm | 700 | false | none | +| vault.wasm | 7826 | false | without message | +| first-contract.wasm | 3086 | false | without message | +| second-contract.wasm | 1355 | false | none | +| forwarder-legacy.wasm | 32330 | false | without message | +| proxy-test-second.wasm | 2105 | false | without message | +| recursive-caller.wasm | 5466 | false | without message | +| forwarder-queue-promises.wasm | 13096 | false | without message | +| forwarder-queue.wasm | 12181 | false | without message | +| forwarder.wasm | 32687 | false | without message | +| builtin-func-features.wasm | 1101 | false | none | +| local-esdt-and-nft.wasm | 12071 | false | without message | +| forwarder-raw.wasm | 15309 | false | without message | +| forwarder-raw-init-sync-call.wasm | 3332 | false | none | +| forwarder-raw-init-async-call.wasm | 3062 | false | none | +| parent.wasm | 1678 | false | none | +| child.wasm | 4057 | false | without message | +| transfer-role-features.wasm | 8775 | false | without message | +| proxy-test-first.wasm | 6031 | false | without message | +| exchange-features.wasm | 1577 | false | none | +| alloc-features.wasm | 16748 | false | without message | +| alloc-mem-leaking.wasm | 16857 | false | without message | +| alloc-mem-fail.wasm | 16682 | true | without message | +| abi-tester.wasm | 7182 | true | without message | +| abi-tester-ev.wasm | 757 | false | none | +| panic-message-features.wasm | 12875 | false | with message | +| formatted-message-features.wasm | 3470 | false | without message | +| multi-contract-features.wasm | 678 | false | none | +| multi-contract-alt-impl.wasm | 360 | false | none | +| multi-contract-example-feature.wasm | 677 | false | none | +| multi-contract-features-view.wasm | 1115 | false | none | +| rust-testing-framework-tester.wasm | 8602 | false | without message | +| esdt-system-sc-mock.wasm | 3799 | false | none | +| multiversx-wegld-swap-sc.wasm | 3557 | false | without message | +| multiversx-price-aggregator-sc.wasm | 19327 | false | without message | + +:warning: Could not compare the 2 versions because the deserialization process into the code report structure failed. :warning: From 86a1508d8ddaa3ada262ef2140417d5df1f698d6 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Fri, 9 Aug 2024 15:13:15 +0300 Subject: [PATCH 16/29] cli code report - new report commands: compile, compare, convert --- framework/meta/src/cli/cli_args_standalone.rs | 59 +++++-- framework/meta/src/cli/cli_standalone_main.rs | 4 +- framework/meta/src/cmd/code_report.rs | 29 ++-- framework/meta/src/cmd/code_report/compare.rs | 36 ----- .../src/cmd/code_report/generate_report.rs | 152 ++++++++++-------- .../src/cmd/code_report/render_code_report.rs | 61 ++++--- reported.md | 96 ----------- 7 files changed, 179 insertions(+), 258 deletions(-) delete mode 100644 reported.md diff --git a/framework/meta/src/cli/cli_args_standalone.rs b/framework/meta/src/cli/cli_args_standalone.rs index 1cdde75cdd..d7d96dd0c8 100644 --- a/framework/meta/src/cli/cli_args_standalone.rs +++ b/framework/meta/src/cli/cli_args_standalone.rs @@ -65,7 +65,7 @@ pub enum StandaloneCliAction { #[command(name = "test-coverage", about = "Run test coverage and output report")] TestCoverage(TestCoverageArgs), - #[command(name = "code-report", about = "Generate code report")] + #[command(name = "report", about = "Generate code report")] CodeReportGen(CodeReportArgs), #[command( @@ -142,25 +142,64 @@ pub struct TestCoverageArgs { pub ignore_filename_regex: Vec, } -#[derive(Default, Clone, PartialEq, Eq, Debug, Args)] +#[derive(Clone, PartialEq, Eq, Debug, Args)] pub struct CodeReportArgs { + #[command(subcommand)] + pub command: CodeReportAction, +} + +#[derive(Clone, PartialEq, Eq, Debug, Subcommand)] +pub enum CodeReportAction { + #[command(name = "compile", about = "Generates the contract report.")] + Compile(CompileArgs), + + #[command(name = "compare", about = "Compare two contract report.")] + Compare(CompareArgs), + + #[command( + name = "convert", + about = "Converts a contract report to a Markdown file." + )] + Convert(ConvertArgs), +} + +#[derive(Clone, PartialEq, Eq, Debug, Args)] +pub struct CompileArgs { /// Target directory where to generate code report. - /// Will be current directory if not specified. #[arg(short, long, verbatim_doc_comment)] - pub path: Option, + pub path: PathBuf, - /// Output file path + /// Path to the Markdown or JSON file where the report results will be written. #[arg(short, long, verbatim_doc_comment)] pub output: PathBuf, +} - /// Output format +#[derive(Clone, PartialEq, Eq, Debug, Args)] +pub struct CompareArgs { + /// Path to the previous version of code report JSON file + /// that will be used for comparison. #[arg(short, long, verbatim_doc_comment)] - pub format: Option, + pub baseline: PathBuf, - /// Compares 2 reports in JSON format and the output is printed in Markdown format. - /// If one argument with JSON format is given then it compares with itself. + /// Path to the current version of the code report JSON file + /// that will be compared. #[arg(short, long, verbatim_doc_comment)] - pub compare: Vec, + pub new: PathBuf, + + /// Path to the Markdown file where the comparison results will be written. + #[arg(short, long, verbatim_doc_comment)] + pub output: PathBuf, +} + +#[derive(Clone, PartialEq, Eq, Debug, Args)] +pub struct ConvertArgs { + /// Path to the JSON report file that needs to be converted to Markdown format. + #[arg(short, long, verbatim_doc_comment)] + pub input: PathBuf, + + /// Path to the Markdown file where the report results will be written. + #[arg(short, long, verbatim_doc_comment)] + pub output: PathBuf, } #[derive(Default, Clone, PartialEq, Eq, Debug, Args)] diff --git a/framework/meta/src/cli/cli_standalone_main.rs b/framework/meta/src/cli/cli_standalone_main.rs index a33bc659d2..9a8e065627 100644 --- a/framework/meta/src/cli/cli_standalone_main.rs +++ b/framework/meta/src/cli/cli_standalone_main.rs @@ -3,7 +3,7 @@ use crate::cmd::retrieve_address::retrieve_address; use clap::Parser; use crate::cmd::all::call_all_meta; -use crate::cmd::code_report::code_report; +use crate::cmd::code_report::report; use crate::cmd::info::call_info; use crate::cmd::install::install; use crate::cmd::local_deps::local_deps; @@ -38,7 +38,7 @@ pub async fn cli_main_standalone() { test_coverage(args); }, Some(StandaloneCliAction::CodeReportGen(args)) => { - code_report(args); + report(args); }, Some(StandaloneCliAction::Account(args)) => { retrieve_address(args).await; diff --git a/framework/meta/src/cmd/code_report.rs b/framework/meta/src/cmd/code_report.rs index 8e34fd37bd..37e2617b9a 100644 --- a/framework/meta/src/cmd/code_report.rs +++ b/framework/meta/src/cmd/code_report.rs @@ -2,25 +2,14 @@ pub mod compare; pub mod generate_report; pub mod render_code_report; -use generate_report::run_code_report; +use generate_report::{compare_report, convert_report, create_report}; -use crate::cli::{CodeReportArgs, OutputFormat}; +use crate::cli::{CodeReportAction, CodeReportArgs}; -pub fn code_report(args: &CodeReportArgs) { - let path: &str = if let Some(some_path) = &args.path { - some_path.as_str() - } else { - "./" - }; - - run_code_report( - path, - args.output.to_str().unwrap(), - args.format.as_ref().unwrap_or(&OutputFormat::default()), - args.compare - .clone() - .into_iter() - .map(|path| path.to_string_lossy().into_owned()) - .collect(), - ); -} +pub fn report(args: &CodeReportArgs) { + match &args.command { + CodeReportAction::Compile(compile_args) => create_report(compile_args), + CodeReportAction::Compare(compare_args) => compare_report(compare_args), + CodeReportAction::Convert(convert_args) => convert_report(convert_args), + } +} \ No newline at end of file diff --git a/framework/meta/src/cmd/code_report/compare.rs b/framework/meta/src/cmd/code_report/compare.rs index 06b6ea9a4b..28c604962d 100644 --- a/framework/meta/src/cmd/code_report/compare.rs +++ b/framework/meta/src/cmd/code_report/compare.rs @@ -1,39 +1,3 @@ -use std::io::BufRead; - -use multiversx_sc_meta_lib::code_report_json::CodeReportJson; - -pub(crate) fn parse_into_code_report_json( - compared_file_reader: &mut dyn BufRead, -) -> Vec { - let lines = compared_file_reader.lines().skip(2); - - let mut compared_reports: Vec = Vec::new(); - - for line in lines { - match line { - Ok(l) => { - let columns: Vec = l - .split('|') - .map(|s| s.trim().to_string()) - .filter(|s| !s.is_empty()) - .collect(); - - if columns.len() == 4 { - compared_reports.push(CodeReportJson { - path: columns[0].to_owned(), - size: columns[1].parse::().unwrap(), - has_allocator: columns[2].parse::().unwrap(), - has_panic: columns[3].to_owned(), - }) - } - }, - Err(_) => return compared_reports, - } - } - - compared_reports -} - pub(crate) fn size_status_after_comparing(size: usize, compared_size: usize) -> String { match size.cmp(&compared_size) { std::cmp::Ordering::Greater => { diff --git a/framework/meta/src/cmd/code_report/generate_report.rs b/framework/meta/src/cmd/code_report/generate_report.rs index bb7baccde6..a27aed5fec 100644 --- a/framework/meta/src/cmd/code_report/generate_report.rs +++ b/framework/meta/src/cmd/code_report/generate_report.rs @@ -1,11 +1,13 @@ use std::{ fs::{read_dir, File}, io::{BufReader, Write}, - path::PathBuf, - process::Command, + path::{Path, PathBuf}, }; -use crate::{cli::OutputFormat, folder_structure::RelevantDirectories}; +use crate::{ + cli::{CompareArgs, CompileArgs, ConvertArgs}, + folder_structure::RelevantDirectories, +}; use multiversx_sc_meta_lib::{ self, code_report_json::CodeReportJson, mxsc_file_json::MxscFileJson, @@ -13,82 +15,89 @@ use multiversx_sc_meta_lib::{ use super::render_code_report::CodeReportRender; -pub fn run_code_report( - path: &str, - output_path: &str, - output_format: &OutputFormat, - compare: Vec, -) { - let reports = if compare.is_empty() { - generate_new_report(path) - } else { - let file = File::open(&compare[0]).expect("file not found"); - let reader = BufReader::new(file); +const JSON: &str = ".json"; +const MD: &str = ".md"; - serde_json::from_reader(reader).expect("Cannot deserialize") - }; +pub fn compare_report(compare_args: &CompareArgs) { + if !is_path_ends_with(&compare_args.output, MD) { + panic!("Compare output is available only for Markdown file extension."); + } - let mut compared_to = String::new(); - if compare.len() == 2 { - compare[1].clone_into(&mut compared_to); + if !is_path_ends_with(&compare_args.baseline, JSON) + && !is_path_ends_with(&compare_args.new, JSON) + { + panic!("Compare baseline and new is available only for JSON file extension."); } - let mut file = create_file(output_path); - - match output_format { - OutputFormat::Markdown => { - let mut render_code_report = CodeReportRender::new(&mut file, &compared_to, &reports); - render_code_report.render_report(); - }, - OutputFormat::Json => { - let json_output = serde_json::to_string(&reports).unwrap(); - file.write_all(json_output.as_bytes()).unwrap(); - }, + let mut output_file = create_file(&compare_args.output); + + let baseline_reports: Vec = match File::open(&compare_args.baseline) { + Ok(_) => extract_reports_from_json(&compare_args.baseline), + Err(_) => vec![], }; -} -fn generate_new_report(path: &str) -> Vec { - let directors = RelevantDirectories::find_all(path, &["".to_owned()]); + let new_reports: Vec = extract_reports_from_json(&compare_args.new); - extract_report(directors) + let mut render_code_report = + CodeReportRender::new(&mut output_file, &baseline_reports, &new_reports); + render_code_report.compare_reports(); } -fn extract_report(directors: RelevantDirectories) -> Vec { - let mut reports: Vec = Vec::new(); +pub fn convert_report(convert_args: &ConvertArgs) { + if !is_path_ends_with(&convert_args.output, MD) { + panic!("Conversion output is available only for Markdown file extension"); + } - for director in directors.iter() { - build_contract(&director.path); + if !is_path_ends_with(&convert_args.input, JSON) { + panic!("Conversion available only from JSON file extension"); + } - let output_path: PathBuf = director.path.join("output"); + let mut output_file = create_file(&convert_args.output); - extract_reports(&output_path, &mut reports); + let reports: Vec = extract_reports_from_json(&convert_args.input); - sanitize_output_path_from_report(&mut reports); + let mut convert_code_report = CodeReportRender::new_without_compare(&mut output_file, &reports); - clean_contract(&director.path); + convert_code_report.render_report(); +} + +pub fn create_report(compile_args: &CompileArgs) { + if !is_path_ends_with(&compile_args.output, JSON) + && !is_path_ends_with(&compile_args.output, MD) + { + panic!("Create report is available only for Markdown or JSON output file.") } - reports + let reports = generate_new_report(&compile_args.path); + + let mut file = create_file(&compile_args.output); + + if is_path_ends_with(&compile_args.output, MD) { + let mut render_code_report = CodeReportRender::new_without_compare(&mut file, &reports); + render_code_report.render_report(); + } else { + let json_output = serde_json::to_string(&reports).unwrap(); + file.write_all(json_output.as_bytes()).unwrap(); + } } -fn build_contract(path: &PathBuf) { - Command::new("sc-meta") - .arg("all") - .arg("build") - .arg("--path") - .arg(path) - .output() - .unwrap_or_else(|_| panic!("Failed to build the contract for path: {}", path.display())); +fn generate_new_report(path: &PathBuf) -> Vec { + let directors = RelevantDirectories::find_all(path, &["".to_owned()]); + + assemble_report_vec(directors) } -fn clean_contract(path: &PathBuf) { - Command::new("sc-meta") - .arg("all") - .arg("clean") - .arg("--path") - .arg(path) - .output() - .unwrap_or_else(|_| panic!("Failed to clean the contract for path: {}", path.display())); +fn assemble_report_vec(directors: RelevantDirectories) -> Vec { + let mut reports: Vec = Vec::new(); + + for director in directors.iter() { + let output_path: PathBuf = director.path.join("output"); + + collect_reports(&output_path, &mut reports); + sanitize_output_path_from_report(&mut reports); + } + + reports } fn find_mxsc_files(path: &PathBuf) -> Vec { @@ -107,16 +116,18 @@ fn find_mxsc_files(path: &PathBuf) -> Vec { mxsc_files } -fn extract_reports(path: &PathBuf, reports: &mut Vec) { +fn collect_reports(path: &PathBuf, reports: &mut Vec) { for mxsc_path in find_mxsc_files(path) { - let mxsc_file = - File::open(mxsc_path).unwrap_or_else(|_| panic!("Failed to open mxsc file")); + let mxsc_file = match File::open(mxsc_path) { + Ok(file) => file, + Err(_) => continue, + }; let data: MxscFileJson = serde_json::from_reader(mxsc_file).unwrap(); reports.push(data.report.code_report); } } -fn create_file(file_path: &str) -> File { +fn create_file(file_path: &PathBuf) -> File { File::create(file_path).expect("could not write report file") } @@ -130,3 +141,18 @@ fn sanitize_output_path_from_report(reports: &mut [CodeReportJson]) { .to_string(); }) } + +fn is_path_ends_with(path: &Path, extension: &str) -> bool { + path.to_path_buf() + .into_os_string() + .into_string() + .unwrap() + .ends_with(extension) +} + +fn extract_reports_from_json(path: &PathBuf) -> Vec { + let file = File::open(path).expect("file not found"); + let reader = BufReader::new(file); + + serde_json::from_reader(reader).expect("Cannot deserialize") +} diff --git a/framework/meta/src/cmd/code_report/render_code_report.rs b/framework/meta/src/cmd/code_report/render_code_report.rs index 54b0a5d9c9..528374828c 100644 --- a/framework/meta/src/cmd/code_report/render_code_report.rs +++ b/framework/meta/src/cmd/code_report/render_code_report.rs @@ -1,28 +1,37 @@ -use core::panic; -use std::{fmt::Display, fs::File, io::BufReader}; +use std::fmt::Display; pub struct CodeReportRender<'a> { pub file: Option<&'a mut dyn std::io::Write>, - pub compared_path_file: &'a str, + pub compared_reports: &'a [CodeReportJson], pub reports: &'a [CodeReportJson], } use multiversx_sc_meta_lib::code_report_json::CodeReportJson; use super::compare::{ - allocator_status_after_comparing, panic_status_after_comparing, parse_into_code_report_json, - size_status_after_comparing, + allocator_status_after_comparing, panic_status_after_comparing, size_status_after_comparing, }; impl<'a> CodeReportRender<'a> { pub fn new( file: &'a mut dyn std::io::Write, - compared_path_file: &'a str, + compared_reports: &'a [CodeReportJson], reports: &'a [CodeReportJson], ) -> Self { Self { file: Some(file), - compared_path_file, + compared_reports, + reports, + } + } + + pub fn new_without_compare( + file: &'a mut dyn std::io::Write, + reports: &'a [CodeReportJson], + ) -> Self { + Self { + file: Some(file), + compared_reports: &[], reports, } } @@ -30,10 +39,17 @@ impl<'a> CodeReportRender<'a> { pub fn render_report(&mut self) { self.render_header(); - if self.compared_path_file.is_empty() { + self.render_reports(); + } + + pub fn compare_reports(&mut self) { + self.render_header(); + + if self.compared_reports.is_empty() { self.render_reports(); + self.writeln("\n:warning: Could not compare the 2 versions because the baseline file was not found. :warning:"); } else { - self.render_reports_and_compare(); + self.render_report_and_compare(); } } @@ -75,29 +91,12 @@ impl<'a> CodeReportRender<'a> { } } - fn render_reports_and_compare(&mut self) { - let compared_file = File::open(self.compared_path_file).unwrap_or_else(|_| { - panic!( - "Failed to open compared file at path: {}", - self.compared_path_file - ) - }); - let mut compared_file_reader = BufReader::new(compared_file); - - let compared_reports = if self.compared_path_file.ends_with("md") { - // TODO this is only one time compared. Decide whether to exist or not - parse_into_code_report_json(&mut compared_file_reader) - } else { - serde_json::from_reader(compared_file_reader).unwrap_or_else(|_| { - self.render_reports(); - self.writeln("\n:warning: Could not compare the 2 versions because the deserialization process into the code report structure failed. :warning:"); - - Vec::new() - }) - }; - + fn render_report_and_compare(&mut self) { for report in self.reports.iter() { - if let Some(compared_report) = compared_reports.iter().find(|cr| cr.path == report.path) + if let Some(compared_report) = self + .compared_reports + .iter() + .find(|cr| cr.path == report.path) { self.print_compared_output(report, compared_report); } diff --git a/reported.md b/reported.md deleted file mode 100644 index f397b5b8e2..0000000000 --- a/reported.md +++ /dev/null @@ -1,96 +0,0 @@ -| Path                                                         |                                     size |                  has-allocator |                     has-format | -| :-- | --: | --: | --: | -| token-release.wasm | 7776 | false | without message | -| adder.wasm | 696 | false | none | -| order-book-pair.wasm | 13786 | false | without message | -| order-book-factory.wasm | 3771 | false | without message | -| nft-storage-prepay.wasm | 2295 | false | none | -| multisig.wasm | 14145 | false | without message | -| multisig-full.wasm | 15672 | false | without message | -| multisig-view.wasm | 6248 | false | without message | -| bonding-curve-contract.wasm | 14735 | false | without message | -| seed-nft-minter.wasm | 15118 | false | without message | -| rewards-distribution.wasm | 10220 | false | without message | -| crypto-bubbles.wasm | 2347 | false | none | -| kitty-auction.wasm | 10065 | false | without message | -| kitty-genetic-alg.wasm | 3147 | false | without message | -| kitty-ownership.wasm | 12731 | false | without message | -| nft-subscription.wasm | 8793 | false | without message | -| proxy-pause.wasm | 4627 | false | without message | -| lottery-esdt.wasm | 10989 | false | without message | -| esdt-transfer-with-fee.wasm | 7779 | false | without message | -| check-pause.wasm | 1228 | false | none | -| factorial.wasm | 576 | false | none | -| digital-cash.wasm | 10047 | false | without message | -| crypto-zombies.wasm | 10304 | false | without message | -| nft-minter.wasm | 10028 | false | without message | -| empty.wasm | 241 | false | none | -| fractional-nfts.wasm | 8447 | false | without message | -| crowdfunding-esdt.wasm | 3988 | false | none | -| ping-pong-egld.wasm | 6032 | false | without message | -| send-tx-repeat.wasm | 901 | false | none | -| large-storage.wasm | 2164 | false | without message | -| map-repeat.wasm | 7234 | false | without message | -| queue-repeat.wasm | 5853 | false | without message | -| set-repeat.wasm | 7013 | false | without message | -| single-value-repeat.wasm | 4440 | false | without message | -| linked-list-repeat.wasm | 6681 | true | without message | -| vec-repeat.wasm | 5231 | false | without message | -| str-repeat.wasm | 2389 | false | without message | -| str-repeat-mb-builder-cached.wasm | 1139 | false | without message | -| str-repeat-mb-builder-basic.wasm | 759 | false | none | -| big-float-features.wasm | 6468 | false | without message | -| erc20.wasm | 2133 | false | none | -| erc721.wasm | 2578 | false | none | -| lottery-erc20.wasm | 12814 | false | without message | -| erc1155-marketplace.wasm | 11172 | false | without message | -| crowdfunding-erc20.wasm | 5331 | false | without message | -| erc1155-user-mock.wasm | 1360 | false | without message | -| erc1155.wasm | 12197 | false | without message | -| scenario-tester.wasm | 1114 | false | none | -| managed-map-features.wasm | 1315 | false | none | -| use-module-view.wasm | 733 | false | none | -| use-module.wasm | 33452 | false | without message | -| rust-snippets-generator-test.wasm | 4979 | false | without message | -| basic-features.wasm | 65181 | false | without message | -| basic-features-storage-bytes.wasm | 538 | false | none | -| payable-features.wasm | 4396 | false | without message | -| promises-features.wasm | 12926 | false | without message | -| vault-promises.wasm | 8523 | false | without message | -| vault-upgrade.wasm | 700 | false | none | -| vault.wasm | 7826 | false | without message | -| first-contract.wasm | 3086 | false | without message | -| second-contract.wasm | 1355 | false | none | -| forwarder-legacy.wasm | 32330 | false | without message | -| proxy-test-second.wasm | 2105 | false | without message | -| recursive-caller.wasm | 5466 | false | without message | -| forwarder-queue-promises.wasm | 13096 | false | without message | -| forwarder-queue.wasm | 12181 | false | without message | -| forwarder.wasm | 32687 | false | without message | -| builtin-func-features.wasm | 1101 | false | none | -| local-esdt-and-nft.wasm | 12071 | false | without message | -| forwarder-raw.wasm | 15309 | false | without message | -| forwarder-raw-init-sync-call.wasm | 3332 | false | none | -| forwarder-raw-init-async-call.wasm | 3062 | false | none | -| parent.wasm | 1678 | false | none | -| child.wasm | 4057 | false | without message | -| transfer-role-features.wasm | 8775 | false | without message | -| proxy-test-first.wasm | 6031 | false | without message | -| exchange-features.wasm | 1577 | false | none | -| alloc-features.wasm | 16748 | false | without message | -| alloc-mem-leaking.wasm | 16857 | false | without message | -| alloc-mem-fail.wasm | 16682 | true | without message | -| abi-tester.wasm | 7182 | true | without message | -| abi-tester-ev.wasm | 757 | false | none | -| panic-message-features.wasm | 12875 | false | with message | -| formatted-message-features.wasm | 3470 | false | without message | -| multi-contract-features.wasm | 678 | false | none | -| multi-contract-alt-impl.wasm | 360 | false | none | -| multi-contract-example-feature.wasm | 677 | false | none | -| multi-contract-features-view.wasm | 1115 | false | none | -| rust-testing-framework-tester.wasm | 8602 | false | without message | -| esdt-system-sc-mock.wasm | 3799 | false | none | -| multiversx-wegld-swap-sc.wasm | 3557 | false | without message | -| multiversx-price-aggregator-sc.wasm | 19327 | false | without message | - -:warning: Could not compare the 2 versions because the deserialization process into the code report structure failed. :warning: From 34c54af416a10be04080ded80a6491a225d3c604 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Fri, 9 Aug 2024 15:29:23 +0300 Subject: [PATCH 17/29] cli code report - change err message when baseline file not found --- .github/workflows/actions.yml | 2 +- framework/meta/src/cmd/code_report/render_code_report.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index 159dcd514b..a730a1fb15 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -14,7 +14,7 @@ permissions: jobs: contracts: name: Contracts - uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@c50a21fcb5a9d85f01990402db58979085d920b1 + uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@8b4ea39b4291e43e221aa6d980f6e97b34c8e1e8 with: rust-toolchain: stable path-to-sc-meta: framework/meta diff --git a/framework/meta/src/cmd/code_report/render_code_report.rs b/framework/meta/src/cmd/code_report/render_code_report.rs index 528374828c..e6edcfae8e 100644 --- a/framework/meta/src/cmd/code_report/render_code_report.rs +++ b/framework/meta/src/cmd/code_report/render_code_report.rs @@ -47,7 +47,7 @@ impl<'a> CodeReportRender<'a> { if self.compared_reports.is_empty() { self.render_reports(); - self.writeln("\n:warning: Could not compare the 2 versions because the baseline file was not found. :warning:"); + self.writeln("\n:warning: Could not download the report for the base branch. Displaying only the report for the current branch. :warning:"); } else { self.render_report_and_compare(); } From c4631d852dbd9d72d41cb1893a4e1ff805b7d83e Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Fri, 9 Aug 2024 16:38:17 +0300 Subject: [PATCH 18/29] cli code report - add extra info to err --- framework/meta/src/cmd/code_report.rs | 2 +- framework/meta/src/cmd/code_report/generate_report.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/meta/src/cmd/code_report.rs b/framework/meta/src/cmd/code_report.rs index 37e2617b9a..47e51948f0 100644 --- a/framework/meta/src/cmd/code_report.rs +++ b/framework/meta/src/cmd/code_report.rs @@ -12,4 +12,4 @@ pub fn report(args: &CodeReportArgs) { CodeReportAction::Compare(compare_args) => compare_report(compare_args), CodeReportAction::Convert(convert_args) => convert_report(convert_args), } -} \ No newline at end of file +} diff --git a/framework/meta/src/cmd/code_report/generate_report.rs b/framework/meta/src/cmd/code_report/generate_report.rs index a27aed5fec..e03d5cbdb6 100644 --- a/framework/meta/src/cmd/code_report/generate_report.rs +++ b/framework/meta/src/cmd/code_report/generate_report.rs @@ -151,7 +151,8 @@ fn is_path_ends_with(path: &Path, extension: &str) -> bool { } fn extract_reports_from_json(path: &PathBuf) -> Vec { - let file = File::open(path).expect("file not found"); + let file = + File::open(path).unwrap_or_else(|_| panic!("file with path {} not found", path.display())); let reader = BufReader::new(file); serde_json::from_reader(reader).expect("Cannot deserialize") From 723517d5761901cdcf58bf12e4887a9a843aa0c1 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Fri, 9 Aug 2024 17:13:08 +0300 Subject: [PATCH 19/29] cli code report - fix vector parsing err --- framework/meta/src/cmd/code_report/generate_report.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/meta/src/cmd/code_report/generate_report.rs b/framework/meta/src/cmd/code_report/generate_report.rs index e03d5cbdb6..b9c06b17ce 100644 --- a/framework/meta/src/cmd/code_report/generate_report.rs +++ b/framework/meta/src/cmd/code_report/generate_report.rs @@ -155,5 +155,5 @@ fn extract_reports_from_json(path: &PathBuf) -> Vec { File::open(path).unwrap_or_else(|_| panic!("file with path {} not found", path.display())); let reader = BufReader::new(file); - serde_json::from_reader(reader).expect("Cannot deserialize") + serde_json::from_reader(reader).unwrap_or_else(|_| vec![]) } From b98c1f712b13678d69e9804ad4a4817b53356375 Mon Sep 17 00:00:00 2001 From: Andrei Vasilescu Date: Mon, 12 Aug 2024 15:50:43 +0300 Subject: [PATCH 20/29] pem wallet generation --- Cargo.lock | 1 + framework/meta/Cargo.toml | 4 ++ framework/meta/src/cli/cli_args_standalone.rs | 58 +++++++++++++++++++ framework/meta/src/cli/cli_standalone_main.rs | 4 ++ framework/meta/src/cmd.rs | 1 + framework/meta/src/cmd/wallet.rs | 53 +++++++++++++++++ 6 files changed, 121 insertions(+) create mode 100644 framework/meta/src/cmd/wallet.rs diff --git a/Cargo.lock b/Cargo.lock index abeb3c37e1..4ae509e714 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -1996,6 +1996,7 @@ dependencies = [ "multiversx-sc", "multiversx-sc-meta-lib", "multiversx-sc-snippets", + "multiversx-sdk", "pathdiff", "reqwest", "ruplacer", diff --git a/framework/meta/Cargo.toml b/framework/meta/Cargo.toml index bd6775ed1a..0aebe72194 100644 --- a/framework/meta/Cargo.toml +++ b/framework/meta/Cargo.toml @@ -52,3 +52,7 @@ features = ["alloc", "num-bigint"] [dependencies.multiversx-sc-snippets] version = "=0.52.3" path = "../snippets" + +[dependencies.multiversx-sdk] +version = "=0.5.0" +path = "../../sdk/core" diff --git a/framework/meta/src/cli/cli_args_standalone.rs b/framework/meta/src/cli/cli_args_standalone.rs index 335afe41ea..38857c6f9e 100644 --- a/framework/meta/src/cli/cli_args_standalone.rs +++ b/framework/meta/src/cli/cli_args_standalone.rs @@ -75,6 +75,12 @@ pub enum StandaloneCliAction { about = "Generates a report on the local depedencies of contract crates. Will explore indirect depdencies too." )] LocalDeps(LocalDepsArgs), + + #[command( + name = "wallet", + about = "Generates a new wallet or performs actions on an existing wallet." + )] + Wallet(WalletArgs), } #[derive(Default, Clone, PartialEq, Eq, Debug, Args)] @@ -348,3 +354,55 @@ pub struct AccountArgs { #[arg(long = "address", verbatim_doc_comment)] pub address: String, } + +#[derive(Clone, PartialEq, Eq, Debug, Subcommand)] +pub enum WalletAction { + #[command(name = "new", about = "Creates a new wallet")] + New(WalletNewArgs), + + #[command(name = "convert", about = "Converts a wallet")] + Convert(WalletConvertArgs), +} + +#[derive(Default, Clone, PartialEq, Eq, Debug, ValueEnum)] +pub enum WalletFormat { + #[default] + Pem, +} + +#[derive(Default, Clone, PartialEq, Eq, Debug, ValueEnum)] +pub enum WalletConvertFormat { + #[default] + Bech32, + + Hex, +} + +#[derive(Default, Clone, PartialEq, Eq, Debug, Parser)] +#[command(propagate_version = true)] +pub struct WalletArgs { + #[command(subcommand)] + pub command: Option, +} + +#[derive(Default, Clone, PartialEq, Eq, Debug, Args)] +pub struct WalletNewArgs { + /// The type of wallet to create. + #[arg(long = "format", verbatim_doc_comment)] + pub wallet_format: Option, + + /// The name of the wallet to create. + #[arg(long = "outfile", verbatim_doc_comment)] + pub outfile: Option, + // #[arg(long = "address-hrp")] + // pub address_hrp: Option, +} + +#[derive(Default, Clone, PartialEq, Eq, Debug, Args)] +pub struct WalletConvertArgs { + #[arg(long = "from", verbatim_doc_comment)] + pub from: Option, + + #[arg(long = "to", verbatim_doc_comment)] + pub to: Option, +} diff --git a/framework/meta/src/cli/cli_standalone_main.rs b/framework/meta/src/cli/cli_standalone_main.rs index 6c8c6a67b0..5100750abc 100644 --- a/framework/meta/src/cli/cli_standalone_main.rs +++ b/framework/meta/src/cli/cli_standalone_main.rs @@ -1,5 +1,6 @@ use crate::cli::{StandaloneCliAction, StandaloneCliArgs}; use crate::cmd::retrieve_address::retrieve_address; +use crate::cmd::wallet::wallet; use clap::Parser; use crate::cmd::all::call_all_meta; @@ -41,6 +42,9 @@ pub async fn cli_main_standalone() { Some(StandaloneCliAction::LocalDeps(args)) => { local_deps(args); }, + Some(StandaloneCliAction::Wallet(args)) => { + wallet(args); + }, None => {}, } } diff --git a/framework/meta/src/cmd.rs b/framework/meta/src/cmd.rs index a588f90162..8053a2113e 100644 --- a/framework/meta/src/cmd.rs +++ b/framework/meta/src/cmd.rs @@ -9,3 +9,4 @@ pub mod template; pub mod test; pub mod test_coverage; pub mod upgrade; +pub mod wallet; diff --git a/framework/meta/src/cmd/wallet.rs b/framework/meta/src/cmd/wallet.rs new file mode 100644 index 0000000000..4ad0a3f7d9 --- /dev/null +++ b/framework/meta/src/cmd/wallet.rs @@ -0,0 +1,53 @@ +use std::{fs::File, io::Write}; + +use crate::cli::{WalletAction, WalletArgs, WalletConvertArgs, WalletFormat, WalletNewArgs}; +use multiversx_sdk::{data::address::Address, wallet::Wallet}; + +pub fn wallet(args: &WalletArgs) { + let command = args + .command + .as_ref() + .expect("command expected after `wallet`"); + match command { + WalletAction::New(new_args) => new(new_args), + WalletAction::Convert(convert_args) => convert(convert_args), + } +} + +fn convert(convert_args: &WalletConvertArgs) { + todo!() +} + +fn new(new_args: &WalletNewArgs) { + let format = new_args + .wallet_format + .as_ref() + .expect("wallet format is required"); + let outfile = new_args.outfile.as_ref().expect("output file is required"); + + match format { + WalletFormat::Pem => { + let mnemonic = Wallet::generate_mnemonic(); + let private_key = Wallet::get_private_key_from_mnemonic(mnemonic, 0u32, 0u32); + let pk_str: &str = &private_key.to_string(); + let wallet = Wallet::from_private_key(pk_str).unwrap(); + let address = wallet.address(); + + println!("Wallet address: {}", address); + + generate_pem(&address, pk_str, outfile); + }, + } +} + +fn generate_pem(address: &Address, private_key: &str, outfile: &String) { + let pem_content = format!( + "-----BEGIN PRIVATE KEY for {}-----\n{}\n-----END PRIVATE KEY for {}-----", + address.to_bech32_string().unwrap(), + private_key, + address.to_bech32_string().unwrap() + ); + + let mut file = File::create(outfile).unwrap(); + file.write_all(pem_content.as_bytes()).unwrap() +} From b530c1f6a712538be16e01c47a541e1c6cafd74d Mon Sep 17 00:00:00 2001 From: Andrei Vasilescu Date: Mon, 12 Aug 2024 18:52:33 +0300 Subject: [PATCH 21/29] [WIP] generated pem file --- Cargo.lock | 19 +++-- framework/meta/Cargo.toml | 1 + framework/meta/src/cli/cli_args_standalone.rs | 32 +++----- framework/meta/src/cmd/wallet.rs | 77 +++++++++++++++++-- 4 files changed, 95 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4ae509e714..08f2acc6ae 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -195,6 +195,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "base64" version = "0.22.1" @@ -1988,6 +1994,7 @@ dependencies = [ name = "multiversx-sc-meta" version = "0.52.3" dependencies = [ + "base64 0.13.1", "clap", "colored", "common-path", @@ -2038,7 +2045,7 @@ dependencies = [ name = "multiversx-sc-scenario" version = "0.52.3" dependencies = [ - "base64", + "base64 0.22.1", "bech32", "colored", "hex", @@ -2062,7 +2069,7 @@ dependencies = [ name = "multiversx-sc-snippets" version = "0.52.3" dependencies = [ - "base64", + "base64 0.22.1", "env_logger", "futures", "hex", @@ -2086,7 +2093,7 @@ name = "multiversx-sdk" version = "0.5.0" dependencies = [ "anyhow", - "base64", + "base64 0.22.1", "bech32", "bip39", "hex", @@ -2424,7 +2431,7 @@ version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ - "base64", + "base64 0.22.1", "serde", ] @@ -2756,7 +2763,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "encoding_rs", "futures-channel", @@ -2926,7 +2933,7 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" dependencies = [ - "base64", + "base64 0.22.1", "rustls-pki-types", ] diff --git a/framework/meta/Cargo.toml b/framework/meta/Cargo.toml index 0aebe72194..c59184d411 100644 --- a/framework/meta/Cargo.toml +++ b/framework/meta/Cargo.toml @@ -39,6 +39,7 @@ zip = { version = "2.1", features = ["deflate"], default-features = false } copy_dir = "0.1.2" pathdiff = "0.2.1" common-path = "1.0.0" +base64 = "0.13" [dependencies.multiversx-sc-meta-lib] version = "=0.52.3" diff --git a/framework/meta/src/cli/cli_args_standalone.rs b/framework/meta/src/cli/cli_args_standalone.rs index 38857c6f9e..d670987338 100644 --- a/framework/meta/src/cli/cli_args_standalone.rs +++ b/framework/meta/src/cli/cli_args_standalone.rs @@ -364,20 +364,6 @@ pub enum WalletAction { Convert(WalletConvertArgs), } -#[derive(Default, Clone, PartialEq, Eq, Debug, ValueEnum)] -pub enum WalletFormat { - #[default] - Pem, -} - -#[derive(Default, Clone, PartialEq, Eq, Debug, ValueEnum)] -pub enum WalletConvertFormat { - #[default] - Bech32, - - Hex, -} - #[derive(Default, Clone, PartialEq, Eq, Debug, Parser)] #[command(propagate_version = true)] pub struct WalletArgs { @@ -389,20 +375,24 @@ pub struct WalletArgs { pub struct WalletNewArgs { /// The type of wallet to create. #[arg(long = "format", verbatim_doc_comment)] - pub wallet_format: Option, + pub wallet_format: Option, /// The name of the wallet to create. #[arg(long = "outfile", verbatim_doc_comment)] pub outfile: Option, - // #[arg(long = "address-hrp")] - // pub address_hrp: Option, } #[derive(Default, Clone, PartialEq, Eq, Debug, Args)] pub struct WalletConvertArgs { - #[arg(long = "from", verbatim_doc_comment)] - pub from: Option, + #[arg(long = "in-format", verbatim_doc_comment)] + pub from: Option, - #[arg(long = "to", verbatim_doc_comment)] - pub to: Option, + #[arg(long = "out-format", verbatim_doc_comment)] + pub to: Option, + + #[arg(long = "infile", verbatim_doc_comment)] + pub infile: Option, + + #[arg(long = "outfile", verbatim_doc_comment)] + pub outfile: Option, } diff --git a/framework/meta/src/cmd/wallet.rs b/framework/meta/src/cmd/wallet.rs index 4ad0a3f7d9..b1fdddee9c 100644 --- a/framework/meta/src/cmd/wallet.rs +++ b/framework/meta/src/cmd/wallet.rs @@ -1,6 +1,12 @@ -use std::{fs::File, io::Write}; +use base64; +use core::str; +use std::{ + fs::{self, File}, + io::Write, +}; -use crate::cli::{WalletAction, WalletArgs, WalletConvertArgs, WalletFormat, WalletNewArgs}; +use crate::cli::{WalletAction, WalletArgs, WalletConvertArgs, WalletNewArgs}; +use multiversx_sc_snippets::{hex, imports::Bech32Address}; use multiversx_sdk::{data::address::Address, wallet::Wallet}; pub fn wallet(args: &WalletArgs) { @@ -15,7 +21,46 @@ pub fn wallet(args: &WalletArgs) { } fn convert(convert_args: &WalletConvertArgs) { - todo!() + let infile = convert_args + .infile + .as_ref() + .expect("input file is required"); + let outfile = convert_args.outfile.as_ref(); + let in_format = convert_args + .from + .as_ref() + .expect("input format is required"); + let out_format = convert_args.to.as_ref().expect("output format is required"); + + let in_address = fs::read_to_string(infile).unwrap(); + let mut out_addr: String = String::from(""); + + match (in_format.as_str(), out_format.as_str()) { + ("address-bech32", "address-hex") => { + out_addr = Bech32Address::from_bech32_string(in_address).to_hex(); + }, + ("address-hex", "address-bech32") => { + // out_addr = Bech32Address::from(in_address).to_bech32_string(); + let bytes_from_hex: [u8; 64] = hex::decode(in_address).unwrap().try_into().unwrap(); + out_addr = Bech32Address::from_bech32_string( + str::from_utf8(&bytes_from_hex).unwrap().to_string(), + ) + .to_bech32_string(); + }, + _ => { + println!("Unsupported conversion"); + }, + } + + match outfile { + Some(outfile) => { + let mut file = File::create(outfile).unwrap(); + file.write_all(out_addr.as_bytes()).unwrap(); + }, + None => { + println!("{}", out_addr); + }, + } } fn new(new_args: &WalletNewArgs) { @@ -25,8 +70,8 @@ fn new(new_args: &WalletNewArgs) { .expect("wallet format is required"); let outfile = new_args.outfile.as_ref().expect("output file is required"); - match format { - WalletFormat::Pem => { + match format.as_str() { + "pem" => { let mnemonic = Wallet::generate_mnemonic(); let private_key = Wallet::get_private_key_from_mnemonic(mnemonic, 0u32, 0u32); let pk_str: &str = &private_key.to_string(); @@ -37,14 +82,32 @@ fn new(new_args: &WalletNewArgs) { generate_pem(&address, pk_str, outfile); }, + _ => { + println!("Unsupported wallet format"); + }, } } fn generate_pem(address: &Address, private_key: &str, outfile: &String) { + println!("{private_key}"); + let private_key_hex_encoded = hex::encode(private_key.as_bytes()); + println!("HEX {private_key_hex_encoded}"); + // let priv_key_bytes = private_key_hex_encoded.as_bytes(); + let private_key_base64 = base64::encode(&private_key_hex_encoded.as_bytes()); + println!("B64 {private_key_base64}"); + + // Split the base64 string into 64-character lines + let formatted_key = private_key_base64 + .as_bytes() + .chunks(64) + .map(|chunk| std::str::from_utf8(chunk).unwrap()) + .collect::>() + .join("\n"); + let pem_content = format!( - "-----BEGIN PRIVATE KEY for {}-----\n{}\n-----END PRIVATE KEY for {}-----", + "-----BEGIN PRIVATE KEY for {}-----\n{}\n-----END PRIVATE KEY for {}-----\n", address.to_bech32_string().unwrap(), - private_key, + formatted_key, address.to_bech32_string().unwrap() ); From 8582152ca7bb718021dc6f387b5e17e12c0f6f6a Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Mon, 12 Aug 2024 19:01:01 +0300 Subject: [PATCH 22/29] cli code report - fix typo --- framework/meta/src/cli/cli_args_standalone.rs | 2 +- framework/meta/src/cmd/code_report/generate_report.rs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/meta/src/cli/cli_args_standalone.rs b/framework/meta/src/cli/cli_args_standalone.rs index b569c5fd32..0be68d805f 100644 --- a/framework/meta/src/cli/cli_args_standalone.rs +++ b/framework/meta/src/cli/cli_args_standalone.rs @@ -153,7 +153,7 @@ pub enum CodeReportAction { #[command(name = "compile", about = "Generates the contract report.")] Compile(CompileArgs), - #[command(name = "compare", about = "Compare two contract report.")] + #[command(name = "compare", about = "Compare two contract reports.")] Compare(CompareArgs), #[command( diff --git a/framework/meta/src/cmd/code_report/generate_report.rs b/framework/meta/src/cmd/code_report/generate_report.rs index b9c06b17ce..5c06b65295 100644 --- a/framework/meta/src/cmd/code_report/generate_report.rs +++ b/framework/meta/src/cmd/code_report/generate_report.rs @@ -20,13 +20,13 @@ const MD: &str = ".md"; pub fn compare_report(compare_args: &CompareArgs) { if !is_path_ends_with(&compare_args.output, MD) { - panic!("Compare output is available only for Markdown file extension."); + panic!("Compare output is only available for Markdown file extension."); } if !is_path_ends_with(&compare_args.baseline, JSON) && !is_path_ends_with(&compare_args.new, JSON) { - panic!("Compare baseline and new is available only for JSON file extension."); + panic!("Compare baseline and new are only available for JSON file extension."); } let mut output_file = create_file(&compare_args.output); @@ -45,11 +45,11 @@ pub fn compare_report(compare_args: &CompareArgs) { pub fn convert_report(convert_args: &ConvertArgs) { if !is_path_ends_with(&convert_args.output, MD) { - panic!("Conversion output is available only for Markdown file extension"); + panic!("Conversion output is only available for Markdown file extension"); } if !is_path_ends_with(&convert_args.input, JSON) { - panic!("Conversion available only from JSON file extension"); + panic!("Conversion only available from JSON file extension"); } let mut output_file = create_file(&convert_args.output); @@ -65,7 +65,7 @@ pub fn create_report(compile_args: &CompileArgs) { if !is_path_ends_with(&compile_args.output, JSON) && !is_path_ends_with(&compile_args.output, MD) { - panic!("Create report is available only for Markdown or JSON output file.") + panic!("Create report is only available for Markdown or JSON output file.") } let reports = generate_new_report(&compile_args.path); From d5be23d47cd28e9aae627899dc80d85302d2e5c6 Mon Sep 17 00:00:00 2001 From: Andrei Vasilescu Date: Tue, 13 Aug 2024 13:09:31 +0300 Subject: [PATCH 23/29] demo wallet creation & conversion --- framework/meta/src/cli/cli_args_standalone.rs | 4 +- framework/meta/src/cmd/wallet.rs | 105 ++++++++++-------- 2 files changed, 59 insertions(+), 50 deletions(-) diff --git a/framework/meta/src/cli/cli_args_standalone.rs b/framework/meta/src/cli/cli_args_standalone.rs index d670987338..59cb0a4d86 100644 --- a/framework/meta/src/cli/cli_args_standalone.rs +++ b/framework/meta/src/cli/cli_args_standalone.rs @@ -385,10 +385,10 @@ pub struct WalletNewArgs { #[derive(Default, Clone, PartialEq, Eq, Debug, Args)] pub struct WalletConvertArgs { #[arg(long = "in-format", verbatim_doc_comment)] - pub from: Option, + pub from: String, #[arg(long = "out-format", verbatim_doc_comment)] - pub to: Option, + pub to: String, #[arg(long = "infile", verbatim_doc_comment)] pub infile: Option, diff --git a/framework/meta/src/cmd/wallet.rs b/framework/meta/src/cmd/wallet.rs index b1fdddee9c..bdddf81b60 100644 --- a/framework/meta/src/cmd/wallet.rs +++ b/framework/meta/src/cmd/wallet.rs @@ -1,13 +1,14 @@ use base64; use core::str; +use multiversx_sc::types; use std::{ fs::{self, File}, - io::Write, + io::{self, Read, Write}, }; use crate::cli::{WalletAction, WalletArgs, WalletConvertArgs, WalletNewArgs}; use multiversx_sc_snippets::{hex, imports::Bech32Address}; -use multiversx_sdk::{data::address::Address, wallet::Wallet}; +use multiversx_sdk::{crypto::public_key::PublicKey, data::address::Address, wallet::Wallet}; pub fn wallet(args: &WalletArgs) { let command = args @@ -21,31 +22,37 @@ pub fn wallet(args: &WalletArgs) { } fn convert(convert_args: &WalletConvertArgs) { - let infile = convert_args - .infile - .as_ref() - .expect("input file is required"); + let infile = convert_args.infile.as_ref(); let outfile = convert_args.outfile.as_ref(); - let in_format = convert_args - .from - .as_ref() - .expect("input format is required"); - let out_format = convert_args.to.as_ref().expect("output format is required"); + let in_format = &convert_args.from; + let out_format = &convert_args.to; + + let mut in_address = String::new(); + let mut out_address: String = String::new(); + + match infile { + Some(file) => in_address = fs::read_to_string(file).unwrap(), + None => { + println!("Insert text below. Press 'Ctrl-D' (Linux / MacOS) or 'Ctrl-Z' (Windows) when done."); + _ = io::stdin().read_to_string(&mut in_address).unwrap() + }, + } - let in_address = fs::read_to_string(infile).unwrap(); - let mut out_addr: String = String::from(""); + in_address = in_address.replace('\n', ""); match (in_format.as_str(), out_format.as_str()) { ("address-bech32", "address-hex") => { - out_addr = Bech32Address::from_bech32_string(in_address).to_hex(); + out_address = Bech32Address::from_bech32_string(in_address).to_hex(); }, ("address-hex", "address-bech32") => { - // out_addr = Bech32Address::from(in_address).to_bech32_string(); - let bytes_from_hex: [u8; 64] = hex::decode(in_address).unwrap().try_into().unwrap(); - out_addr = Bech32Address::from_bech32_string( - str::from_utf8(&bytes_from_hex).unwrap().to_string(), - ) - .to_bech32_string(); + let bytes_from_hex = hex::decode(in_address).unwrap(); + let bytes_arr: [u8; 32] = bytes_from_hex.try_into().unwrap(); + + let addr = types::Address::from(&bytes_arr); + out_address = Bech32Address::from(addr).to_bech32_str().to_string(); + }, + ("", _) | (_, "") => { + println!("error: the following arguments are required: --in-format, --out-format"); }, _ => { println!("Unsupported conversion"); @@ -55,49 +62,51 @@ fn convert(convert_args: &WalletConvertArgs) { match outfile { Some(outfile) => { let mut file = File::create(outfile).unwrap(); - file.write_all(out_addr.as_bytes()).unwrap(); + out_address.push('\n'); + file.write_all(out_address.as_bytes()).unwrap(); }, None => { - println!("{}", out_addr); + println!("{}", out_address); }, } } fn new(new_args: &WalletNewArgs) { - let format = new_args - .wallet_format - .as_ref() - .expect("wallet format is required"); - let outfile = new_args.outfile.as_ref().expect("output file is required"); + let format = new_args.wallet_format.as_ref(); + let outfile = new_args.outfile.as_ref(); + let mnemonic = Wallet::generate_mnemonic(); + println!("Mnemonic: {}", mnemonic); - match format.as_str() { - "pem" => { - let mnemonic = Wallet::generate_mnemonic(); - let private_key = Wallet::get_private_key_from_mnemonic(mnemonic, 0u32, 0u32); - let pk_str: &str = &private_key.to_string(); - let wallet = Wallet::from_private_key(pk_str).unwrap(); - let address = wallet.address(); + let private_key = Wallet::get_private_key_from_mnemonic(mnemonic, 0u32, 0u32); + let public_key = PublicKey::from(&private_key); - println!("Wallet address: {}", address); + let public_key_str: &str = &public_key.to_string(); + let private_key_str: &str = &private_key.to_string(); - generate_pem(&address, pk_str, outfile); - }, - _ => { - println!("Unsupported wallet format"); - }, + let wallet = Wallet::from_private_key(private_key_str).unwrap(); + let address = wallet.address(); + + println!("Wallet address: {}", address); + + if let Some(f) = format { + match (f.as_str(), outfile) { + ("pem", Some(file)) => { + generate_pem(&address, private_key_str, public_key_str, file); + }, + ("pem", None) => { + println!("Output file is required for PEM format"); + }, + _ => {}, + } } } -fn generate_pem(address: &Address, private_key: &str, outfile: &String) { - println!("{private_key}"); - let private_key_hex_encoded = hex::encode(private_key.as_bytes()); - println!("HEX {private_key_hex_encoded}"); - // let priv_key_bytes = private_key_hex_encoded.as_bytes(); - let private_key_base64 = base64::encode(&private_key_hex_encoded.as_bytes()); - println!("B64 {private_key_base64}"); +fn generate_pem(address: &Address, private_key: &str, public_key: &str, outfile: &String) { + let concat_keys = format!("{}{}", private_key, public_key); + let concat_keys_b64 = base64::encode(concat_keys); // Split the base64 string into 64-character lines - let formatted_key = private_key_base64 + let formatted_key = concat_keys_b64 .as_bytes() .chunks(64) .map(|chunk| std::str::from_utf8(chunk).unwrap()) From 5c42c62fbbef972ccae819a7fac69e6d1cf7e46b Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Tue, 13 Aug 2024 14:08:15 +0300 Subject: [PATCH 24/29] cli code report - revert version of sc-actions --- .github/workflows/actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index a730a1fb15..dc0bcc8596 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -14,7 +14,7 @@ permissions: jobs: contracts: name: Contracts - uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@8b4ea39b4291e43e221aa6d980f6e97b34c8e1e8 + uses: multiversx/mx-sc-actions/.github/workflows/contracts.yml@v3.1.0 with: rust-toolchain: stable path-to-sc-meta: framework/meta From 47ef8de7f75ed1c031b448d00579debefa2e0941 Mon Sep 17 00:00:00 2001 From: Andrei Vasilescu Date: Tue, 13 Aug 2024 17:03:47 +0300 Subject: [PATCH 25/29] added bech32 command and updated conversion --- framework/meta/Cargo.toml | 2 +- framework/meta/src/cli/cli_args_standalone.rs | 17 ++- framework/meta/src/cmd/wallet.rs | 132 +++++++++++------- 3 files changed, 101 insertions(+), 50 deletions(-) diff --git a/framework/meta/Cargo.toml b/framework/meta/Cargo.toml index c59184d411..63625c1746 100644 --- a/framework/meta/Cargo.toml +++ b/framework/meta/Cargo.toml @@ -39,7 +39,7 @@ zip = { version = "2.1", features = ["deflate"], default-features = false } copy_dir = "0.1.2" pathdiff = "0.2.1" common-path = "1.0.0" -base64 = "0.13" +bip39 = "2.0.0" [dependencies.multiversx-sc-meta-lib] version = "=0.52.3" diff --git a/framework/meta/src/cli/cli_args_standalone.rs b/framework/meta/src/cli/cli_args_standalone.rs index 59cb0a4d86..104feac18d 100644 --- a/framework/meta/src/cli/cli_args_standalone.rs +++ b/framework/meta/src/cli/cli_args_standalone.rs @@ -360,15 +360,20 @@ pub enum WalletAction { #[command(name = "new", about = "Creates a new wallet")] New(WalletNewArgs), + #[command( + name = "bech32", + about = "Encodes/decodes a bech32 address to/from hex" + )] + Bech32(WalletBech32Args), #[command(name = "convert", about = "Converts a wallet")] Convert(WalletConvertArgs), } -#[derive(Default, Clone, PartialEq, Eq, Debug, Parser)] +#[derive(Clone, PartialEq, Eq, Debug, Parser)] #[command(propagate_version = true)] pub struct WalletArgs { #[command(subcommand)] - pub command: Option, + pub command: WalletAction, } #[derive(Default, Clone, PartialEq, Eq, Debug, Args)] @@ -396,3 +401,11 @@ pub struct WalletConvertArgs { #[arg(long = "outfile", verbatim_doc_comment)] pub outfile: Option, } + +#[derive(Default, Clone, PartialEq, Eq, Debug, Args)] +pub struct WalletBech32Args { + #[arg(long = "encode", verbatim_doc_comment)] + pub hex_address: Option, + #[arg(long = "decode", verbatim_doc_comment)] + pub bech32_address: Option, +} diff --git a/framework/meta/src/cmd/wallet.rs b/framework/meta/src/cmd/wallet.rs index bdddf81b60..7ed5ea58bb 100644 --- a/framework/meta/src/cmd/wallet.rs +++ b/framework/meta/src/cmd/wallet.rs @@ -1,4 +1,3 @@ -use base64; use core::str; use multiversx_sc::types; use std::{ @@ -6,17 +5,17 @@ use std::{ io::{self, Read, Write}, }; -use crate::cli::{WalletAction, WalletArgs, WalletConvertArgs, WalletNewArgs}; +use crate::cli::{WalletAction, WalletArgs, WalletBech32Args, WalletConvertArgs, WalletNewArgs}; +use bip39::Mnemonic; use multiversx_sc_snippets::{hex, imports::Bech32Address}; -use multiversx_sdk::{crypto::public_key::PublicKey, data::address::Address, wallet::Wallet}; - +use multiversx_sdk::{ + crypto::public_key::PublicKey, data::address::Address, utils::base64_encode, wallet::Wallet, +}; pub fn wallet(args: &WalletArgs) { - let command = args - .command - .as_ref() - .expect("command expected after `wallet`"); + let command = &args.command; match command { WalletAction::New(new_args) => new(new_args), + WalletAction::Bech32(bech32_args) => bech32_conversion(bech32_args), WalletAction::Convert(convert_args) => convert(convert_args), } } @@ -27,71 +26,105 @@ fn convert(convert_args: &WalletConvertArgs) { let in_format = &convert_args.from; let out_format = &convert_args.to; - let mut in_address = String::new(); - let mut out_address: String = String::new(); - - match infile { - Some(file) => in_address = fs::read_to_string(file).unwrap(), - None => { - println!("Insert text below. Press 'Ctrl-D' (Linux / MacOS) or 'Ctrl-Z' (Windows) when done."); - _ = io::stdin().read_to_string(&mut in_address).unwrap() - }, - } - - in_address = in_address.replace('\n', ""); + let mut mnemonic_str = String::new(); match (in_format.as_str(), out_format.as_str()) { - ("address-bech32", "address-hex") => { - out_address = Bech32Address::from_bech32_string(in_address).to_hex(); - }, - ("address-hex", "address-bech32") => { - let bytes_from_hex = hex::decode(in_address).unwrap(); - let bytes_arr: [u8; 32] = bytes_from_hex.try_into().unwrap(); - - let addr = types::Address::from(&bytes_arr); - out_address = Bech32Address::from(addr).to_bech32_str().to_string(); - }, - ("", _) | (_, "") => { - println!("error: the following arguments are required: --in-format, --out-format"); + ("mnemonic", "pem") => match infile { + Some(file) => { + mnemonic_str = fs::read_to_string(file).unwrap(); + mnemonic_str = mnemonic_str.replace('\n', ""); + }, + None => { + println!("Insert text below. Press 'Ctrl-D' (Linux / MacOS) or 'Ctrl-Z' (Windows) when done."); + _ = io::stdin().read_to_string(&mut mnemonic_str).unwrap() + }, }, _ => { println!("Unsupported conversion"); }, } + let mnemonic = Mnemonic::parse(mnemonic_str).unwrap(); + + let (private_key_str, public_key_str) = get_wallet_keys(mnemonic); + let address = get_wallet_address(private_key_str.as_str()); + match outfile { Some(outfile) => { - let mut file = File::create(outfile).unwrap(); - out_address.push('\n'); - file.write_all(out_address.as_bytes()).unwrap(); + generate_pem( + &address, + private_key_str.as_str(), + public_key_str.as_str(), + outfile, + ); }, None => { - println!("{}", out_address); + let pem_content = + generate_pem_content(&address, private_key_str.as_str(), public_key_str.as_str()); + print!("{}", pem_content); }, } } -fn new(new_args: &WalletNewArgs) { - let format = new_args.wallet_format.as_ref(); - let outfile = new_args.outfile.as_ref(); - let mnemonic = Wallet::generate_mnemonic(); - println!("Mnemonic: {}", mnemonic); +fn bech32_conversion(bech32_args: &WalletBech32Args) { + let encode_address = bech32_args.hex_address.as_ref(); + let decode_address = bech32_args.bech32_address.as_ref(); + + match (encode_address, decode_address) { + (Some(hex), None) => { + let bytes_from_hex = hex::decode(hex).unwrap(); + let bytes_arr: [u8; 32] = bytes_from_hex.try_into().unwrap(); + let addr = types::Address::from(&bytes_arr); + let bech32_addr = Bech32Address::from(addr).to_bech32_str().to_string(); + println!("{}", bech32_addr); + }, + (None, Some(bech32)) => { + let hex_addr = Bech32Address::from_bech32_string(bech32.to_string()).to_hex(); + println!("{}", hex_addr); + }, + (Some(_), Some(_)) => { + println!("error: only one of --encode or --decode can be used in the same command"); + }, + _ => {}, + } +} + +fn get_wallet_keys(mnemonic: Mnemonic) -> (String, String) { let private_key = Wallet::get_private_key_from_mnemonic(mnemonic, 0u32, 0u32); let public_key = PublicKey::from(&private_key); let public_key_str: &str = &public_key.to_string(); let private_key_str: &str = &private_key.to_string(); - let wallet = Wallet::from_private_key(private_key_str).unwrap(); - let address = wallet.address(); + (private_key_str.to_string(), public_key_str.to_string()) +} + +fn get_wallet_address(private_key: &str) -> Address { + let wallet = Wallet::from_private_key(private_key).unwrap(); + wallet.address() +} + +fn new(new_args: &WalletNewArgs) { + let format = new_args.wallet_format.as_ref(); + let outfile = new_args.outfile.as_ref(); + let mnemonic = Wallet::generate_mnemonic(); + println!("Mnemonic: {}", mnemonic); + + let (private_key_str, public_key_str) = get_wallet_keys(mnemonic); + let address = get_wallet_address(private_key_str.as_str()); println!("Wallet address: {}", address); if let Some(f) = format { match (f.as_str(), outfile) { ("pem", Some(file)) => { - generate_pem(&address, private_key_str, public_key_str, file); + generate_pem( + &address, + private_key_str.as_str(), + public_key_str.as_str(), + file, + ); }, ("pem", None) => { println!("Output file is required for PEM format"); @@ -102,8 +135,14 @@ fn new(new_args: &WalletNewArgs) { } fn generate_pem(address: &Address, private_key: &str, public_key: &str, outfile: &String) { + let pem_content = generate_pem_content(address, private_key, public_key); + let mut file = File::create(outfile).unwrap(); + file.write_all(pem_content.as_bytes()).unwrap() +} + +fn generate_pem_content(address: &Address, private_key: &str, public_key: &str) -> String { let concat_keys = format!("{}{}", private_key, public_key); - let concat_keys_b64 = base64::encode(concat_keys); + let concat_keys_b64 = base64_encode(concat_keys); // Split the base64 string into 64-character lines let formatted_key = concat_keys_b64 @@ -120,6 +159,5 @@ fn generate_pem(address: &Address, private_key: &str, public_key: &str, outfile: address.to_bech32_string().unwrap() ); - let mut file = File::create(outfile).unwrap(); - file.write_all(pem_content.as_bytes()).unwrap() + pem_content } From eba0141dee9f708136bf2560255decb736be56b4 Mon Sep 17 00:00:00 2001 From: Andrei Vasilescu Date: Tue, 13 Aug 2024 17:50:45 +0300 Subject: [PATCH 26/29] deleted unnecessary dependency --- framework/meta/Cargo.toml | 4 ---- framework/meta/src/cmd/wallet.rs | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/framework/meta/Cargo.toml b/framework/meta/Cargo.toml index 63625c1746..fba796a3d0 100644 --- a/framework/meta/Cargo.toml +++ b/framework/meta/Cargo.toml @@ -53,7 +53,3 @@ features = ["alloc", "num-bigint"] [dependencies.multiversx-sc-snippets] version = "=0.52.3" path = "../snippets" - -[dependencies.multiversx-sdk] -version = "=0.5.0" -path = "../../sdk/core" diff --git a/framework/meta/src/cmd/wallet.rs b/framework/meta/src/cmd/wallet.rs index 7ed5ea58bb..7fcf28899a 100644 --- a/framework/meta/src/cmd/wallet.rs +++ b/framework/meta/src/cmd/wallet.rs @@ -7,10 +7,10 @@ use std::{ use crate::cli::{WalletAction, WalletArgs, WalletBech32Args, WalletConvertArgs, WalletNewArgs}; use bip39::Mnemonic; -use multiversx_sc_snippets::{hex, imports::Bech32Address}; -use multiversx_sdk::{ +use multiversx_sc_snippets::sdk::{ crypto::public_key::PublicKey, data::address::Address, utils::base64_encode, wallet::Wallet, }; +use multiversx_sc_snippets::{hex, imports::Bech32Address}; pub fn wallet(args: &WalletArgs) { let command = &args.command; match command { From 925ed7ed0f2674ab0dedbca8855f96740d119931 Mon Sep 17 00:00:00 2001 From: Andrei Marinica Date: Wed, 14 Aug 2024 17:01:01 +0300 Subject: [PATCH 27/29] substitution list: AddressToIdMapper --- .../basic-features/src/storage_mapper_address_to_id.rs | 2 +- framework/derive/src/preprocessing/substitution_list.rs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/feature-tests/basic-features/src/storage_mapper_address_to_id.rs b/contracts/feature-tests/basic-features/src/storage_mapper_address_to_id.rs index ff50875276..9bc0803fd3 100644 --- a/contracts/feature-tests/basic-features/src/storage_mapper_address_to_id.rs +++ b/contracts/feature-tests/basic-features/src/storage_mapper_address_to_id.rs @@ -43,5 +43,5 @@ pub trait AddressToIdMapperFeatures { } #[storage_mapper("address_ids")] - fn address_ids(&self) -> AddressToIdMapper; + fn address_ids(&self) -> AddressToIdMapper; } diff --git a/framework/derive/src/preprocessing/substitution_list.rs b/framework/derive/src/preprocessing/substitution_list.rs index 62fdb11823..ec1b330239 100644 --- a/framework/derive/src/preprocessing/substitution_list.rs +++ b/framework/derive/src/preprocessing/substitution_list.rs @@ -109,6 +109,7 @@ fn add_storage_mappers(substitutions: &mut SubstitutionsMap) { add_storage_mapper_single_generic_arg(substitutions, "e!(TokenAttributesMapper)); add_storage_mapper_single_generic_arg(substitutions, "e!(UniqueIdMapper)); add_storage_mapper_single_generic_arg(substitutions, "e!(UserMapper)); + add_storage_mapper_single_generic_arg(substitutions, "e!(AddressToIdMapper)); add_storage_mapper(substitutions, "e!(BiDiMapper)); add_storage_mapper(substitutions, "e!(LinkedListMapper)); From 5b00e03d6d27c5c50e1ebdcaf46861615c042ee9 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Wed, 14 Aug 2024 20:20:29 +0300 Subject: [PATCH 28/29] proxy gen - fix for non-configured proxy and ManagedOption type --- contracts/examples/lottery-esdt/src/lottery_info.rs | 3 ++- contracts/examples/lottery-esdt/src/status.rs | 3 ++- framework/base/src/types/managed/wrapped/managed_option.rs | 5 ++++- .../meta-lib/src/contract/generate_proxy/proxy_gen_main.rs | 7 +++++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/contracts/examples/lottery-esdt/src/lottery_info.rs b/contracts/examples/lottery-esdt/src/lottery_info.rs index 869a3906a8..4ec2a6055f 100644 --- a/contracts/examples/lottery-esdt/src/lottery_info.rs +++ b/contracts/examples/lottery-esdt/src/lottery_info.rs @@ -5,7 +5,8 @@ use multiversx_sc::{ use multiversx_sc::derive_imports::*; -#[derive(NestedEncode, NestedDecode, TopEncode, TopDecode, TypeAbi)] +#[type_abi] +#[derive(NestedEncode, NestedDecode, TopEncode, TopDecode)] pub struct LotteryInfo { pub token_identifier: EgldOrEsdtTokenIdentifier, pub ticket_price: BigUint, diff --git a/contracts/examples/lottery-esdt/src/status.rs b/contracts/examples/lottery-esdt/src/status.rs index ba87b5bb84..6a932f2f70 100644 --- a/contracts/examples/lottery-esdt/src/status.rs +++ b/contracts/examples/lottery-esdt/src/status.rs @@ -1,6 +1,7 @@ use multiversx_sc::derive_imports::*; -#[derive(TopEncode, TopDecode, TypeAbi, PartialEq, Eq, Clone, Copy)] +#[type_abi] +#[derive(TopEncode, TopDecode, PartialEq, Eq, Clone, Copy)] pub enum Status { Inactive, Running, diff --git a/framework/base/src/types/managed/wrapped/managed_option.rs b/framework/base/src/types/managed/wrapped/managed_option.rs index ddedbbdb8d..eb17ae81e4 100644 --- a/framework/base/src/types/managed/wrapped/managed_option.rs +++ b/framework/base/src/types/managed/wrapped/managed_option.rs @@ -308,7 +308,10 @@ where } fn type_name_rust() -> TypeName { - Option::::type_name_rust() + TypeName::from(alloc::format!( + "ManagedOption<$API, {}>", + T::type_name_rust() + )) } fn provide_type_descriptions(accumulator: &mut TDC) { diff --git a/framework/meta-lib/src/contract/generate_proxy/proxy_gen_main.rs b/framework/meta-lib/src/contract/generate_proxy/proxy_gen_main.rs index bcd425ae84..44165b6c29 100644 --- a/framework/meta-lib/src/contract/generate_proxy/proxy_gen_main.rs +++ b/framework/meta-lib/src/contract/generate_proxy/proxy_gen_main.rs @@ -11,6 +11,13 @@ const PROXY_COMPARE_ERR_MSG: &str = "Contract has been modified and proxies have impl MetaConfig { pub fn generate_proxy(&mut self) { + if self.sc_config.proxy_configs.is_empty() { + let proxy_config_default = + ProxyConfig::new_with_default_path(self.original_contract_abi.clone()); + write_proxy_with_explicit_path(&proxy_config_default, &self); + return; + } + for proxy_config in &self.sc_config.proxy_configs { write_proxy_with_explicit_path(proxy_config, self); } From 6bacb2904cb4d4125edf528e8fd796cab85b1f30 Mon Sep 17 00:00:00 2001 From: BiancaIalangi Date: Wed, 14 Aug 2024 20:28:45 +0300 Subject: [PATCH 29/29] proxy gen - clippy --- .../meta-lib/src/contract/generate_proxy/proxy_gen_main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/meta-lib/src/contract/generate_proxy/proxy_gen_main.rs b/framework/meta-lib/src/contract/generate_proxy/proxy_gen_main.rs index 44165b6c29..4977e41d30 100644 --- a/framework/meta-lib/src/contract/generate_proxy/proxy_gen_main.rs +++ b/framework/meta-lib/src/contract/generate_proxy/proxy_gen_main.rs @@ -14,7 +14,7 @@ impl MetaConfig { if self.sc_config.proxy_configs.is_empty() { let proxy_config_default = ProxyConfig::new_with_default_path(self.original_contract_abi.clone()); - write_proxy_with_explicit_path(&proxy_config_default, &self); + write_proxy_with_explicit_path(&proxy_config_default, self); return; }