From 3b3f964cc1cdf2a48d40f17c83e7ebb7c03fd212 Mon Sep 17 00:00:00 2001 From: GeorgiosDelkos Date: Wed, 18 Sep 2024 18:21:46 +0300 Subject: [PATCH] Profiling feature --- Cargo.lock | 147 ++++++++++++++---- forc-pkg/Cargo.toml | 8 +- forc-pkg/src/pkg.rs | 57 ++++++- forc/Cargo.toml | 1 + sway-core/Cargo.toml | 9 +- sway-core/src/asm_generation/finalized_asm.rs | 18 +++ .../src/asm_generation/fuel/data_section.rs | 6 +- sway-core/src/asm_generation/mod.rs | 3 +- sway-core/src/lib.rs | 8 +- sway-ir/Cargo.toml | 2 + sway-ir/src/irtype.rs | 2 +- sway-utils/src/performance.rs | 49 ++++-- .../test_projects/storage_namespace/Forc.lock | 16 +- 13 files changed, 264 insertions(+), 62 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fa916f92d40..8ac462de1af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2023,7 +2023,7 @@ dependencies = [ "forc-tracing 0.63.5", "forc-util", "fs_extra", - "fuel-asm", + "fuel-asm 0.56.0", "hex", "rexpect 0.5.0", "serde", @@ -2125,7 +2125,7 @@ dependencies = [ "forc-test", "forc-tracing 0.63.5", "fuel-core-client", - "fuel-types", + "fuel-types 0.56.0", "fuel-vm", "portpicker", "rayon", @@ -2203,6 +2203,7 @@ dependencies = [ "forc-tracing 0.63.5", "forc-util", "fuel-abi-types", + "fuel-asm 0.57.0", "futures", "git2", "gix-url", @@ -2218,6 +2219,7 @@ dependencies = [ "serde_with", "sway-core", "sway-error", + "sway-ir", "sway-types", "sway-utils", "sysinfo", @@ -2275,7 +2277,7 @@ dependencies = [ "devault", "forc-util", "fuel-tx", - "fuel-types", + "fuel-types 0.56.0", "serde", "serde_json", "thiserror", @@ -2319,7 +2321,7 @@ dependencies = [ "eth-keystore", "forc-tracing 0.47.0", "fuel-crypto", - "fuel-types", + "fuel-types 0.56.0", "fuels", "fuels-core", "futures", @@ -2397,7 +2399,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "122c27ab46707017063bf1c6e0b4f3de881e22e81b4059750a0dc95033d9cc26" dependencies = [ "bitflags 2.6.0", - "fuel-types", + "fuel-types 0.56.0", + "serde", + "strum 0.24.1", +] + +[[package]] +name = "fuel-asm" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b29ea55a794c00d0dfaad06f11720a05fa928603f812dca1c38163f2b240860a" +dependencies = [ + "bitflags 2.6.0", + "fuel-types 0.57.0", "serde", "strum 0.24.1", ] @@ -2543,7 +2557,7 @@ dependencies = [ "coins-bip39", "ecdsa", "ed25519-dalek", - "fuel-types", + "fuel-types 0.56.0", "k256", "lazy_static", "p256", @@ -2566,6 +2580,18 @@ dependencies = [ "synstructure 0.13.1", ] +[[package]] +name = "fuel-derive" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03509567813a351ca60d8507b2ac476b06c1590f2e9edbe72bc205bb04e0af12" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", + "synstructure 0.13.1", +] + [[package]] name = "fuel-ethabi" version = "18.0.0" @@ -2643,10 +2669,10 @@ dependencies = [ "bitflags 2.6.0", "derivative", "derive_more", - "fuel-asm", + "fuel-asm 0.56.0", "fuel-crypto", "fuel-merkle", - "fuel-types", + "fuel-types 0.56.0", "hashbrown 0.14.5", "itertools 0.10.5", "postcard", @@ -2663,12 +2689,23 @@ version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b6fb26bcb408b6897e603f68cf60bbbaf6d15381c99f54a69ea743a58235ac1" dependencies = [ - "fuel-derive", + "fuel-derive 0.56.0", "hex", "rand", "serde", ] +[[package]] +name = "fuel-types" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f196060a10db0293cdfca455f7e2f3a7914f46f25e0fbc2d28cf0a11e835a86" +dependencies = [ + "fuel-derive 0.57.0", + "hex", + "serde", +] + [[package]] name = "fuel-vm" version = "0.56.0" @@ -2682,12 +2719,12 @@ dependencies = [ "derivative", "derive_more", "ethnum", - "fuel-asm", + "fuel-asm 0.56.0", "fuel-crypto", "fuel-merkle", "fuel-storage", "fuel-tx", - "fuel-types", + "fuel-types 0.56.0", "hashbrown 0.14.5", "itertools 0.10.5", "libm", @@ -2733,7 +2770,7 @@ dependencies = [ "fuel-core-types", "fuel-crypto", "fuel-tx", - "fuel-types", + "fuel-types 0.56.0", "fuels-core", "itertools 0.12.1", "rand", @@ -2770,13 +2807,13 @@ dependencies = [ "bech32", "chrono", "fuel-abi-types", - "fuel-asm", + "fuel-asm 0.56.0", "fuel-core-chain-config", "fuel-core-client", "fuel-core-types", "fuel-crypto", "fuel-tx", - "fuel-types", + "fuel-types 0.56.0", "fuel-vm", "fuels-macros", "hex", @@ -2809,9 +2846,9 @@ checksum = "3288fc4b64e8f93a39b8ffa36fcaef8753232ffda5399662d28e24c172a7d00c" dependencies = [ "async-trait", "fuel-abi-types", - "fuel-asm", + "fuel-asm 0.56.0", "fuel-tx", - "fuel-types", + "fuel-types 0.56.0", "fuels-accounts", "fuels-core", "itertools 0.12.1", @@ -2833,7 +2870,7 @@ dependencies = [ "fuel-core-types", "fuel-crypto", "fuel-tx", - "fuel-types", + "fuel-types 0.56.0", "fuels-accounts", "fuels-core", "futures", @@ -3556,7 +3593,7 @@ dependencies = [ "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.52.0", ] [[package]] @@ -6381,18 +6418,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.208" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.208" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", @@ -6874,6 +6911,7 @@ dependencies = [ "dirs 3.0.2", "either", "fuel-abi-types", + "fuel-asm 0.57.0", "fuel-ethabi", "fuel-etk-asm", "fuel-etk-ops", @@ -6937,6 +6975,7 @@ dependencies = [ "peg", "prettydiff 0.6.4", "rustc-hash", + "serde", "slotmap", "sway-ir-macros", "sway-types", @@ -7041,7 +7080,7 @@ name = "sway-types" version = "0.63.5" dependencies = [ "bytecount", - "fuel-asm", + "fuel-asm 0.56.0", "fuel-crypto", "fuel-tx", "indexmap 2.4.0", @@ -7181,17 +7220,16 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.29.11" +version = "0.31.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd727fc423c2060f6c92d9534cef765c65a6ed3f428a03d7def74a8c4348e666" +checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be" dependencies = [ - "cfg-if 1.0.0", "core-foundation-sys", "libc", + "memchr", "ntapi", - "once_cell", "rayon", - "winapi", + "windows", ] [[package]] @@ -8350,6 +8388,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core 0.57.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -8359,6 +8407,49 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.45.0" diff --git a/forc-pkg/Cargo.toml b/forc-pkg/Cargo.toml index e9004882fe6..883f3ca9ef3 100644 --- a/forc-pkg/Cargo.toml +++ b/forc-pkg/Cargo.toml @@ -41,9 +41,13 @@ tracing = "0.1" url = { version = "2.2", features = ["serde"] } vec1 = "1.8.0" walkdir = "2" +fuel-asm = { version = "0.57.0", features = ["serde"] } +sway-ir = { version = "0.63.5", path = "../sway-ir" } +sysinfo = { version = "0.31.4", optional = true } [dev-dependencies] regex = "^1.10.2" -[target.'cfg(not(target_os = "macos"))'.dependencies] -sysinfo = "0.29" +[features] +default = ["dep:sysinfo"] +profile = [] diff --git a/forc-pkg/src/pkg.rs b/forc-pkg/src/pkg.rs index 2dbbc45f20d..ac38a78c524 100644 --- a/forc-pkg/src/pkg.rs +++ b/forc-pkg/src/pkg.rs @@ -1785,6 +1785,7 @@ pub fn compile( // First, compile to an AST. We'll update the namespace and check for JSON ABI output. let ast_res = time_expr!( + pkg.name, "compile to ast", "compile_to_ast", sway_core::compile_to_ast( @@ -1823,6 +1824,7 @@ pub fn compile( } let asm_res = time_expr!( + pkg.name, "compile ast to asm", "compile_ast_to_asm", sway_core::ast_to_asm(&handler, engines, &programs, &sway_build_config), @@ -1837,6 +1839,7 @@ pub fn compile( let mut program_abi = match pkg.target { BuildTarget::Fuel => { let program_abi_res = time_expr!( + pkg.name, "generate JSON ABI program", "generate_json_abi", fuel_abi::generate_program_abi( @@ -1875,6 +1878,7 @@ pub fn compile( }; let abi = time_expr!( + pkg.name, "generate JSON ABI program", "generate_json_abi", evm_abi::generate_abi_program(typed_program, engines), @@ -1899,15 +1903,16 @@ pub fn compile( .map(|finalized_entry| PkgEntry::from_finalized_entry(finalized_entry, engines)) .collect::>()?; - let asm = match asm_res { + let mut asm = match asm_res { Err(_) => return fail(handler), Ok(asm) => asm, }; let bc_res = time_expr!( + pkg.name, "compile asm to bytecode", "compile_asm_to_bytecode", - sway_core::asm_to_bytecode(&handler, asm, source_map, engines.se(), &sway_build_config), + sway_core::asm_to_bytecode(&handler, &mut asm, source_map, engines.se(), &sway_build_config), Some(sway_build_config.clone()), metrics ); @@ -1957,6 +1962,54 @@ pub fn compile( warnings, metrics, }; + + #[cfg(feature = "profile")] + { + use sway_core::asm_generation::Entry; + + let mut bytes = compiled_package.bytecode.bytes.clone(); + let data_offset = u64::from_be_bytes(bytes.iter().skip(8).take(8).cloned().collect::>().try_into().unwrap()); + let data_section_size = bytes.len() as u64 - data_offset; + bytes.truncate(data_offset as usize); + + let mut data_section_used = 0u64; + + fn calculate_entry_size(entry: &Entry) -> u64 { + let padding = match &entry.padding { + sway_ir::Padding::Left { target_size } => target_size, + sway_ir::Padding::Right { target_size } => target_size, + }; + + let value_size = match &entry.value { + sway_core::asm_generation::Datum::Byte(_) => 1, + sway_core::asm_generation::Datum::Word(_) => 8, + sway_core::asm_generation::Datum::ByteArray(byte_array) => byte_array.len() as u64, + sway_core::asm_generation::Datum::Slice(slice) => slice.len() as u64, + sway_core::asm_generation::Datum::Collection(entries) => entries.iter().map(calculate_entry_size).sum(), + }; + + assert_eq!(*padding as u64, value_size); + + value_size + } + + for entry in &asm.0.data_section.value_pairs { + data_section_used += calculate_entry_size(entry); + } + + let asm_information = sway_core::asm_generation::AsmInformation { + bytecode_size: bytes.len() as _, + data_section: sway_core::asm_generation::DataSectionInformation { + size: data_section_size, + used: data_section_used, + value_pairs: asm.0.data_section.value_pairs + } + }; + + println!("/forc-perf info {}", serde_json::to_string(&asm_information).unwrap()); + } + + Ok(compiled_package) } diff --git a/forc/Cargo.toml b/forc/Cargo.toml index 00e1dc3af76..352c0353345 100644 --- a/forc/Cargo.toml +++ b/forc/Cargo.toml @@ -51,6 +51,7 @@ whoami = "1.1" default = [] test = [] util = [] +profile = [] uwu = ["uwuify"] [dev-dependencies] diff --git a/sway-core/Cargo.toml b/sway-core/Cargo.toml index 986a1b015b5..4e128eb3859 100644 --- a/sway-core/Cargo.toml +++ b/sway-core/Cargo.toml @@ -49,9 +49,12 @@ thiserror = "1.0" tracing = "0.1" uint = "0.9" vec1 = "1.8.0" - -[target.'cfg(not(target_os = "macos"))'.dependencies] -sysinfo = "0.29.0" +fuel-asm = "0.57.0" +sysinfo = { version = "0.31.4", optional = true } [lints.clippy] iter_over_hash_type = "deny" + +[features] +default = ["dep:sysinfo"] +profile = [] diff --git a/sway-core/src/asm_generation/finalized_asm.rs b/sway-core/src/asm_generation/finalized_asm.rs index 9c2d3f565ab..0a8a8c56b9f 100644 --- a/sway-core/src/asm_generation/finalized_asm.rs +++ b/sway-core/src/asm_generation/finalized_asm.rs @@ -20,6 +20,24 @@ use sway_types::SourceEngine; use either::Either; use std::{collections::BTreeMap, fmt}; +/// Represents an ASM set which has had register allocation, jump elimination, and optimization +/// applied to it +#[derive(Clone, serde::Serialize)] +pub struct AsmInformation { + pub bytecode_size: u64, + pub data_section: DataSectionInformation, +} + +#[derive(Default, Clone, Debug, serde::Serialize)] +pub struct DataSectionInformation { + /// The total size of the data section in bytes + pub size : u64, + /// The used size of the data section in bytes + pub used: u64, + /// The data to be put in the data section of the asm + pub value_pairs: Vec, +} + /// Represents an ASM set which has had register allocation, jump elimination, and optimization /// applied to it #[derive(Clone)] diff --git a/sway-core/src/asm_generation/fuel/data_section.rs b/sway-core/src/asm_generation/fuel/data_section.rs index 3db12443f4f..b2bb5eb02c5 100644 --- a/sway-core/src/asm_generation/fuel/data_section.rs +++ b/sway-core/src/asm_generation/fuel/data_section.rs @@ -4,7 +4,7 @@ use std::{fmt, iter::repeat}; // An entry in the data section. It's important for the size to be correct, especially for unions // where the size could be larger than the represented value. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, serde::Serialize)] pub struct Entry { pub value: Datum, pub padding: Padding, @@ -13,7 +13,7 @@ pub struct Entry { pub name: Option, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, serde::Serialize)] pub enum Datum { Byte(u8), Word(u64), @@ -208,7 +208,7 @@ impl fmt::Display for DataId { } } -#[derive(Default, Clone, Debug)] +#[derive(Default, Clone, Debug, serde::Serialize)] pub struct DataSection { /// the data to be put in the data section of the asm pub value_pairs: Vec, diff --git a/sway-core/src/asm_generation/mod.rs b/sway-core/src/asm_generation/mod.rs index 3e2a78bfda5..38e6839e306 100644 --- a/sway-core/src/asm_generation/mod.rs +++ b/sway-core/src/asm_generation/mod.rs @@ -10,7 +10,8 @@ pub mod fuel; pub mod instruction_set; mod finalized_asm; -pub use finalized_asm::{CompiledBytecode, FinalizedAsm, FinalizedEntry}; +pub use finalized_asm::*; +pub use fuel::data_section::{Datum, Entry}; #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum ProgramKind { diff --git a/sway-core/src/lib.rs b/sway-core/src/lib.rs index c744255156d..7942523f1b1 100644 --- a/sway-core/src/lib.rs +++ b/sway-core/src/lib.rs @@ -750,6 +750,7 @@ pub fn compile_to_ast( // Parse the program to a concrete syntax tree (CST). let parse_program_opt = time_expr!( + package_name, "parse the program to a concrete syntax tree (CST)", "parse_cst", parse(input, handler, engines, build_config), @@ -774,6 +775,7 @@ pub fn compile_to_ast( // Type check (+ other static analysis) the CST to a typed AST. let typed_res = time_expr!( + package_name, "parse the concrete syntax tree (CST) to a typed AST", "parse_ast", parsed_to_ast( @@ -982,7 +984,7 @@ pub fn compile_to_bytecode( source_map: &mut SourceMap, package_name: &str, ) -> Result { - let asm_res = compile_to_asm( + let mut asm_res = compile_to_asm( handler, engines, input, @@ -990,13 +992,13 @@ pub fn compile_to_bytecode( build_config, package_name, )?; - asm_to_bytecode(handler, asm_res, source_map, engines.se(), build_config) + asm_to_bytecode(handler, &mut asm_res, source_map, engines.se(), build_config) } /// Given the assembly (opcodes), compile to [CompiledBytecode], containing the asm in bytecode form. pub fn asm_to_bytecode( handler: &Handler, - mut asm: CompiledAsm, + asm: &mut CompiledAsm, source_map: &mut SourceMap, source_engine: &SourceEngine, build_config: &BuildConfig, diff --git a/sway-ir/Cargo.toml b/sway-ir/Cargo.toml index 44ed847ca70..45e2270f259 100644 --- a/sway-ir/Cargo.toml +++ b/sway-ir/Cargo.toml @@ -22,6 +22,8 @@ slotmap = "1.0.7" sway-ir-macros = { version = "0.63.5", path = "sway-ir-macros" } sway-types = { version = "0.63.5", path = "../sway-types" } sway-utils = { version = "0.63.5", path = "../sway-utils" } +serde = { version = "1", features = ["derive"] } + [lints.clippy] iter_over_hash_type = "deny" diff --git a/sway-ir/src/irtype.rs b/sway-ir/src/irtype.rs index 1211c1da6fe..151a52903a7 100644 --- a/sway-ir/src/irtype.rs +++ b/sway-ir/src/irtype.rs @@ -642,7 +642,7 @@ impl TypeSize { /// the value in aggregates. E.g., in an array of `u8`, each `u8` is "padded" /// to its size of one byte while as a struct field, it will be right padded /// to 8 bytes. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, serde::Serialize)] pub enum Padding { Left { target_size: usize }, Right { target_size: usize }, diff --git a/sway-utils/src/performance.rs b/sway-utils/src/performance.rs index cbf53cc5510..ed9186bf1ec 100644 --- a/sway-utils/src/performance.rs +++ b/sway-utils/src/performance.rs @@ -14,35 +14,62 @@ pub struct PerformanceData { pub reused_programs: u64, } +#[derive(serde::Serialize, Clone)] +pub struct FunctionEntryPoint { + /// The original entry point function name. + pub fn_name: String, + /// The immediate instruction offset at which the entry function begins. + pub imm: u64, + /// The function selector (only `Some` for contract ABI methods). + pub selector: Option<[u8; 4]>, +} + #[macro_export] // Time the given expression and print/save the result. macro_rules! time_expr { - ($description:expr, $key:expr, $expression:expr, $build_config:expr, $data:expr) => {{ + ($pkg_name:expr, $description:expr, $key:expr, $expression:expr, $build_config:expr, $data:expr) => {{ + use std::io::{BufRead, Read, Write}; + #[cfg(feature = "profile")] + if let Some(cfg) = $build_config { + println!("/forc-perf start {} {}", $pkg_name, $description); + let output = { $expression }; + println!("/forc-perf stop {} {}", $pkg_name, $description); + output + } else { + $expression + } + + #[cfg(not(feature = "profile"))] if let Some(cfg) = $build_config { if cfg.time_phases || cfg.metrics_outfile.is_some() { let expr_start = std::time::Instant::now(); + let output = { $expression }; + let elapsed = expr_start.elapsed(); + if cfg.time_phases { - println!(" Time elapsed to {}: {:?}", $description, elapsed); + println!(" Time elapsed for {}: {:?}", $description, elapsed); } + if cfg.metrics_outfile.is_some() { - #[cfg(not(target_os = "macos"))] let memory_usage = { - use sysinfo::{System, SystemExt}; - let mut sys = System::new(); - sys.refresh_system(); + let mut sys = sysinfo::System::new_with_specifics( + sysinfo::RefreshKind::new() + .with_memory(sysinfo::MemoryRefreshKind::everything()), + ); + sys.refresh_memory(); + Some(sys.used_memory()) }; - #[cfg(target_os = "macos")] - let memory_usage = None; - + $data.metrics.push(PerformanceMetric { phase: $key.to_string(), elapsed: elapsed.as_secs_f64(), - memory_usage, + memory_usage: None, }); } + output } else { $expression @@ -51,4 +78,4 @@ macro_rules! time_expr { $expression } }}; -} +} \ No newline at end of file diff --git a/test/src/sdk-harness/test_projects/storage_namespace/Forc.lock b/test/src/sdk-harness/test_projects/storage_namespace/Forc.lock index 82663a8af57..1356297a22d 100644 --- a/test/src/sdk-harness/test_projects/storage_namespace/Forc.lock +++ b/test/src/sdk-harness/test_projects/storage_namespace/Forc.lock @@ -1,13 +1,13 @@ [[package]] -name = 'core' -source = 'path+from-root-37E4B1588712FA61' +name = "core" +source = "path+from-root-7819628DC0499FA1" [[package]] -name = 'std' -source = 'path+from-root-37E4B1588712FA61' -dependencies = ['core'] +name = "std" +source = "path+from-root-7819628DC0499FA1" +dependencies = ["core"] [[package]] -name = 'storage_namespace' -source = 'member' -dependencies = ['std'] +name = "storage_namespace" +source = "member" +dependencies = ["std"]